我有一個基本的表,如下所示。優化我的SQL查詢 - 選擇正確的索引
create table Orders
(
ID INT IDENTITY(1,1) PRIMARY KEY,
Company VARCHAR(3),
ItemID INT,
BoxID INT,
OrderNum VARCHAR(5),
Status VARCHAR(5),
--about 10 more columns, varchars and ints and dates
)
我試圖優化我的所有SQL,因爲我得到一個公平的幾個死鎖和一些緩慢 - 但我對這種事情沒有專家!
我創建了幾個索引:
聚集在ID(主鍵)上。
非羣集上([條目標識號])
非羣集上([BoxID])
非羣集上索引指數指數([公司],[ORDERNUM],[狀態])
也許1或2更多在其他一些列
但我不是100%滿意的結果。
SELECT * FROM Orders WHERE ItemID=100
給了我一個索引seek +一個鍵查找和一個嵌套循環(Inner join)。 我可以看到爲什麼 - 但不知道我是否應該做任何事情。他們的關鍵查找是97%的這批似乎不好!
每個使用的查詢都會拉回表中的每一列,但我不喜歡在索引中包含每一列的想法。
我正在進行更改以查詢在[Company]字段中的所有內容。 每個查詢都會使用它,因爲結果應該是從來沒有包含多於1個值。所以他們都會改變:
SELECT * FROM Orders WHERE ItemID=100 --Old
SELECT * FROM Orders WHERE Company='a' and ItemID=100 --New
但是,這樣的執行計劃給我完全一樣,不包括公司(這確實讓我感到吃驚!)。
爲什麼兩個執行計劃高於相同? (我目前在[公司]沒有索引)
是否值得將[公司]添加到我的所有索引,因爲它似乎使 與執行計劃有所不同?
我是不是應該只給[公司]添加1個單一索引並保留原始索引? - 但是那個 是否意味着每個查詢都會有2個搜索?
是否值得'包括'我的索引中的所有其他列以避免 密鑰查找? (使指數每噸更大,但可能 加快步伐?)即
CREATE NONCLUSTERED INDEX [IX_Orders_MyIndex] ON [Orders] ([Company] ASC, [OrderNum] ASC, [Status] ASC) INCLUDE ([ID],[ItemID],[BoxID], [Column5],[Column6],[Column7],[Column8],[Column9],[Column10],etc)
,如果我做這件事是4個或5個指標顯得凌亂。
基本上我有4-5個經常運行的查詢(一些選擇和更新),所以我想盡可能地提高效率。 所有查詢將使用[公司]字段,並至少有一個其他字段。我應該如何去做。
任何幫助表示讚賞:)
集羣idenx不應該在ID上,因爲您不需要查找ID順序什麼是您需要制定的是什麼是您的常見查詢 – Mark
通過where子句company ='a'和ItemID = 100,優化器可以根據其數據庫統計信息自由選擇它所計算的最有效的索引。例如,如果您碰巧總共有1000條記錄,並且只有50家不同的公司,但有200個不同的ItemID,則優化器將決定採用ItemID,因爲每個ItemID的5條記錄看起來比每個公司的20條記錄的指標更好。 –