【问题标题】:why does sql server auto sort a table variable's rows?为什么 sql server 自动对表变量的行进行排序?
【发布时间】:2013-01-07 03:49:29
【问题描述】:

我注意到在编写存储过程中插入表变量的值与插入的顺序不同。有没有办法在不添加另一列进行排序的情况下禁用这种自动排序?想到的想法是正在创建的自动索引或一些排序规则设置......有什么想法吗?

访问http://sqlfiddle.com/#!3/e1c06/13 了解我的意思

declare @tmpTbl table (name varchar(100))
insert into @tmpTbl
select 'mark'
union
select 'frank'
union
select 'sharon'
union
select 'jason'

select * from @tmpTbl

【问题讨论】:

  • 没有充分的理由让代码依赖于表中数据存储的任意顺序。
  • 我同意,我只是在测试我的脚本输出时发现它很奇怪。如果我需要它,我会使用 ORDER BY
  • “关系模型指定关系的元组没有特定的顺序,并且元组反过来对属性没有任何顺序。” - Relational database

标签: sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

简短的回答是(可能)“因为存储引擎将您的行存储在无序堆中,当您不指定 ORDER BY 时,这会影响行的输出方式。”

除非您在 SELECT 查询中提供 ORDER BY,否则根据 SQL 规范,排序顺序是未定义。这就是它在每个 SQL 数据库中的方式,无论是 MySql、Oracle 还是 SQL Server。如果数据以您期望的顺序从表中出来,那是巧合,或者很可能是优化器如何生成查询的副作用,或者存储引擎如何选择物理存储行(可能是在这种情况下的根本原因)。

如果您以所需的排序顺序向表中添加聚集索引,则多次(但并非总是)该表将按照您期望的顺序出现。 永远不要依赖这种行为。

【讨论】:

  • 听起来是一个合理的想法,但我已经对其进行了 50 多次测试,并且每次都按顺序排列,这让我认为它是自动排序的,而不是每次都随机排列的
  • 我没有说排序顺序是随机,我说的是未定义。有一个不同的世界。如果您以相同的方式重复输入相同的数据,存储引擎或优化器将优化您的查询并以相同的方式插入。这并不意味着它将永远如此。服务包或 SQL 升级或配置更改可能会更改订单。 如果您关心结果的顺序,请始终使用 ORDER BY。没有例外。
【解决方案2】:

如果您希望它们按插入顺序排序,则在您的表中添加一个自动递增字段,然后您可以在选择数据时将其包含在 ORDER BY 中。

否则,SQL Server 将不会按特定顺序返回您的数据 - 它现在可能会返回“已排序”的数据,但未来可能并非如此。

顺便说一句 - 联合查询本身实际上返回的结果排序不同于它们在您的语句中出现的顺序。这可能是使用 UNION 与 UNION ALL 的结果,因为 union 是不同的,它可能意味着某种类型。所以,你得到的结果实际上是插入顺序。

【讨论】:

  • +1 表示 UNIONUNION ALL 以及影响排序顺序的(可能的)底层实现。
  • 哈哈蒂姆说得有道理... Union 抓取所有行以删除 dups 所以 prob 在插入表之前对其进行一些排序,但 Union All 不关心 dups ...我会如果不是评论,我已经接受了这个作为答案:-p 谢谢大家!
  • 嗯,这不是真正的评论 - 但无论哪种方式:)
  • 哇,我没有看到你答案的最后一部分凯文哈哈......刚刚接受了这个答案:-p
  • @markS,您可能在我编辑之前已经阅读过它。直到我尝试了自己的建议并且它仍然按照您的原始顺序出现时,我才弄明白。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
  • 1970-01-01
  • 2015-02-16
相关资源
最近更新 更多