안녕하세요
테이블 함수로 만들어진 프로그램을 수행했는데
성능이 느려서 프로시져로 다시 만들었더니
속도가 빨라 졌습니다..
왜 그런걸까요?
Comment 9
-
minsouk
2015.10.16 11:06
-
방자
2015.10.16 13:03
너무 간단하게 질문드려 죄송합니다..ㅋㅋ
소스 내용은
FUNC는 WITH 문으로 받은 테이블을 템프 테이블에 INSERT하는내용이고
PROC는 INSERT 대신 바로 SELECT 하는 구문으로 되어 있습니다.
다른 테이블에 넣고 다시 가공하지는 않습니다.
테스트 내용은 아래와 같습니다.
TEST1. 테이블 반환함수 사용하여 TEMP 테이블에 INSERT 후 RETURN 값 반환
SELECT * FROM UFN_TEST('11','AA')
SQL Server 실행 시간:
CPU 시간 = 12839밀리초, 경과 시간 = 12931밀리초TEST2. 프로시저 사용으로 바로 조회함.
EXEC USP_TEST '11','AA'
SQL Server 실행 시간:
CPU 시간 = 26627밀리초, 경과 시간 = 1947밀리초궁금한 건 test2가 경과 시간 대비 cpu를 많이 잡아 먹는데 왜 그런걸까요?
max degree of parallelism = 0 으로 되어 있긴한데..
어짜피 fucn에서도 parallel 하게 돌아가는건데 말이죠...
제가 오라클만 하다 이직하면서 ms-sql을 하고 있는데...
잘 모르는게 많네요...
-
minsouk
2015.10.16 13:26
function 은 병렬처리를 하지 못했고, proc 은 병렬처리를 했군요, 병렬처리 하면 당연히 응답시간은 줄지만 병렬처리를 위해 더 많은 cpu 를 씁니다. 이제 이해가 가네요. 뭐 이렇게 저렇게 하다가 실력이 느는거죠. 감사합니다. 궁금했는데.
-
방자
2015.10.16 13:47
declare 문으로로 테스트 해서
plan을 봤을때는 병렬처리가 되는걸 확인했구
function 으로 돌렸을때는 plan 확인이 안됐지만
당연히 병렬처리가 되는거라고 생각했었는데요..
궁금한건 function은 병렬처리가 원래 안되는건가요??
-
방자
2015.10.16 16:35
TEST 해본 결과 FUNCTION 에서는 병렬처리가 안되는거 같군요...
1. TEST1 : FUNCTION 실행
max degree of parallelism = 0 상태
SQL Server 실행 시간:
CPU 시간 = 17955밀리초, 경과 시간 = 19997밀리초2. TEST2 : FUNCTION 실행
OPTION (MAXDOP 1)
SQL Server 실행 시간:
CPU 시간 = 17893밀리초, 경과 시간 = 19285밀리초 -
minsouk
2015.10.16 17:15
테스트 방법론이 좀 이상하군요.......
단지 max degree of parallelism 이 0 이라고 강제로 병렬처리를 하지는 않습니다. sql server 에서 어떤 제약으로 인해 병렬처리가 되는지 안되는지 알아볼때는 TF 8649 를 적용해 테스트 합니다.
수고하세요~
-
건우아빠
2015.10.16 18:05
요즘 댓글에 정성이 넘쳐나는듯.....
-
minsouk
2015.10.16 18:54
한가해 졌어요 쿨럭~ 그냥 sql 을 제가 취미로 하다보니....^^;;;
외쿡에는 sql 안하는데 sqlpass 참석도 많이들 하고 직업도 프로그래머가 아닌 사람들이 참 많더라구요.
(넌 직업이 먼데? 나 의사야.......쿨럭~)
-
방자
2015.10.19 10:52
오라클이랑 많이 틀려서 테스트 방법을 잘 모르고 있었습니다...^^
TF 8649 적용해서 테스트를 할려고 구글링을 해서
테스트를 해보니 테이블 변수를 사용할경우 병렬처리가 안되네요..
감사합니다~
참고 : http://www.theboreddba.com/Categories/FunWithFlags/Forcing-Parallelism-(TF-8649).aspx
쿼리문과 프로파일러 로그를 좀 보여주세요. func 냐 proc 냐 에 따라 실행속도가 틀리고 그렇지는 않을듯 하고 해당 경우에 차이가 날수 있는지 실제 얼마나 차이가 나는지 숫자와 팩트를 보면서 알아 나가면 좋을듯 합니다.
엔지니어는 빠르다 느리다가 아니라 숫자와 팩트로 이야기 하면 좋습니다. 우리는 배치가 많아.....<- 얼마나 모호한 표현 입니까? 우리는 초당 1000 들어오면 많은건가요? 10만은? 상대방은 알지 못하기에 숫자와 팩트로 표현하는 연습을 하시면 아주 좋습니다. 단위도 꼭 적으시구요 ~ ^^;;
일반적으로 scalar function의 경우는 매 행마다 실행되므로 영향을 받는 행수에 따라 실행 시간이 늘어나게 됩니다. 이는 인라인 펑션이나 applay 절로 바꾸거나 비정규화 방법을 써 튜닝을 하게 됩니다. 질문은 테이블 함수라 어떤 경우인지 정확히 보고 느려진다면 왜 느려지는지 알 수 있다면 설명 드리도록 하겠습니다.
단순한 테스트는 같습니다. 어디다 넣고 다시 빼는 작업을 하신건 아닌지....20만건 있는 테이블 입니다.
SQL Server 실행 시간:
CPU 시간 = 139ms, 경과 시간 = 58ms
SQL Server 실행 시간:
CPU 시간 = 139ms, 경과 시간 = 58ms