使用SQL Server ROW_NUMBER()进行分页时性能不佳

伊卡博特

我正在尝试建立一个分页机制。我正在使用创建SQL的ORM,如下所示:

SELECT * FROM 
    (SELECT t1.colX, t2.colY
         ROW_NUMBER() OVER (ORDER BY t1.col3) AS row 
     FROM Table1 t1
     INNER JOIN Table2 t2
     ON t1.col1=t2.col2
    )a 
WHERE row >= n AND row <= m

表1的行数超过50万,表2的记录数超过1万

我直接在SQL Server 2008 R2 Management Studio中执行查询。子查询执行需要2-3秒的时间,但整个查询需要> 2分钟的时间。

我知道SQL Server 2012接受该OFFSET .. LIMIT ..选项,但是我无法升级该软件。

谁能帮助我改善查询性能,或建议其他可通过ORM软件强加的分页机制。

Update:

测试Roman Pekar的解决方案(请参阅解决方案注释)证明ROW_NUMBER()可能不是性能问题的原因。不幸的是,问题仍然存在。

谢谢

米卡尔·埃里克森(Mikael Eriksson)

据我了解,您的表结构来自注释。

create table Table2
(
  col2 int identity primary key,
  colY int
)

create table Table1
(
  col3 int identity primary key,
  col1 int not null references Table2(col2),
  colX int
)

这意味着从返回的行Table1永远不能被join过滤,Table2因为Table1.col1is not null联接不能Table2将行添加到结果中,因为Table2.Col2它是主键。

然后,您可以重写查询以Table1在加入之前生成行号Table2并且在联接之前还应用了where子句,Table2这意味着您将只查找Table2实际上属于结果集的行。

select T1.colX,
       T2.colY,
       T1.row
from
    (
    select col1,
           colX,
           row_number() over(order by col3) as row
    from Table1
    ) as T1
  inner join Table2 as T2
    on T1.col1 = T2.col2
where row >= @n and row <= @m

SQL小提琴

我不知道是否可以让您的ORM(由Mindscape编写的Lightspeed)来生成这样的分页查询,而不是现在的查询。

来自此答案的查询计划: 在此处输入图片说明

使用问题中的查询的查询计划: 在此处输入图片说明

两者之间的读取存在巨大差异。

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Win Forms C#中使用Active Directory登录到SQL Server时性能不佳

来自分类Dev

SQL Server更新触发器性能不佳

来自分类Dev

由于循环SQL Server Update语句而导致性能不佳

来自分类Dev

在 SQL Server 的 WHERE 子句中使用 ROW_NUMBER()

来自分类Dev

SQL Server ROW_NUMBER()问题

来自分类Dev

SQL Server ROW_NUMBER()问题

来自分类Dev

使用数字进行文本搜索时,mongo db 性能不佳

来自分类Dev

在asp.net gridview中使用ROW_NUMBER()在SQL中进行自定义分页

来自分类Dev

php分页,使用sql server

来自分类Dev

如何使用限制使用ROW_NUMBER()从SQL Server返回的结果

来自分类Dev

在SQL Server中的case语句中使用Row_Number()

来自分类Dev

使用VBA更新Excel Slicer选择时性能不佳

来自分类Dev

使用VBA更新Excel Slicer选择时性能不佳

来自分类Dev

使用JOIN时phpMyAdmin中的性能不佳

来自分类Dev

Oracle - 使用 Left Join ON Where IS NULL 时性能不佳

来自分类Dev

在SQL Server中将row_number()转换为int

来自分类Dev

具有ROW_NUMBER的SQL Server存储过程

来自分类Dev

使用ROW_NUMBER()时对结果进行排序

来自分类Dev

使用Entity Framework 7和SQL Server 2008进行分页

来自分类Dev

如何使用SQL Server对SQL Server查询进行基准测试

来自分类Dev

使用pymssql从SQL Server读取varchar的性能

来自分类Dev

使用SQL Server索引提高性能

来自分类Dev

使用Row_Number进行价格排序的SQL语法

来自分类Dev

使用SQL Server进行JNDI配置

来自分类Dev

使用SQL Server进行DISTINCT和GROUP BY

来自分类Dev

使用PreparedStatements时SQL Server死锁

来自分类Dev

使用MediaPassword时SQL Server备份失败

来自分类Dev

SQL Server 2012闲置时使用CPU

来自分类Dev

使用MediaPassword时SQL Server备份失败

Related 相关文章

热门标签

归档