我正在学习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;
当我在这张桌子上有数十亿条记录时,我担心情况会更糟。
我是否需要从配置或其他东西启用多线程?
答案 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,包括限制。