sql-server – 通过数百万行的可自定义排序进行分页性能
该语句中的“前739”行可能是指统计直方图中的第一个条目,按RANGE_HI_KEY排序.直方图建立在有序流上(使用排序).没有关于这些行在表中的位置的信息.即使在表扫描中首先遇到这些行,引擎也没有选择,只能完全完成扫描以确保它不会遇到更高排序的值.
要查找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行. 第一页 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |