linux - Oracle Sort Order - 什么可能导致它改变

标签 linux oracle11g sql-order-by

免责声明:我知道在需要排序数据时不在 SQL 中使用“ORDER BY”是不好的。

我目前正在支持一个有奇怪问题的 Pro*C 程序。 奇怪问题的可能原因之一可能是原始开发人员(很久以前)没有在他们的 SQL 中使用 ORDER BY,即使程序逻辑依赖于它! 该程序多年来一直运行良好,直到最近才开始出现问题。

我们正试图将奇怪的问题归因于 ORDER BY 错误(还有其他候选原因,例如最近发生的从 Solaris 到 Linux 的移植)。

我们应该查看数据库端有哪些隐蔽的东西可能已经改变了旧的排序顺序?诸如数据文件之类的东西? 有人在 Solaris 上使用 Pro*C 神奇地对结果集进行排序吗?

谢谢!

最佳答案

既然您知道程序关心返回结果的顺序,并且您知道提交的查询缺少 ORDER BY 子句,那么您是否有理由不这样做只是解决问题而不是试图弄清楚结果的实际顺序是否已经改变?如果您修复了已知的 ORDER BY 问题并且“奇怪的问题”消失了,那么这将提供一些很好的证据证明“奇怪的问题”实际上是由丢失的 引起的订购方式

不幸的是,有很多事情可能会导致结果顺序发生变化,其中许多可能无法追踪。最明显的原因是执行计划发生了变化。反过来,这可能是由于统计信息更改或因为统计信息没有足够的更改或由于补丁或由于初始化参数更改或由于客户端配置更改等引起的。如果您获得使用 AWR(自动工作负载信息库)的许可,您可以通过查看 SQL_ID< 是否有多个 PLAN_HASH_VALUE 值来找到计划已更改的证据 在不同日期的 DBA_HIST_SQLSTAT 中。如果有,您仍然必须尝试弄清楚不同的计划是否真的导致结果以不同的顺序返回。但是,除了查询计划更改之外,还有许多其他可能的原因。磁盘上数据的物理顺序可能已经改变,因为有人重新组织了表,或者因为有人在磁盘上移动了数据文件,或者因为 SAN 通过移动数据自动重新平衡了某些东西。某些数据在过去通常可能已被缓存(或可能未被缓存),而现在已被缓存。可能应用了 Oracle 补丁。

关于linux - Oracle Sort Order - 什么可能导致它改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15379915/

相关文章:

Oracle 导出所有序列 DDL? (11克)

oracle - 物化 View 和同名表之间有什么关系?

mysql - mysql查询中的订单

MySQL TRIM order by 子句中的前导空格问题

linux - du -skh * in/returns vaSTLy 与 centos 5.5 上的 df 不同的大小

c - TCP 客户端无法将字符串发送到服务器

mysql - 自连接:表别名上的 SQL 解析错误

sql - ORDER BY的列有时为空

linux - 如何压缩符号链接(symbolic link)?

c - c程序中的多个fork()