데이터베이스 개발자 질문과 답변 게시판
안녕하세요
답답해서 질문 올립니다.
모든 프로그램을 VB + Sql server 2008을 이용해서 StoredProcedure(이하 SP)로 작성을 했습니다.
그런데 간혹 몇몇 SP들이 VB에서 실행을 하면 동작을 안합니다.
하지만 이쿼리를 뽑아서 exec sp_xxxx '', '','' ;이런쿼리
SSMS에서 실행을 하면 바로 나온다는 거죠.. ㅠ.ㅠ
글구 또 한가지.
이SP문을 컴파일 하거나 drop 후 Create하면 VB.NET에서 실행하면 바로 결과가 나온다는 겁니다.
혹시 경험이 있으시거나 혹은 검토해봐야할 사항이나 뭐 아무거나 좋습니다.
꼭좀 부탁드립니다.
감사합니다.
Comment 7
-
맨즈밤
2013.05.13 17:52
-
catchv
2013.05.13 18:39
동작을 안한다라는 의미가 정확하지 않아서 정확한 내용을 알 수 가 없습니다.
(에러가 나는 것인지? Execute 함수에서 멈추는 것인지? 결과가 없는 것인지?)
VB.NET은 잘 모르지만 C#의 경우 try{} catch(Exception ex) { ~~~~ ex.Tostring(); }
(같은 .NET 언어니깐 VB.NET에도 TRY CATCH 비슷한 것이 있을 것으로 판단됩니다.)
으로 거의 모든 에러 상태를 알 수 있습니다.
안되는 부분에 예외를 걸어서 정확한 에러를 올리시면 여기 많은 고수분들이 도와 주실 수 있을 것 같습니다.
-
minsouk
2013.05.13 20:42
컴파일이나 drop create 후 돌아간다는 걸로 봐서 실행계획 문제가 아닐까요?
아주 일반적인 사나리오는, 제가 10년치 데이터가 있어요, 그런데 SSMS 에서 1일치만 다른 데이터와 조인해 sum 을 뽑는다 라고 생각 했을 때 1일치를 구하는 쿼리 플랜으로(NL 조인 등) 순식간에 결과를 리턴 합니다. 그런데, 실제 app 에서는 10년치를 sum join 해야 한다면, 1일치 구하는 방법(NL join)으로 구하면 성능이 똑바로 나오지 않습니다. 아예 app 은 응답이 없는것 처럼 보일 겁니다. 이 때는 다른 join 전략으로 구해야 겠지요. 그런데 drop create 하고 바로 10년치를 처음 쿼리하면 10년치 데이터를 최적으로 구하는 실행계획을 구합니다. 그러니 데이터가 또 나옵니다. 이 때 한번 데이터가 나오고 나면(최초 컴파일을 10년치 구하는 변수로 app 에서 컴파일 함) ssms 에서도 1일치 데이터가 아까 1일치 변수로 컴파일 한 계획 보다는 느리지만 문제없이 또 잘 나옵니다.
이럴경우 해당 procedure 나 statement 에 recompile 옵션을 명시해 보세요. 혹은 10년치를 구한다고 아예 optimize for 힌트를 이용해 보세요 항상 예측가능한 쿼리 응답성능을 구할 수 있을 겁니다.
증명하는 방법은 간단합니다. drop create 후 ssms 에서 변수 없이(제가 설명한 것에서 1일치를 구한다는) 예상실행 계획과 app에서 돌린 실제 실행 계획이 같은지 비교하면 됩니다.
성능 문제는 언제든지 24 * 7 문의주시면 무료로 명확히 원인을 밝혀 드립니다. 네이버 japan 메신저 line 에 minsouk1 친구 추가 하시고 물어주세요. (무료 입니다.)
-
쓸만한게없네(윤선식)
2013.05.14 01:18
소고기값이나 술값은 들어갈 수 있는.
쿨럭...
-
minsouk
2013.05.14 01:56
흠....16일날 돈 마이들고 오시게... -
Alucard(강산아)
2013.05.13 20:51
파리메터 스니핑...
이란 주제로 소설을 살짝... = _=a
-
한정훈_313326
2013.05.14 13:23
답변 감사합니다.
일단 option(recompile)명령을 넣어 놨습니다. 며치 지켜 봐야 겠네요..
감사합니다.
혹시나....SET NOCOUNT ON 붙여보심이....