2012-07-18 2 views
0

주어진 쿼리의 레코드 순서에 문제가 있습니다.통계 업데이트로 T-SQL의 레코드 순서가 변경됨

SELECT 
EA.eaid, --int , PK of table1 
EA.an, --varchar(max) 
EA.dn, --varchar(max) 
ET.etid, --int 
ET.st --int 
FROM dbo.table1 EA 
JOIN dbo.table2 ET ON EA.etid = ET.etid 
JOIN @tableAttribute TA ON EA.eaid = TA.id -- TA.id is int and is not a PK 
ORDER BY ET.st 

ET.st 열의 값은 주어진 시나리오의 모든 레코드에서 동일합니다.

쿼리가 제공 한 레코드의 순서는 통계 업데이트시 임의로 변경됩니다. 때로는 EA.eaid의 순서이며 때로는 TA.id의 순서입니다.

이러한 행동에 대한 설명을 제공해주십시오. 여기 통계가 주문에 어떻게 영향을 줍니까?

SQL Server 2008 R2를 사용하고 있습니다.

답변

2

데이터베이스 쿼리에서 반환되는 행의 순서는 ORDER BY 절로 지정되지 않는 한 정의되지 않습니다. ET.st으로 만 주문하고이 열의 모든 값이 같으므로 결과는 최적화 프로그램에서 결정한 계획과 사용 된 색인 순서에 따라 비 결정적 순서로 반환됩니다. 인덱스 통계를 업데이트하면 쿼리 최적화 프로그램에서 최상의 (일반적으로 가장 결정 성있는) 인덱스를 선택할 수 있습니다. 결과적으로 쿼리 계획이 변경되어 다른 주문이 나올 가능성이 있습니다.

ET.st 이외의 다른 제품으로 주문 하시길 바랍니다.

+0

옵티마이 저가 주문시 인덱스 및 플랜을 사용하는 방법에 대해 자세히 설명해주십시오.이 경우 통계는 어떻게 사용됩니까? –

+0

@MukulSinghSaini 설명 할 문장을 추가했으나 중요한 것은 * 주문하지 않았기 때문입니다. 그들은 단지 일치하는 행이 발견 된 순서대로 나오고 있습니다. –

+0

예, 당신 말이 맞아요, 사실 나는 그들을 @tableAttribue 레코드의 순서대로 원했고 이미 그것을하는 방법을 알아 냈습니다. 하지만 쿼리에서 조인을 사용하여 SQL Server에서 중복 된 순서에 따라 행을 정렬하거나 누락 된 순서를 정렬하는 방법을 알고 싶었습니다. –