Optimization
在搜尋列具有最大值的行時,哪個查詢的性能更好?
考慮一個簡單的表格作為範例:
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;