3

从透明表中选择 MAX 值的最有效和最优雅的方法是什么?例如,让我们尝试选择 T100、Messages这样的简单表。让我们假设我们应该在某个应用程序区域内选择最大消息数。我们可以通过多种方式做到这一点。
最明显的是使用MAX聚合函数

select MAX(msgnr)
from t100
where arbgb = '/ASU/GENERAL'

另一个是 usingUP TO 1 ROWS子句

select msgnr
from t100
where arbgb = '/ASU/GENERAL'
and ROWNUM = 1
order by msgnr DESC

在上面,所有 SQL 语句都在本地 Oracle SQL 中给出,因为我在 DBACOCKPIT 中进行测试,这是强制性的。

内置的驾驶舱工具对两个请求显示几乎相同的结果:

  • 它们的估计成本都是 3,但是,第二个查询在计划中只有 2 个步骤,而第一个查询有 3 个。
  • 第一个查询的估计 CPU 成本每步21.564 ,但第二个查询的成本为 21.964。

所以我们可以得出结论,第二种变体在这里更有效。
但是,这会是普通情况下的重点吗?这个结果在不同的数据库上会有所不同,还是我们可以将其视为经验法则?

4

1 回答 1

4

性能测量总是根据一组相当大的参数而变化,DBMS 并不是最不重要的。例如,一些 DBMS 可能能够使用索引来有效地确定MAX(...)语句,而其他 DBMS 可能不得不求助于一些效率较低的形式。此外,不要相信优化器的预测- 衡量实际性能。优化器可能由于多种原因出错(就我所见,过时的统计信息和损坏的索引是最常见的),如果优化器估计总成本为 12.345,而实际成本为是 987.654。因此,我的建议是

  • 只选择你需要的(避免SELECT *WHERE明智地使用)
  • 测量,测量,测量
  • 警惕大多数未经证实和声称的性能经验法则。
于 2016-04-22T14:43:03.080 回答