Luf*_*ude 1 sql postgresql function
我基本上有 2 个查询来返回数据,第一个查询速度很快,但在 5% 的情况下不起作用,第二个查询适用于所有情况,但速度慢很多
如何以始终返回结果但在第一个查询产生结果时避免运行第二个查询的方式对其进行编码?我所说的结果是指 1 行到 1000 行之间的任何内容
我当前的查询仅运行第一个查询并返回空结果集,如下所示:
SELECT CASE WHEN x.column1 IS NOT NULL THEN x.column1 ELSE y.column1 END column1,
CASE WHEN x.column1 IS NOT NULL THEN x.column2 ELSE y.column2 END column2
FROM (SELECT column1, column2 FROM mytable WHERE < 1st SET OF complex conditions >) x
, (SELECT column1, column2 FROM mytable WHERE < 2nd SET OF complex conditions >) y
Run Code Online (Sandbox Code Playgroud)
我所说的复杂条件是指一系列 GIS 函数,例如 st_intersects 和 st_dwithin ,它们会使这个问题变得更加复杂。当第一个查询返回某些内容时,两个查询的输出是相同的。我不能同时运行两者,否则它运行时间太长并且用户超时。
我当前的查询没有注册 x.column1 没有返回任何内容,并且由于 y 查询返回的条件集从未被考虑在内,如何解决这个问题?
编辑:同样,预期结果是当 query1 (由 x 表示)产生空结果集时,我需要从运行 query2 (由 y 表示)中获取结果。
WITH fast AS (
SELECT column1, column2
FROM mytable
WHERE <1st SET OF complex conditions>
)
, slow AS (
SELECT column1, column2
FROM mytable
WHERE NOT EXISTS (TABLE fast)
AND <2nd SET OF complex conditions>
)
TABLE fast
UNION ALL
TABLE slow;
Run Code Online (Sandbox Code Playgroud)
测试:如果第一个查询 (CTE ) 返回任何行,EXPLAIN ANALYZE您将看到第二个查询 (CTE)。我认为这就是你的目标。(never executed)slowfast
TABLE fast只是(标准 SQL)短语法SELECT * FROM fast。看:
如果两个查询只能返回一行(或什么都不返回),则有一个简单、高效的解决方案,无需 CTE:
(
SELECT column1, column2
FROM mytable
WHERE <1st SET OF complex conditions>
)
UNION ALL
(
SELECT column1, column2
FROM mytable
WHERE <2nd SET OF complex conditions>
)
LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
有关的:
| 归档时间: |
|
| 查看次数: |
3917 次 |
| 最近记录: |