【问题标题】:Confusion about multi compose index within one table对一张表中的多组合索引感到困惑
【发布时间】:2012-06-23 08:04:39
【问题描述】:

我有一个图书在线销售网站,在系统中有一个名为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,
...

所以表格有超过700万行,目前我正在为网页添加更多查询条件,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 脚本。 有什么想法吗?

【问题讨论】:

    标签: sql performance tsql indexing non-clustered-index


    【解决方案1】:

    我建议您阅读一下索引的工作原理。

    此链接将为您提供基础知识。

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

    但在回答您的问题时,您应该在经常使用的列上创建索引。这意味着,如果您在 BookID、LibraryID 和 Mode 上创建索引,该索引将使用所有 3 列,并且当您的 where 子句查看这 3 列时很有用。据我了解,拥有该索引然后仅搜索 LibraryID 将没有用。

    基本上查看您对表执行的查询,确定使用了哪些列,然后索引最常用的列。但请注意过度索引,因为这会降低您的数据库速度。

    【讨论】:

    • 嗨 Purplegoldfish,非常感谢,我已经阅读了您推荐的文章,它非常有用,我以为我了解索引的设计,索引 IDX_Order_1 IDX_Order_2 和 IDX_Order_3 可能是针对某些特定查询的,无论如何我会创建 IDX_order_4 并查看性能是否有所提高。
    猜你喜欢
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2012-04-08
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多