我們遇到SQL超時並已發現瓶頸是審計表 - 我們系統中的所有表都包含導致新審計的插入,更新和刪除觸發器記錄。刪除主鍵(聚集索引)以提高插入性能
這意味着審計表是系統中最大和最繁忙的表。然而,數據只是進來,並且從來沒有出現(在這個系統下),所以不需要select
性能。
運行select top 10
返回最近插入的記錄而不是'第一個'記錄。當然,order by
的作品,但我希望一個選擇頂部應該根據他們在光盤上的順序返回行 - 我期望會返回最低的PK值。
有人建議我們放棄聚集索引,實際上也是主鍵(唯一約束)。正如我前面提到的,在這個系統中不需要select
。
聚簇索引在表上創建什麼類型的性能影響?有沒有索引,非集羣,無密鑰表的(非選擇)分支是什麼?還有其他建議嗎?
編輯
我們的審計涉及CLR函數,現在我有沒有& PK,索引,FKS等基準來確定的CLR函數&的約束控制下的相對成本。
調查結束後,糟糕的表現與insert
聲明無關,而是CLR功能,它編排了審計。在刪除CLR並改爲使用直接TSQL處理程序後,性能提高了20倍。
在測試過程中,我還確定聚集索引和標識列對插入時間沒有什麼影響,至少相對於發生的任何其他處理而言。
// updating 10k rows in a table with trigger
// using CLR function
PK (identity, clustered)- ~78000ms
No PK, no index - ~81000ms
// using straight TSQL
PK (identity, clustered) - 2174ms
No PK, no index - 2102ms
我發現這一點在桌子尺寸增加時尤其如此。 –