【发布时间】:2020-08-19 19:43:22
【问题描述】:
使用 PostgreSQL,我需要定义一个查询,该查询会根据参数有条件地SELECT 一些数据。在此语句中,我有一个条件,仅当另一个条件评估为 TRUE 时才需要评估。
为了解决这个问题,我的第一个想法是在WHERE 中使用CASE,效果很好。例如,使用带有列id、name 和value 的表test_table:
SELECT
name
FROM test_table
WHERE
CASE
WHEN $1 > 10 THEN test_table.value > $1
ELSE TRUE
END
;
但是,其他同行建议改用常规布尔逻辑,因为它的执行速度更快。例如:
SELECT
name
FROM test_table
WHERE
(
$1 <= 10
OR test_table.value > $1
)
;
在对大约 100k 行进行测试并使用EXPLAIN ANALYSE 后,速度差异似乎平均为大约 1ms 差异:
- 使用
CASE:~19.5ms 执行时间 - 使用常规布尔值:~18.5ms 执行时间
问题是:第二种方法真的更快吗?还是我的测试有缺陷,因此结果不正确?
【问题讨论】:
-
只有 1 毫秒的差异,我怀疑文件是否存在真正的差异。这可能只是由于其他原因造成的随机差异。变化。您多久运行一次查询?
-
嗨@a_horse_with_no_name。每种方法 20 次。然后计算这些时间的平均值。
-
我仍然认为 1ms 是不够的。能否请edit您的问题并为每个查询添加
explain (analyze, buffers)*的输出(请格式化文本,不要屏幕截图)
标签: sql postgresql query-performance