2013-04-04 25 views
0

我有發票的視圖,帶來客戶名稱,類似的東西。SQL Server排序緩慢,具有許多常見值

這裏有幾百萬行,超過幾百個客戶。該視圖閃電般快 - 但如果我添加一個客戶名稱排序需要一段時間來加載(如3000毫秒比5毫秒)。

查詢將發票加入到客戶,然後按客戶名稱排序,然後按訂單號排序。

我明白爲什麼 - 只是想知道是否有任何技巧可以提高分類速度?

+1

您是否在客戶名稱列上有索引? – 2013-04-04 01:29:38

+0

如果這與某些應用程序相關聯,那麼使用應用程序代碼對查詢結果進行排序可能會更快。 – 2013-04-04 01:31:42

+0

我嘗試過使用和不使用 - 它並沒有真正的幫助,因爲它必須將每張發票相互比較,因爲客戶名稱是相同的。該指數並沒有幫助,因爲這不是瓶頸。我可以針對這個特定場景進行優化,但我想支持動態排序。 – Adam 2013-04-04 01:32:51

回答

1

您可以在客戶ID /名稱上添加索引。

您可以按客戶的表格進行分區。

order by將需要很長時間,因爲 - 沒有索引 - 它必須讀取所有數據。如果您使用索引或表分區,則可以在不讀取整個表的情況下獲取行。

詳細說明索引。有兩個考慮因素。首先是你是選擇所有的行還是隻選擇幾行。在大多數情況下,索引肯定會有助於返回記錄的時間。

第二個考慮因素是索引是否有助於獲取所有記錄。這裏的問題是選擇性。如果發票表中的數據頁有幾百條記錄,並且只有幾百個客戶,那麼索引不會有幫助。平均而言,每個頁面都有每個客戶。

如果一個數據頁只有幾十張發票,那麼平均而言,大約只有一個頁面會有一個給定的客戶發票 - 而且,瞧,索引會減少整個表的I/O掃描的因子大約爲10.(還有其他一些考慮因素,例如預讀,但我忽略了這些)。

您不能提供有關係統和表結構的足夠信息以獲得明確答案,但索引可能是有用的。

+0

索引或分區在這種情況下都不會有幫助。 – Adam 2013-04-04 01:34:33

+1

@Adam。 。 。你爲什麼不這麼認爲?它應該執行索引掃描以獲取行標識符。這對於獲得第一行返回肯定有幫助。即使視圖需要返回所有行,幾百個客戶也可能具有足夠的選擇性。 – 2013-04-04 01:36:27

+0

是不是我的倒票btw,我投了票。可能對OP沒有用處,但對於其他類似問題的讀者可能非常有用。 – 2013-04-04 01:45:49