2012-07-18 33 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

請您詳細說明優化程序如何使用索引和計劃進行排序?在這種情況下如何使用統計信息? – 2012-07-18 04:18:38

+0

@MukulSinghSaini我已經添加了一句話來解釋,但關鍵是他們*沒有訂購*。他們只是按照發現匹配行的順序出來。 – 2012-07-18 04:23:42

+0

是的,你是對的,我真的想要他們按照@tableAttribue記錄的順序,並已經想出瞭如何做到這一點。但是我想知道sql server如何通過特定的查詢中的連接來排序冗餘順序或缺少順序。 – 2012-07-18 04:52:53