如何优化此查询

时间:2011-02-19 18:37:39

标签: performance sql-server-2008 query-optimization

我正在学习MS SQL Server 2008 R2,请原谅我的无知。 此查询需要3秒,我想在不到1秒的时间内完成。 该查询仅用于测试目的,实际上我会加入不同的领域。

select * from
(
select row_number() over(order by t1.id) as n, t1.id as id1, t2.id as id2, t3.id as id3, t4.id as id4, t5.id as id5
from dbo.Context t1
inner join dbo.Context t2 on t1.id = t2.test
inner join dbo.Context t3 on t2.id = t3.test
inner join dbo.Context t4 on t3.id = t4.test
inner join dbo.Context t5 on t4.id = t5.test
) as t
where t.n between 950000 and 950009;

当我在这张桌子上有数十亿条记录时,我担心情况会更糟。

我是否需要从配置或其他东西启用多线程?

2 个答案:

答案 0 :(得分:0)

没有真正的方法来优化此类查询的paging部分,即

部分
t.n between 950000 and 950009

这是真的

{ ROW_NUMBER } between 950000 and 950009

如果没有完全实现INNER JOIN,则无法准确地对结果进行行编号。这与具有Row_Number的单个表不同 - 查询优化器有时可以只计算索引键并转到直接范围。

您唯一能做的就是确保JOIN条件都已完全编入索引并使索引包含将被选中的列(因此它们将成为COVERING INDEXes)。没有必要显示细节,因为那些不是你真正的专栏。

  

我是否需要从配置或其他东西启用多线程?

默认情况下,并行性已经[已经]打开,因此这样的查询很可能会在多个流中收集数据。

答案 1 :(得分:0)

我建议将内部查询创建为索引视图,然后运行您的分页。由于索引视图实际上有一个真实索引,因此可以使用与表相同的优化技巧。

有关索引视图的更多信息,请参阅here,包括限制。