쿼리에서 공통되는 부분 함수화 시키기~(함수가 여러 행을 리턴해요) 0 8 2,471

by 박진규 [2010.05.25 15:17:22]


안녕하세요!
오라클 10g XE 구요~
프로시저, 펑션 짜다가 동일한 내용이 너무 많이 나오는게 있는데
함수화 시킬 수 있는지 궁금해 질문합니다.

먼저 다음과 같은 쿼리가 있구요~ 빨간색으로 표시한 부분이 자주 등장하는 부분이라 해두죠.

SELECT * FROM Stars WHERE name IN (SELECT name FROM GirlsGeneration WHERE korean='false')

빨간색의 결과 값을 예로 들자면 

name
----------
jessica
tiffany

정도 되겠구요~
여러 행이 리턴되는데, 컬럼은 항상 하나구요~ 문자 또는 숫자가 나옵니다.
(여기선 문자지만 사실 seq 를 뽑기 위해 쓰는 경우가 많아 거의 대부분 숫자가 나옵니다)

위 쿼리에서 빨간색 부분을 함수화 해 다음과 같이 사용 할 수 있을까요??

SELECT * FROM Stars WHERE name IN (getNameFromGirlsGeneration('false'))

단한개의 값을 반환하는 함수는 잘 되는데
여러행이 리턴되는 경우에는 잘 안되는것 같아요~ㅜ_ㅜ
함수화 시키는게 하는게 가능하다면 getNameFromGirlsGeneration 함수를 어떻게 만들어야 할지 조언 부탁드려요~ __

by camela [2010.05.25 15:51:39]
우선 함수는 리턴값이 하나만 가능하고요..
짧으면 걍 쓰시는게 함수 쓰시는거보다 성능상 좋을거 같네요.

by 마농 [2010.05.25 15:58:09]
다중행 함수도 가능은 하겠지만
http://www.gurubee.net/article/11403

제가 함수를 만든다면 단일행 함수를 다음과 같이 만들겠습니다.
Stars 의 name값을 입력으로 해서 GirlsGeneration 의 korean 을 리턴
FROM Stars
WHERE getKoreanFromGirlsGeneration(name) = 'false'

또한 함수는 개발편의성, 향상성은 좋지만 성능엔 좋지 않습니다.

by 지나가다 [2010.05.25 16:13:48]
또한 대부분 seq를 뽑기위함이면 최대값 또는 최소값을 가져올듯 한데,
그럼 성능부분에서도 index_asc 또는 index_desc를 이용하여 성능개선 하는것이 좋을듯 한데요...^^;

이상 허접한 지나가는 사람이였습니다 ^^;

by 박진규 [2010.05.25 16:28:49]
camela // 사실 별로 짧은 쿼린 아니구요. 계층쿼리를 주로 씁니다. 주로 "어떤 seq의 모든 자식 노드 seq 가져오기" 이런거에요.
마농 // 단일행 함수로 저렇게 쓰는게 가능하겠네요. 사실 저도 성능문제 때문에 저런 방식은 생각조차 안하고 있었는데.. 위와 같은 조건일땐 다중행 함수가 번거롭긴해도 단일행 함수로 하는거 보다 성능상 유리하지 않을까요?
지나가다 // 최대값 최소값 가져오는 경우는 없는것 같네요. 걍 관계있는 항목의 seq 를 뽑아와서 그걸로 또 다른 테이블에서 조회하려는거에요..ㅎㅎ

by camela [2010.05.25 16:56:11]
함수를 사용한다는 자체가 성능상 사용 안했을 때보다 훨씬 떨어진다고 보구요...
(쿼리랑 함수가 분석되어지는 엔진 변경이 일어난다고 알고 있습니다)
특히, select 절이 아닌 where 절에 사용하므로 성능저하가 더 심할거라 생각되어지네요.
함수로 써야된다면 함수 기반 인덱스를 잡는게 좋지 않을까 하는 생각이 드네요.

by 현 [2010.05.25 17:16:40]
제생각엔...
함수를 공부하기 위해서 해보겠다는 것은 말리고 싶지는 않으나,

무엇인가 내가 잘 모르는 것을 하려고 시도할 때에는
왜 그걸 해야 하는지 근거가 분명히 있어야 한다고 생각합니다.
성능? 개발편의성? 폼생폼사??? 잘모르지만 좋을꺼 같아서???

님께서 원하시는 것은 위에 마농님 설명에도 있지만, 테이블 펑션을 사용하면 되긴 합니다만,
그 것을 왜 함수화 시켜야 하는지 이유가 분명히 있어야 합니다.

일단 함수사용으로 인하여 성능저하는 감소하셔야 할 듯 합니다.

by 박진규 [2010.05.25 17:51:36]
함수를 쓰겠다고 박박 우기는거 같아 좀 쑥스럽네요.ㅎㅎ

해당 쿼리가 정형화 되어 있고, 자주 사용되며, 길이도 매번 치기엔 좀 길어서

개발효율과 안정성(오타 혹은 유지보수시 실수등) 높히기 위해선 함수화 시키면 좋겠다는 생각을 했구요~

해당 함수가 들어가는 프로시저는 개발중인 시스템에서 호출 빈도가 별로 안높아서 써도 되겠다 싶었어요.

어느정도 안높냐 하면 한 사람의 관리자가 보는 웹사이트에서 가끔 불러보는 정도.

성능 - 효율, 안정성을 두고 저울질 해보고 내린 결정이랍니다~ ^^

저도 다른 사람이 일반적인 시스템에서 where 절에 함수를 넣겠다고 하면 같은 조언을 할 것 같네요..ㅎㅎ

아무튼 좋은 조언주신 분들 모두 감사합니다! 많은 도움이 되었어요~ ^^

by 박진규 [2010.05.25 18:02:08]
참..결론은 걍 쿼리를 그대로 쓰기로 했습니다. --;
테이블펑션은 타입을 새로 만들어야 하는데 그게 좀 부담스러워서요..ㅠ_ㅠ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입