T-sql 中的记录顺序随统计信息更新而变化

Posted

技术标签:

【中文标题】T-sql 中的记录顺序随统计信息更新而变化【英文标题】:record order in T-sql changing with statistics update 【发布时间】:2012-07-18 04:10:55 【问题描述】:

我在给定查询中遇到记录顺序问题。

SELECT 
EA.eaid, --int , PK of table1
EA.an, --varchar(max)
EA.dn, --varchar(max)
ET.etid, --int
ET.st --int
FROM dbo.table1 EA
JOIN dbo.table2 ET ON EA.etid = ET.etid
JOIN @tableAttribute TA ON EA.eaid = TA.id -- TA.id is int and is not a PK
ORDER BY ET.st

ET.st 列的值对于给定场景中的所有记录都是相同的。

查询给出的记录顺序在更新统计信息时随机变化。 有时按 EA.eaid 的顺序,有时按 TA.id 的顺序。

请解释这种行为。统计数据如何影响此处的排序?

我使用的是 sql server 2008 R2。

【问题讨论】:

【参考方案1】:

除非ORDER BY 子句指定,否则从数据库查询返回的行的顺序是未定义的。由于您仅按ET.st 排序并且此列的所有值都相同,因此结果将以不确定的顺序返回(基于优化器确定的计划和使用的索引的顺序)。更新索引统计信息允许查询优化器选择最好的(通常是最确定的)索引;查询计划可能已更改,从而导致出现不同的排序。

在我看来,您想通过 ET.st 以外的方式订购。

【讨论】:

您能否详细说明优化器如何使用索引和计划进行排序?在这种情况下如何使用统计信息? @MukulSinghSaini 我加了一句来解释,但关键是它们不是有序的。它们只是按照发现匹配行的顺序出现。 是的,你是对的,我实际上希望它们按@tableAttribue 记录的顺序排列,并且已经想出了如何去做。但我想知道 sql server 如何在冗余 order by 或缺少 order by 的情况下对行进行排序,特别是在查询中使用 joins。 阅读:blogs.msdn.com/b/conor_cunningham_msft/archive/2008/08/27/…

以上是关于T-sql 中的记录顺序随统计信息更新而变化的主要内容,如果未能解决你的问题,请参考以下文章

拟合的 coxph 模型随时间变化的地层和集群的公式中的项排序而变化

Vue.js:数据不会随变化而更新

应用程序 UUID 随 iOS 中的应用程序更新而变化

带有代理统计信息的参数变化实验期间的NullPointerException

oracle中的统计信息问题

cProfiler:如何按执行顺序获取统计信息?