2012-06-21 35 views
0

我有一本書在線銷售網站中,在系統中,有一個表叫Order,並有像下面的一些列:混淆多構成指數一個表

OrderID int (Primary key), 
Library_ID int, 
Mode int, 
BookId int, 
Ext_User_ID varchar(2000), 
Activated varchar(1), 
RequiredDate datetime, 
AmountBuy int, 
APPROVAL_DATE datetime, 
... 

所以表中有過7個百萬行,目前我正在添加更多的查詢條件的網頁時,SQL腳本如下圖所示:

SELECT * FROM Book b, Library l, [Order] o 
WHERE o.bookid = b.bookID 
AND o.mode = 'A' 
AND o.library_ID = l.library_ID 
AND l.library_ID > 19 
AND b.publisher_id > 1000 
AND b.print_id > 800 
AND NOT EXISTS (SELECT * FROM ExtBOOK WHERE b.bookid = extbookid AND library_ID = l.library_ID) 
AND o.activated = 'Y' 
AND b.eisbn13 LIKE '978%' 
AND len(o.ext_user_id) > 3 
AND b.bookid > 200000 
AND b.bookid in (SELECT bookid FROM category WHERE categoryid > 2) 
ORDER BY o.orderid DESC 

該腳本可能包含所有可能的查詢條件,我用「上運行它Management Studio中後包括實際執行計劃「打開,重新表彰說,我需要在Order表上創建索引

CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>] 
ON [dbo].[Order] ([MODE],[ACTIVATED],[LIBRARY_ID],[BOOKID]) 
INCLUDE ([OrderID],[EXT_USER_ID],[APPROVAL_DATE]) 

然而,當我去創建索引,我發現其他三個指數法已經存在,它們分別是:

create nonclustered index IDX_Order_1 { MODE asc} 
create nonclustered index IDX_Order_2 { Library_ID asc, EXT_USER_ID asc, BookID asc} 
create nonclustered index IDX_Order_3 { BOOKID asc, Library_id asc, MODE asc } 

所以上面3索引已經創建,問題是,如果我想創建我的索引,我的意思是我覺得有一些重複,我可以合併它們嗎?或者每個索引都用於特定的查詢,導致這些表每天都在增長,而且我無法確保除了我的查詢之外,哪個應用程序或哪個SQL腳本正在使用。 有什麼想法?

回答

0

我建議你做一些關於索引如何工作的閱讀。

此鏈接將爲您提供基本知識。

http://www.simple-talk.com/sql/learn-sql-server/sql-server-index-basics/

但在回答你的問題,你應該建立在其上經常使用的列的索引。這意味着如果您在BookID,LibraryID和Mode上創建索引,則此索引使用全部3列,並且在where子句查看這3列時使用。就我理解的事情而言,擁有該索引,然後僅搜索LibraryID並不會有用。

基本上看你在你的表上做的查詢,確定哪些列被使用,然後索引最常用的列。注意過度使用,因爲這會降低數據庫的速度。

+0

嗨Purplegoldfish,非常感謝,我已閱讀你推薦的文章,這是非常有用的,我認爲我理解索引的設計,並且索引IDX_Order_1 IDX_Order_2和IDX_Order_3可能用於某些特定的查詢,無論如何,我將創建IDX_order_4並查看性能是否有所提高。 – danmiao