加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – 通过数百万行的可自定义排序进行分页性能

发布时间:2020-12-26 03:08:55 所属栏目:编程 来源:网络整理
导读:在我们的应用程序中,我们有一个网格,用户可以在其中分页大量记录(1000万到2000万).网格支持在多个列(20)中按升序和降序排序.许多值也不是唯一的,因此应用程序也会将id排序为打破平局,以确保行始终显示在同一页面上.例如,如果用户想要按窗口小部件大小排序(从

该语句中的“前739”行可能是指统计直方图中的第一个条目,按RANGE_HI_KEY排序.直方图建立在有序流上(使用排序).没有关于这些行在表中的位置的信息.即使在表扫描中首先遇到这些行,引擎也没有选择,只能完全完成扫描以确保它不会遇到更高排序的值.

As only 30 rows are required can SQL server not use this information to deduce that it only needs to sort rows with a widget size which is large?

要查找30个最大的行,SQL Server必须检查每一行(符合WHERE子句). SQL Server无法选择符合“足够大”的任意“最小值”,即使这样做,也无法在没有适当索引的情况下找到这些行.

实际上,Top N Sort N N = 100确实使用替换策略,其中只有大于当前最小值的传入值被放置在排序缓冲区中,但与从中读取行的成本相比,这是一个小优化.表并将它们传递给排序.

原则上,引擎可以将动态过滤器(在排序缓冲区中存在的当前最小值)下推到表扫描中,以尽早限制行,但是这没有实现.要解决此问题,类似的想法包括在widgetSize的不同值上创建索引视图,其中行数与每个值匹配:

CREATE VIEW dbo.WidgetSizes
WITH SCHEMABINDING
AS
SELECT
    T.widgetSize,NumRows = COUNT_BIG(*) 
FROM dbo.Test AS T
GROUP BY
    T.widgetSize;
GO
CREATE UNIQUE CLUSTERED INDEX CUQ_WidgetSizes_widgetSize
ON dbo.WidgetSizes (widgetSize);

如果相对较少的不同值(如样本数据的情况),则此索引视图将远小于widgetSize上的等效非聚簇索引.然后,可以使用此信息来评估要过滤的最小widgetSize,同时仍然保证将找到至少30行.

第一页

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读