2012-04-17 84 views
0

恕我直言,SQL Server可以自行选择(除非被告知)什么是最佳索引用于查询。SQL Server可以使用多个索引吗?

什么像这样(伪代码):

select __a from tbl where __a not in 
(
    select __b from tbl 

) 

(假设我们有index_1这是(__a)index_2这是(__b)

威尔SQL Server仍然使用一个索引执行或多个索引在一起...?

+0

你为什么不看执行计划并亲自查看? – 2012-04-17 17:31:30

+0

@MДΓΓБДLL告诉你这个问题,我不知道我在哪里可以在计划中找到这个信息......(哪一部分)? – 2012-04-17 17:32:13

+0

http://stackoverflow.com/search?q=%5Bsql-server%5D+execution+plan – 2012-04-17 17:32:49

回答

6

首先,创建表:

USE tempdb; 
GO 
CREATE TABLE dbo.tbl(__a INT, __b INT); 

然后创建两个指标:

CREATE INDEX a_index ON dbo.tbl(__a); 
CREATE INDEX b_index ON dbo.tbl(__b); 

现在用一些数据来填充:

INSERT dbo.tbl(__a, __b) 
    SELECT [object_id], column_id 
    FROM sys.all_columns; 

现在运行查询和转向实际执行计划。你会看到这样的事情,可见是,同时使用索引(其实在__B指数既用于子查询的数据检索和为寻求消除行):

enter image description here

一写你的查询更有效的方法是:

select __a from dbo.tbl AS t where not exists 
(
    select 1 from dbo.tbl AS t2 
    where t2.__b = t.__a 
); 

现在,这里是你的整个计划(同样,这两个指标的使用,但请注意有多少较少的操作):

enter image description here

+0

非常感谢您的努力。对此,我真的非常感激。大+1。 – 2012-04-17 18:48:17

相关问题