2011-03-25 2 views
10

쿼리 1 : (빠른 번개)왜 매개 변수를 인수로 전달되는 경우 느리게 실행 sp_executesql을 수행

sp_executesql "select * from tablesView where Id = 1" 

질의 2 : (너무 느린)

sp_executesql "select * from tablesView where Id = @Id", N"@Id int", @Id=1 

tablesView - a view containing multiple joins

LINQ는 항상 쿼리를 Query2 형식으로 변환하므로 성능이 매우 나쁩니다.

질문 : 쿼리 속도가 느려질 경우 이유가 필요하고 해결 방법이있는 경우 해결 방법이 필요합니다. 그리고 LINQ를위한 해결책.

---- 추가 의견 :

성능 저하가 확실히 있기 때문에 순위 기능 (ROW_NUMBER)를 사용하는 2 열입니다하지만 난 그들이 필요를 피할 수 없다.

+0

당신은 ID = 1 행을 많이 가지고 있습니까 :

기사는 어떤 매개 변수 스니핑 설명 여기에있다? –

+0

@Lasse, 50 레코드가 있더라도 그 차이는 엄청납니다. 0 초 vs 10 초, 한 가지는 select * 테이블에서와 같이 일반적으로 많은 조인이있는보기입니다. – WhoIsNinja

+0

'@ id'에 전달 된 데이터 유형은 무엇입니까? 암시 적으로 캐스트를 사용하여 인덱스 사용을 막을 수 있습니다. –

답변

0
  1. 피 SELECT *
  2. ADO.NET 3.5 "파라미터 quessing는"Linq에의 존재를 이용하여 1 = TINYINT 2,345 = SMALLINT 76,357,242 = INT .. ADO.NET 4.0 파라미터 quessing 기본 INT 데이터로 대체 유형 1 = INT, 2335 = INT, 76357242 = INT)
+0

select *를 사용하지 않았습니다. 예를 들면 그랬습니다. – WhoIsNinja

7

내가 여기 사지에 나가서 당신이 행의 많은 경우 ID = 1

그렇지 않은 경우가 있다고 가정거야 제발 날 바로 잡아주세요.

흠, 나는 그가 그 매개 변수에 전달 무슨 일이 일어나고 있는지 궁금해 : SQL Server가 쿼리 속도가 느린 처리되는 것을

한 가지 가능한 이유는 쿼리를 살펴보고가는 것입니다.
1이 될 예정입니까? 내가 gazillion 행에 대해 가지고있는 곳? 난 그냥 3
난 그냥 모르는이 아마도 1742
또는, 내가 더 잘 내 모든 기지

열 경우를 다룰 것입니다 실행 계획을 생성해야하는 테이블 스캔을 수행 (즉, 고유 한 값의 수가 행 수보다 훨씬 적습니다) SQL Server는 때때로 모든 행을 결정 론적으로 얻기 위해 테이블 ​​스캔 또는 유사하게 되돌릴 수 있습니다.

적어도 내 경험이었습니다. 특히 날짜 범위를 수행 할 때 동일한 동작을 보았습니다. 시간 제한 데이터가있는 테이블에서을 수행하면 @dt가 해당 행의 시간 간격 안에있는 모든 행을 가져 와서 테이블 스캔으로 되돌아갑니다. 그러면 실제 날짜를 리터럴로 SQL에 배치하면 훨씬 빠르게 실행됩니다.

문제는 선택성입니다. SQL Server는 문에 대한 실행 계획을 수립 할 때 모든 시나리오에 가장 적합한 방법을 모르기 때문에 추측하려고합니다.

매개 변수에 대한 값을 일반적으로 값으로 지정하려면 쿼리 힌트를 추가하십시오.:

sp_executesql "select * from tablesView where Id = @Id option (optimize for (@id = 1742))", N"@Id int", @Id=1 
+0

에 대한 최적화 도움이되지 않습니다, 내가 linq 쿼리 빌드 내부에 최적화를 추가 할 수 없습니다. : – WhoIsNinja

+0

그리고 레코드에 관해서는,이 쿼리에 Where 절이 없으면 백만 레코드가 반환됩니다. 뷰에는 거대한 테이블 간의 조인이 포함되어 있습니다. – WhoIsNinja

+1

1. 누가 "No where 절"에 대해 말했습니까? 최적화를위한 절과 함께 SQL을 실행 해보고 차이점을 살펴 보자. 그리고 3) ... 당신의 데이터를 여전히 가장 잘 알지 못하는 ORM인가? –

2

이 문제를 스니핑 매개 변수가 될 수있다. SQL 쿼리가 끝날 때

줄을 포함 시키십시오. http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx

+0

비록 이것을 직접적으로 사용할 수는 없지만 그것은 내 문제에 대한 해답이었습니다. 즉, 매개 변수가 인덱스를 사용하는 대신 테이블 스캔을 일으키고있었습니다. OPTION (RECOMPILE)을 사용하면 기본 뷰가 테이블 인덱스를 사용하는 계획을 사용하게됩니다. 불행히도 내 SQL 미들웨어 파서가 구문을 받아 들일 수 없기 때문에 이것을 사용할 수 없었다. 내 해결 방법은 매개 변수없이 SQL을 빌드하여 효과적으로 값을 쿼리에 코딩하는 것이 었습니다. 이상적인 것은 아니지만 쿼리가 sp_executesql로 바뀌는 것을 피할 수 있습니다. – Paul

관련 문제