簡體   English   中英

優化在select子句中具有子查詢的SQL查詢,並基於這些子查詢結果進行過濾

[英]Optimize an SQL query that has sub queries in select clause and filters based on these sub query results

我有以下格式的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%'

我的實際查詢還有更多帶有復雜where條件的子查詢。

最初,數據庫很小,查詢運行良好,但是隨着數據庫大小的增加,查詢開始花費的時間長得令人無法接受。

我嘗試向查詢中添加LIMITOFFSET獲取有限數量的結果,但是它似乎對查詢執行時間沒有任何影響。 為什么會這樣?

還有其他方法可以使查詢運行更快嗎? (我已經完成了索引編制。還盡可能使用JOINS代替子查詢)

還有其他方法可以解決此問題嗎? 我的最終目標是從許多大型數據庫表中獲取數據並在前端生成一個表。 前端表中的單個列可以是來自不同數據庫表的多個行。

我可以想到兩種解決方法,可能會為您帶來一些性能提升。 第一種是使用公用表表達式(WITH語句)來設置sub_table,然后對其進行聯接:

-*使用帶有sub_table AS的CTE(公用表表達式)(SELECT sub_field_1,table_1_key FROM sub_table WHERE條件)

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的計算機上進行檢查; 因此代碼應該是接近的,但是如果有什么明顯的錯誤,請讓我知道,我可以調試/編輯答案。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM