인스턴스 : Azure SQL S2 인스턴스 ~ 170 만 개의 레코드가있는 후보 테이블이 있습니다. 후보 테이블이 기본 키가 아닌 AccountID에 인덱싱됩니다. AccountID : 646에는 80K 행이 있고 AccountID : 10에는 365K 행이 있습니다.
non_pk_indexed_col = int 인 테이블에서 select top (10)을 실행하면
Select top(10) from candidates where accountid=10
쿼리는 00:00:00 시간으로 완료됩니다.
Select top(10) from candidates where accountid=646
, 쿼리가 완료된 시간 은 01:45:00입니다.
값이 다른데 동일한 쿼리에 시간이 오래 걸리는 이유
이 두 매개 변수에 대해 매우 다른 쿼리 계획을 얻을 가능성이 높습니다. 따라서 하나는 다른 것보다 훨씬 더 잘 수행됩니다. 확인하는 한 가지 방법은 실제 실행 계획을 가져 와서 확인하는 것입니다.
SSMS에서 실제 실행 계획 포함 단추 (실행 단추 왼쪽에 약 7 개)를 눌러이를 수행 할 수 있습니다. https://msdn.microsoft.com/en-us/library/ms189562.aspx
Neil이 말했듯이 일반적으로 통계를 업데이트하여 잘못된 실행 계획을 수정합니다. 가능한 최상의 결과를 얻으려면 fullscan으로 업데이트해야합니다. 다음 쿼리를 실행하여 수행 할 수 있습니다.
DECLARE @sql nvarchar(MAX);
SELECT @sql = (SELECT 'UPDATE STATISTICS [' + DB_NAME() + '].[' + rtrim(sc.name) + '].[' + rtrim(so.name) + '] WITH FULLSCAN, ALL; '
from sys.sysobjects so
join sys.schemas sc
on so.uid = sc.schema_id
where so.xtype = 'U'
FOR XML PATH(''), TYPE).value('.', 'nvarchar(MAX)');
PRINT @sql
EXEC (@sql)
도움이 되었기를 바랍니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다