【发布时间】:2013-12-18 16:23:41
【问题描述】:
我的查询看起来像:
select top 1
a
, b
, c
from table
where x = 1
and y = 2
and z > getdate()
order by
b desc
, c desc
还有一个类似的索引:
create index idx_ on table
(
x
, y
, z
, b
, c
)
include (a)
我的问题是过滤后我留下了大约 600 万条记录。而且 SQL Server 也不会根据索引进行排序,因此该查询的时间非常长。
计划如下:
select (0%) <- TOP N SORT (94%) <= INDEX SEEK (6%)
如何为索引选择列,或者以这种方式更改选择,以便我可以从索引中受益。
此外,选择必须能够适合外部应用,这是不将其分解成碎片的主要原因。 x 字段是外部选择链接的字段。
作为问题的更新,整个 sql 看起来像:
select
*
from #tmp_xs xs
outer apply
(select top 1
a
, b
, c
from table
where x = xs.rel_x
and y = 2
and z > getdate()
order by
b desc
, c desc) xs_res
出于某种原因,上面的查询sql server 将只使用过滤索引。如果将内部查询放在内联函数中,则结果是相似的。如果我不把它放在一个内联函数中,两个索引都可以工作并且查询非常快。
【问题讨论】:
-
该索引可能用于选择过程 - 因为它包含正在查询的
x, y, z。但是它不能用于排序,因为排序列b和c不是该索引中最左边的列!我建议您在(x, y, z)上创建索引以供选择,并在(b, c)上创建第二个单独的索引以供订购 -
谢谢,它工作得很好..虽然我不知道如何将它标记为正确..
-
问题是,为什么放在outer apply里面之后,又回到了旧的plan(就像上面那个,不使用第二个索引)
标签: sql sql-server-2008 indexing