Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 关于一个表中多个组合索引的混淆_Sql_Performance_Tsql_Indexing_Non Clustered Index - Fatal编程技术网

Sql 关于一个表中多个组合索引的混淆

Sql 关于一个表中多个组合索引的混淆,sql,performance,tsql,indexing,non-clustered-index,Sql,Performance,Tsql,Indexing,Non Clustered Index,我有一个图书网上销售网站,在系统中有一个名为订单的表格,下面有一些列: 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, ... SELECT * FROM Book b, Library l,

我有一个图书网上销售网站,在系统中有一个名为订单的表格,下面有一些列:

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,
...
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
因此,该表有700多万行,目前我正在为网页添加更多查询条件,sql脚本如下所示:

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,
...
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
这个脚本可能包含所有可能的查询条件,在我打开“Included Actual Execution Plan”(包含实际执行计划)并在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])
所以上面的3个索引已经创建了,问题是,如果我想创建我的索引,我的意思是我觉得有些重复,我可以合并它们吗?或者每个索引都是用于特定的查询,因为表每天都在增长,我无法确定除了我的查询之外使用的是哪个应用程序或什么sql脚本。
有什么想法吗?

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

此链接将为您提供基本信息

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


基本上看一下您在表上执行的查询,确定使用了哪些列,然后索引最常用的列。不过要小心过度索引,因为这会减慢数据库的速度。

Hi Purplegoldfish,非常感谢,我已经阅读了您推荐的文章,它非常有用,我认为我了解索引的设计,索引IDX_Order_1 IDX_Order_2和IDX_Order_3可能用于某些特定的查询,无论如何,我将创建IDX_order_4,看看性能是否得到了改进。