當我試圖在oracle中使用這個查詢時,它需要0.04054s,而在PostgreSQL中使用相同的查詢時,它需要49.8min,我怎樣才能改變查詢以提高PostgreSQL的性能?
SELECT
"id", "image", "title", "service_desc"
, "狀態", "行動", "移除文本", "服務提供者"
, "服務提供者名稱"
FROM (
SELECT DISTINCT "ID", "IMAGE"
, "標題", "服務描述"
, COALESCE("STATUS",'N') as "STATUS"
, "action", "removation_text", "created_dt"
, "service_provider", "service_provider_name"
FROM MZP_ADP.ALL_SERVICE_DETAILS
WHERE "ZIP_CODE"='55005' AND"MAKE_LIVE" = 'Y'
and "LOCATION_ID" = '2407605'
AND "END_DATE" > CURRENT_TIMESTAMP(0)。 :TIMESTAMP WITHOUT TIME ZONE
AND "IS_ACTIVE" = 'Y' order by "CREATED_DT" desc
)的別名。
uj5u.com熱心網友回復:
可能會有很多問題。(rowcounts, hardwer, no index)
首先,表的行數是多少? 你之前是否插入了大量的行? (然后可以用REINDEX TABLE TABLE_NAME , 和VACUUM ANALYZE TABLE_NAME來幫助。)
檢查表的索引。
檢查這個列上的索引
為什么要在子選擇中選擇? 請排除。
你能用一個額外的where子句來消除distinct嗎?
請分享計劃和行數,我們可以說更多的細節。
EXPLAIN ANALIZE SELECT...
uj5u.com熱心網友回復:
你可以試試:
創建這個索引
在MZP_ADP.ALL_SERVICE_DETAILS上創建索引ALL_SERVICE_CMP_INDEX("ZIP_CODE", "MAKE_LIVE", "LOCATION_ID", "END_DATE", "IS_ACTIVE");
移除父選擇
洗掉唯一的(如果在選擇中至少有一個唯一的列)
uj5u.com熱心網友回復:
應用一些東西來提高性能
對表進行VACUUM FULL(它也重建索引)。但是,任何混亂的情況下都要執行重建索引
VACUUM (Full)
VACUUM (FULL, ANALYZE) table_name;
REINDEX TABLE table_name;
根據你的記憶體和服務器的配置,增加work_mem和maintain_work_mem。 配置
使用GROUP BY而不是DISTINCT(不同的比較慢)
洗掉子查詢中的ORDER BY。如果需要,則在外面使用它
用ZIP_CODE、LOCATION_ID、END_DATE列創建一個復合索引,并在WHERE子句中使用適當的排序。 在WHERE子句中使用適當的排序(因為MAKE_LIVE和IS_ACTIVE是標志型的,所以需要在索引中先加入 在索引中首先添加)
EXPLAIN ANALYZE QUERY,以檢查執行時間并在查詢中使用適當的索引
偽代碼:
SELECT columns
FROM (SELECT columns)
FROM table
WHERE 搜索列 as per 索引創建
GROUP BY WITHOUT aggregated COLUMNS) t
ORDER BY列 --如果需要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/325011.html
標籤:
