我正在尝试创建一个视图来显示组中的最后一个值。寻找更通用的查询。
CREATE TABLE a (
id INTEGER,
seq INTEGER,
val VARCHAR2(16),
PRIMARY KEY(id,seq)
);
-- View 1
CREATE VIEW v1 AS SELECT a.*
FROM
a,
(SELECT id, MAX(seq) from a GROUP BY id) b
WHERE a.id=b.id AND a.seq=b.seq
-- View 2
CREATE VIEW v2 AS SELECT a.*
FROM
a
WHERE a.seq=(SELECT seq from a b WHERE a.id=b.id ORDER BY seq DESC LIMIT 1)
当我想列出所有记录时,视图 1 的性能更好。
当我这样做时,视图 2 表现更好 SELECT * FROM v2 WHERE id=?
因为这个观点是给局外人的,所以我希望它尽可能通用。有没有办法告诉 PostgreSQL 这两个查询是等价的,让它自动选择它们?
这种形式 with
DISTINCT ON
通常比v1
or更快v2
:您会在它上面得到排序的输出(按
id
),这通常是一个受欢迎的副作用。细微差别:此表单包含一行 id,其中只有 NULL 值
seq
。这通常也是一种受欢迎的效果。seq
与是否定义无关NOT NULL
。如果性能是必不可少的,我强烈建议创建一个匹配的(!)表单的多列索引:
在这个相关问题下有更多细节和更多选择:
在每个 GROUP BY 组中选择第一行?
根据输入切换查询
如果您对切换技术本身感兴趣,您可以创建一个表函数而不是将 id 作为参数的视图。
称呼:
可以通过更多参数进行改进。
这种方法非常适合简单的调用。甚至可以节省一些计划开销,并且通常比原始 SQL 更快。不过请注意,plpgsql 函数构成优化障碍。函数体不能在更大查询的上下文中内联或优化(就像视图或简单的 SQL 函数一样)。此相关答案中的更多信息:
PostgreSQL 存储过程性能