视图连接中的多列表索引

时间:2014-04-24 14:02:08

标签: sql-server indexing views

嗨我有一个加入ID的视图,它在连接中使用了客户号码。但是,仅凭Customer而不是CustomerNo上的索引。这些连接是否使用索引?

(让我表明我相信我没有解释) 视图是这样的

Select T1.CustomerNo, T1.X, T1.Y, T2.Z 
from T1 inner join T2 on T1.Id = T2.Id

此视图将用于某些动态查询,并且主要在连接上使用CustomerNo。在表T1上有ID和非聚集索引的聚簇索引(ID,CustomerNo)

查询是否通过CustomerNo加入视图使用此索引,还是应该在CustomerNo上添加单独的索引。

1 个答案:

答案 0 :(得分:0)

嗯,这取决于。优化器的索引选择受许多因素的指导,包括基数和谓词的选择性。可能是对于相同的查询,但是不同的参数,优化器一次产生使用索引的执行计划,而另一次不产生。你应该检查一下实际的计划。

要从缓存中获取计划,请使用以下查询:

select text, cast(query_plan as xml)
from sys.dm_exec_cached_plans
cross apply sys.dm_exec_sql_text(plan_handle)
cross apply sys.dm_exec_text_query_plan(plan_handle, 0, -1)
-- add a filter on the text column to isolate the interesting queries only

此外,如果您对哪些查询使用特定索引感兴趣,也可以从计划缓存中找到(当然,仅适用于缓存计划)

declare @IndexName sysname
set @IndexName = 'name_of_the_index';

with xmlnamespaces ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' as p)
select 
     db_name(dbid) + '.' + object_schema_name(objectid, dbid) + '.' + object_name(objectid, dbid) AS database_object
     ,iobj.value('@Index','sysname') AS IndexName
     ,qp.query_plan
     ,iobj.query('.') AS IndexUsage
 from sys.dm_exec_cached_plans cp 
 cross apply sys.dm_exec_query_plan(cp.plan_handle) qp
 cross apply query_plan.nodes('//p:RelOp') IndexScan(scan)
 cross apply scan.nodes('//p:Object') as IndexObject(iobj)
 where dbid = db_id()
 and iobj.value('@Index','nvarchar(max)') = QUOTENAME(@IndexName,'[')

第二个查询可能需要一些时间并使用一些资源,请小心。