我有一本图书在线销售网站,在系统中有一个名为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 :(得分:0)
我建议您阅读有关索引如何工作的内容。
此链接将为您提供基础知识。
http://www.simple-talk.com/sql/learn-sql-server/sql-server-index-basics/
但是在回答您的问题时,您应该在经常使用的列上创建索引。这意味着如果您在BookID,LibraryID和Mode上创建索引,则此索引将使用所有3列,并且在您的where子句查看这3列时非常有用。根据我的理解,拥有该索引然后仅搜索LibraryID将没有用处。
基本上查看您在表上执行的查询,确定使用哪些列,然后索引最常用的列。请注意过度索引,因为这会降低数据库速度。