我有兩個查詢,插入和更新。我通過postgres控制檯與一個大型數據集做了一個基準測試,發現postgres沒有拿起索引。爲了解決這個問題 - 我禁用了這兩個查詢的seqscan並獲得了巨大的性能提升; Postgres能夠拿起索引在桌子上掃描。通過jdbc |設置enable_seqscan = off Postgres
問題: 我做同樣的事情通過JDBC
statement.executeUpdate("set enable_seqscan = off");
statement.executeUpdate("My_Insert_Query");
statement.executeUpdate("My_Update_Query");
statement.executeUpdate("set enable_seqscan = on");
但好像是Postgres的不轉彎seq_scan關閉和查詢採取了太多的時間來執行。
主表
Master_Id auto-generated
child_unique integer
Child Table
child_unique integer
Master_id integer
Insert into Master (child_unique) from Child as i WHERE NOT EXISTS (SELECT * from Master where Master.child_unique = i.child_unique);
Update Child set Master_id = Master.Master_id from Master where Master.child_unique = Child.child_unique;
對於每個孩子獨特的行主 - 我插入到我的主表,並得到自動生成的Master_ID並插入它放回子表中不存在。
這兩個表都有child_unique的索引。
索引在主表上被拾取,因爲它不在子表的情況下。 我是如何知道的?使用Postgres的pg_stat_all_indexes表。
有些參數只能由超級用戶更改(我不知道哪些參數),所以如果您的應用使用不同的用戶,那麼您在控制檯上可能會出現問題。另外建議不要關閉順序掃描,而是調整服務器的規劃器成本常量:http://www.postgresql.org/docs/9.1/interactive/runtime-config-query.html#RUNTIME-CONFIG-QUERY -CONSTANTS。如果您的數據庫幾乎完全符合內存要求,可以快速啓動,使random_page_cost等於seq_page_cost。另外請確保您的數據已被正確分析。 – Eelke 2012-03-02 06:57:54
你爲什麼不試着解決真正的問題?爲什麼PostgreSQL認爲使用索引不是一個好主意?您能向我們展示EXPLAIN和/或EXPLAIN ANALYSE的結果嗎? – 2012-03-02 07:03:49
您是否確認seqscan確實已關閉?關掉後是否檢查執行計劃? – 2012-03-02 17:41:21