Optimization

在搜尋列具有最大值的行時,哪個查詢的性能更好?

  • June 2, 2015

考慮一個簡單的表格作為範例:

person(name varchar, age int)

我的任務是找回最年長的人。對於此類問題,哪個查詢通常更好?

查詢 1:最大值的子查詢條件

SELECT p.* FROM person p WHERE p.age = (SELECT MAX(age) FROM person);

查詢 2:排序和選擇第一行

SELECT p.* FROM person ORDER BY age DESC LIMIT 1;

我目前正在使用 PostgreSQL,但問題是我認為平台無關。

我不確定這是否像您想像的那樣獨立於平台,但我最近在 SQL Server 中對此進行了一些相當廣泛的測試,有趣的是,第一個查詢是最快的。這與 SQL Server 中的許多“技巧”進行了比較,包括使用 CROSS APPLY 和視窗函式。但在 PostgreSQL 中又是 YMMV。

除非我弄錯了(我不知道 PostgreSQL),否則你的第二個查詢實際上會更快出現,但這只是因為它會給你一個人的年齡。

我的猜測是 query2(雖然與查詢 1 不完全相同),但您必須檢查計劃才能確定。順便提一句:

FETCH FIRST 1 ROWS ONLY 

是等同於 LIMIT 的標準,它被 DB2 LUW (>= 7)、Oracle (>= 12c)、PostgreSQL (>= 8.4) 和 SQL server (>= 2012) 支持。另一種選擇是使用像rank這樣的分析函式:

SELECT age, name
FROM (
   SELECT age, name, rank() over (order by age desc) as rnk
   FROM person
) 
WHERE rnk = 1;

引用自:https://dba.stackexchange.com/questions/103050