优化在选择子句中具有子查询并根据这些子查询结果进行过滤的SQL查询

时间:2018-07-31 18:04:59

标签: sql database postgresql large-data

我有以下格式的pgsql查询。

SELECT
    field_1,
    field_2,
    ARRAY (SELECT sub_field_1
            FROM sub_table where condition
    ) as field_3
FROM table
WHERE field_1 LIKE '%xyz%'
  

我的实际查询还有更多带有复杂条件的子查询。

最初,数据库很小,查询运行良好,但是随着数据库大小的增加,查询开始花费的时间令人无法接受。

我尝试将LIMITOFFSET添加到查询中,以一次获取有限数量的结果,但这似乎对查询执行时间没有任何影响。为什么会这样?

还有其他方法可以使查询运行更快吗? (我已经完成了索引编制。还尽可能使用JOINS代替子查询)

还有其他方法可以解决此问题吗?我的最终目标是从许多大型数据库表中获取数据并在前端生成一个表。前端表中的单个列可以是来自不同数据库表的多个行。

1 个答案:

答案 0 :(得分:1)

我可以想到两种解决方法,可能会为您带来一些性能提升。第一种是使用公用表表达式(WITH语句)来设置sub_table,然后对其进行联接:

-*使用CTE(公用表表达式)     与       sub_table AS(          选择             sub_field_1,             table_1_key          FROM sub_table          条件        )

SELECT
  field_1,
  field_2,
  field_3
FROM table t
JOIN sub_table st ON st.table_1_key = t.table_1_key
WHERE field_1 LIKE '%xyz%'

根据您要存储的数据类型以及数据集的大小,最好是站起一个临时表来容纳数据,而不是使用公用表表达式,因为您可以定义键/临时表上的索引。

--* Using a tempoorary table that leverages a primary key
CREATE TEMPORARY TABLE IF NOT EXISTS temp_sub_table (
  table_1_key BIGINT PRIMARY KEY,
  sub_field_1 VARCHAR(20)
);

INSERT INTO temp_sub_table (table_1_key, sub_field_1)
  SELECT
    table_1_key ('table_1_key'),
    sub_field_1 ('sub_field_1')
  FROM sub_table
  WHERE condition

SELECT
  field_1,
  field_2,
  field_3
FROM table t
JOIN temp_sub_table st ON st.table_1_key = t.table_1_key
WHERE field_1 LIKE '%xyz%'

已经有一段时间了,因为我已经使用了这种语法,并且现在我不在使用IDE的计算机上进行检查;因此代码应该是接近的,但是如果有什么明显的错误,请让我知道,我可以调试/编辑答案。

希望这会有所帮助!