환경 : 윈도우2003, SQL2000
내용
관리자 : SA
사용자 : USER
쿼리분석기에서 SA로 프로시져를 실행할 경우 3초정도 걸리던 쿼리문이 USER로 실행할 경우 7초정도 소요가 됩니다.
응용프로그램에서는 USER로 접속할 경우 런타임오류가 발생하는 경우도 있습니다.
서버에는 DB명이 두 개 있습니다.
DB1, DB2
쿼리문은 아래와 같습니다
아래와 같이 쿼리문을 만들고 sa실행 하였을 때와, user로 실행하였을 때 속도차이가 두배로 나타납니다.
프로시져명 : Usp_statics_List
프로시져 실행은 DB2에서 하였습니다.
SELECT or_company, or_ID, deDay, SUM(saleCost) AS saleCost, SUM(taxSum) AS taxSum, SUM(vatSum) AS vatSum, SUM(exemptionSum) AS exemptionSum, SUM(totSum) AS totSum, SUM(account) AS account, SUM(remainderPay) AS remainderPay FROM ( SELECT or_company, or_ID, DATEPART(@DPart, or_deDay) AS deDay, 0
AS saleCost, SUM(CASE WHEN ca_tax = 't' THEN CONVERT(MONEY, (ca_saleCost * ca_Ea)) ELSE 0 END) AS taxSum, ISNULL(SUM(CASE WHEN ca_tax = 't' THEN ca_VAT * ca_Ea ELSE 0 END), 0) AS vatSum, SUM(CASE WHEN ca_tax = 'b' THEN CONVERT(MONEY, (ca_saleCost + ca_vat) * ca_Ea) ELSE 0 END) AS exemptionSum, ISNULL(SUM(CONVERT(MONEY, (ca_saleCost + ca_vat) * ca_Ea)), 0) AS totSum,
SUM(or_account) AS account, remainderPay = (SELECT SUM(or_totpay - or_account) FROM B2BDB.dbo.B2BOrder_TB WHERE or_id = Main.or_ID AND DATEPART(@DPart, or_deDay) <= DATEPART(@DPart, Main.or_deDay) AND or_deDay LIKE @YY%) FROM DB2.dbo.B2BOrder_TB Main LEFT JOIN DB2.dbo.B2BCart_TB ON ca_Session=or_Session WHERE (ca_goodsCode > 'K3010030' OR ca_goodsCode < 'K3010030' OR ca_goodsCode IS NULL) AND or_buyNsaletag = 'b' AND or_balDay = 'Y' AND REPLACE(or_Company, ' ', '') LIKE '%@Company%' AND or_deDay LIKE @YY% GROUP BY or_company, or_ID, DATEPART(@DPart, or_deDay) UNION ALL SELECT go_info, go_id, deDay, SUM(saleCost), taxsum, vatsum, exemptionSum, totSum, account, remainderPay FROM ( SELECT go_info, go_id, DATEPART(@DPart, or_deDay) AS deDay, SUM((ca_salecost + ca_vat) * ca_ea) AS saleCost, 0
AS taxsum, 0
AS vatsum, 0
AS exemptionSum, 0
AS totSum, 0
AS account, 0
AS remainderPay FROM dbo.B2BCart_TB => 이 부분을 DB2.dbo.B2BCart_TB JOIN DB1.dbo.Goods_TB ON go_goodscode = ca_goodscode JOIN dbo.B2BOrder_TB => 이 부분을 DB2.dbo.B2BOrder_TB ON or_session = ca_session JOIN DB1.dbo.Company_TB ON co_ID = or_ID WHERE co_CompanyChk IN('A','D') AND or_deDay LIKE @YY% AND
or_buyNsaletag =
's' AND go_info LIKE %@Company% GROUP BY go_info, go_id, DATEPART(@DPart, or_deDay) UNION ALL SELECT go_info, go_id, DATEPART(@DPart, or_date) AS deDay, SUM(ca_cost * ca_ea), 0, 0, 0, 0, 0, 0 FROM DB1.dbo.Cart_TB JOIN DB1.dbo.Goods_TB ON go_goodscode = ca_goodscode JOIN DB1.dbo.Order_TB ON or_session = ca_session WHERE or_date LIKE @YY% AND go_info LIKE %@Company% GROUP BY go_info, go_id, DATEPART(@DPart, or_date) ) SaleTable GROUP BY go_info, go_id, deDay, taxsum, vatsum, exemptionSum, totSum, account, remainderPay ) X GROUP BY or_company, or_ID, deDay ORDER BY deDay OPTION (LOOP JOIN)
빨간색 부분을 수정 해 주니 user로 접속하여 쿼리를 하여도 sa접속한 것과 같이 동일한 속도로 실행이 되었습니다. 어떤 이유에서 이런 현상이 나타나는지? 원격접속에서만 차이가 나고, 서버에 접속하여 실행하였을 때에는 동일한 속도가 나왔습니다.
Comment 23
-
minsouk
2015.10.05 13:16
-
팔개
2015.10.05 13:47
sql2000에서는 실행계획을 저장하는 기능이 없는지, 아니면 제가 찾지를 못하는지?
화면을 캡쳐하기에는 너무 커서..
어떻게 해야할지를 모르겠네요..
-
minsouk
2015.10.05 14:59
2000 이군요....text 로 저장하면 가능은 하죠....
-
팔개
2015.10.05 15:49
이상하게 지금은 처리속도가 정상(?)으로 처리가 됩니다.
sa로 처리 하였을때와 user로 처리하였을 동일한 속도록 나타나며, 실행계획도 비슷한것 같습니다.
혹, 몰라서 현재의 상태를 올려드립니다.
-
minsouk
2015.10.05 16:14
옆에 있는 아이들(컬럼)이 더 중요합니다. 쿨럭~
-
팔개
2015.10.05 17:05
sql2008에서 2000으로 접속한 다음 실행계획을 보았을때에는 나타나지 않던 부분이 2000분석기에서 실행을 하니
여러가지 항목들이 나타나네요..
이렇게 올려 드리면 되는건지 모르겠네요.
이런 부분에는 익숙하지 않아서.. ;;
-
루디먼트
2015.10.05 18:43
혹시, 그래픽 실행계획 화면에서 마우스 우클릭하면 "실행계획 xml 표시" 없나요?
결과를 저장해서 올려주시면 보는데 도움이 더 될것 같습니다.
-
팔개
2015.10.06 00:50
sql2008에서는 xml기능이 있는데, sql2000에서는 그런 기능이 없네요..
버젼이 올라가면서 지원하는것 같아요..
-
minsouk
2015.10.08 01:21
excel 로 좀 담아서 볼수 있게 올려주면 더 좋지 않을까요 ^^* -
팔개
2015.10.09 19:56
엑셀파일을 압축하여 쉬트2개로 나누어 다시 올려 드립니다.
엑셀로 바로 올리려고 하니, 에러가 발생되네요..
-
minsouk
2015.10.11 13:47
1. 3part name 일때는 속도가 같다라고 했죠?
sa 나 user 모두 3part name 쿼리를 올려준거 같은데요. 실행시간도 같고 플랜도 같다는 거지요?
자 이제 수행 시간이 다른걸 올려주세요 -_-
2. 예상 실행 계획을 주셨군요, 보통 이런 문제가 있는 상황에서는 실제 실행계획을 올립니다.
일단 예상 실행 계획은 같습니다. 그럼 실제 실행 계획은 뭐가 틀릴수 있는가?
네, 틀릴 수 있습니다.
SQL Server는 내부 리소스 상황에 따라 예상 실행 계획을 수행 할 수 없을수 있으며, 이때는 조금 실행계획이 틀려질 수 있습니다.
예들들면
병렬쿼리인데, 내부는 1개의 thread로 실제로 수행되었다던지
메모리가 부족할 때 메모리 사이즈를 다르게 수행 했다던지
참고로 학원에서 예전에 예상과 실제 계획은 항상 같다고 얼마나 설명을 하던지.......-_- 아까운 내 시간들...(틀립니다.)
실제 실행계획을 잡아 excel 로 올려주세요~
수고하세요~
-
팔개
2015.10.11 19:47
SET SHWOPLAL_ALL ON
이렇게 한 다음 실행버튼(f5)키를 누르면 실행계획이 자동으로 출력이 되는줄 알았는데 그게 아니네요..
죄송합니다 ;;
그리고, 현재는 sa 나 user가 동일한 시간대로 출력이 됩니다.
초기에는 실행시간이 두 배정도 차이가 났는데, 몇 시간후에는 동일하게 처리되었습니다.
그 당시 실행계획표 만드는 방법을 몰라서 지금 확인할 수 없는게 좀 안타까운 마음이 있네요..
현상진행 내용
sa : 운영서버 실행, 원격접속 실행, 웹에서 실행 동일한 시간대 처리
user 초기 : 운영서버에서는 sa와 동일한 시간대, 원격접속은 두 배정도 걸림, 웹에서는 세 배정도 걸림
user 1시간 이후 : 운영서버에서는 sa와 동일한 시간대, 원격접속도 동일한 시간대에 처리, 웹에서는 세 배정도 걸림
user 몇시간 후 : 모든상황이 sa로 접속하였을 때와 동일하게 처리
결과 : 현재는 sa 나 user의 접속시간이 동일합니다.
-
minsouk
2015.10.13 00:28
올려주신 plan 은 예상 실행 계획 이라는 것이구요
실제 실행 계획은 아래와 같이 capture 할 수 있습니다.
현재 플랜은 parallel 이기에 언제든지 실행시간이 틀려질 수 있구요
또 한가지 prefetch 가 쓰였는데 이때는 스토리지 상황에 따라 또 틀릴수 있습니다.
정확하게 보려면 틀리게 나올 때 set statistics profile, io, time on 이라는 것을 먼저 실행하고 플랜을 받아봐 주세요
-
팔개
2015.10.13 11:38
sql2000에서는 아래와 같이 나타나네요..
제가 잘못 한건지, 아니면 버젼에 따라 다른것인지 모르겠네요..
엑셀파일은 다시 첨부하여 올려 드립니다.
-
minsouk
2015.10.13 14:38
네, 이번엔 실제 플랜을 올리셨네요
그래서 이번엔 시간이 틀리게 나왔고 2개 다른 플랜을 올린건가요?
같은 소요시간을 보인 건가요? 플랜은 같습니다.
마지막에 제가 "정확하게 보려면 틀리게 나올 때 set statistics profile, io, time on 이라는 것을 먼저 실행하고 플랜을 받아봐 주세요" 라고 했는데요 시간이 다르게 나올때 저 문장을 먼저 수행 한 후 결과를 모두 복사해서 주세요~ 탭이 2개 일겁니다.
-
팔개
2015.10.13 18:21
현재상황까지의 내용정리 입니다.
1. 처음 글을 올릴당시에는 sa와 user접속할 때 실행속도가 확연하게 차이가 있었습니다.
2. 쿼리문을 확인해보니 일부쿼리에 2part name으로 처리가 되어 있어서 그 부분을 3part name으로 수정 하였습니다.
3. 이 후에는 user로 접속 하더라도 동일한 속도로 처리가 되었습니다.
4. 그래도 원인을 정확하게 모르기 때문에 문제되는 부분을 그대로 두고 진행을 하였습니다.
5. 글을 올리는 중간에도 user속도는 sa속도와 동일하게 처리가 되고 있었으며 별다른 문제점(?)이 발견되지 않았습니다.
6. 그런데, 현재 원격접속으로 진행할 때에는 실행계획에 별 차이가 없는데, 웹에서 처리할 때에는 두 배정도의 시간차가 나타납니다.
웹에서 두 배정도 차이나는 실행계획을 첨부하여 올려 드립니다.
그런데, 실행계획을 비교 하였을때에는 별다른 차이가 없는듯 합니다.
-
minsouk
2015.10.13 19:53
웹에서 받았다고 했는데, 프로파일러로 받은 실제 실행 계획이 아닌듯 한데요
웹서버에서 ssms 로 쿼리 했을때는 시간 차이가 없고 asp 나 .net 으로 쿼리하면 sa 와 일반 user 만 바뀌는데 실행 시간이 틀리다는 거지요? 정확한 진단을 위해서는 프로파일러로 error and warnings 를 다 잡고 실제 실행계획을 잡으면 좋을듯 합니다.
잘 안되면 그냥 연락 주세요 01099670955 입니다.
-
팔개
2015.10.13 20:13
지금까지 내용을 정리하여 혼자서 한 번 내용을 확인해 보도록 하겠습니다.
그래서, 실행계획이 틀릴경우 다시 한 번 여쭈어 보도록 하겠습니다.
지난번에도 한 번 도움(원격접속하여 도움을 주셨습니다)을 받은적이 있었고, 이번에도 이렇게 귀중한 시간을 할 애 해 주셔서 감사합니다.
누군가에게는 기본적인 내용인데, 저에게는 이번에 많은 도움이 되었습니다.
감사합니다 ^.^
그리고, 마지막 내용을 제가 잘못 작성하였네요..
말씀하신것 처럼 웹에서 속도가 틀릴뿐이지 실행계획 자체는 쿼리분석기에서 처리 하였습니다.
-
팔개
2015.10.14 00:15
구글에서 여기저기 확인해 보니, 저와 비슷한 내용이 있는것을 확인 하였습니다.
확인결과 asp에서는 파라메터값이 varchar인데, sp에서는 char값으로 처리가 되면서 웹에서의 실행속도가 차이나는 것을 확인 하였습니다.
민석님께서 가르쳐 주신데로 프로파일러를 실행한 다음 웹에서 해당페이지를 실행하고, 실행계획을 저장하여 분석하려 합니다.
프로파일러도 별로 사용해 본적이 없어서 trc로 저장한 다음, 테이블로 다시 변환하여 필요한 부분만 걸러내서 확인하고 있습니다.
덕분에 많을것을 배웠습니다.
-
minsouk
2015.10.14 23:52
그럼 sa 도 느렸겠지요. 다른 케이스 입니다. 전 원격서버를 쓸 경우 일반유저가 통계를 못 봐 느린 경우 외 이런 경우를 못봐 궁금해서 물어봤구요 재현만 되면 백프로 원인 찾을수 있습니다. 어려워 하지 말고 연락 주세요 ^^;;
-
팔개
2015.10.15 14:18
감사하다는 말씀을 먼저드리며 ^.^..
난처한 상황은 지금은 뭘 어떻게 해 두어도 정상적(?)으로 동작을 하고 있습니다.
그러니깐, 원인을 찾으려면 항상 일괄되게 느려야 하는데, 지금은 2part name으로 처리한 다음 user상태에서 웹으로 실행을 하여도 정상적으로 동작이 되니 참 난감하네요.. ;;
이렇게 되면 원인파악이 어렵지 않을런지?
저에게 민석님의 라인계정이 있습니다.
제 번호는 01087694547 입니다.
집에서 일하기 때문에 편안한 시간대에 연락주세요!!
팀뷰는 10.0 버젼으로 설치되어 있구요..
이전에 문제 되었던 내용을 파일로 정리해 보았습니다.
-
minsouk
2015.10.15 17:38
같이 나오면.........못 찾죠...다르게 나오면 찾을 수 있어요~
저는 sa 나 user 나 같아보이구요, 뭔가 다른원인이 있었을듯 해요 그보단 저 쿼리 튜닝하면 빨라지지 않을까요 ^^;;;;;;;
-
팔개
2015.10.15 18:17
일단은 2part name으로 수정하여, 다시 확인해 보고 있습니다.
그래서 느리게 나올경우 그때 실행계획을 다시 체크해 보려고 합니다.
그리고, 튜닝은 저의 실력이 미흡하여 이 정도가... ;;;;;
다른 두개의 실제실행계획을 올려주세요