亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

防止PostgreSQL有時選擇錯誤的查詢計劃

防止PostgreSQL有時選擇錯誤的查詢計劃

肥皂起泡泡 2019-08-03 03:03:00
防止PostgreSQL有時選擇錯誤的查詢計劃對于使用PostgreSQL 8.4.9進行查詢的PostgreSQL性能,我遇到了一個奇怪的問題。此查詢是在3D卷中選擇一組點,使用LEFT OUTER JOIN若要添加存在關聯ID的相關ID列,請執行以下操作。的小變化x范圍會導致PostgreSQL選擇不同的查詢計劃,執行時間從0.01秒到50秒不等。這是一個有問題的查詢:SELECT treenode.id AS id,        treenode.parent_id AS parentid,        (treenode.location).x AS x,        (treenode.location).y AS y,        (treenode.location).z AS z,        treenode.confidence AS confidence,        treenode.user_id AS user_id,        treenode.radius AS radius,        ((treenode.location).z - 50) AS z_diff,        treenode_class_instance.class_instance_id AS skeleton_id  FROM treenode LEFT OUTER JOIN          (treenode_class_instance INNER JOIN           class_instance ON treenode_class_instance.class_instance_id    = class_instance.id                             AND class_instance.class_id = 7828307)        ON (treenode_class_instance.treenode_id = treenode.id                   AND treenode_class_instance.relation_id = 7828321)        WHERE treenode.project_id = 4     AND (treenode.location).x >= 8000     AND (treenode.location).x <= (8000 + 4736)     AND (treenode.location).y >= 22244     AND (treenode.location).y <= (22244 + 3248)     AND (treenode.location).z >= 0     AND (treenode.location).z <= 100   ORDER BY parentid DESC, id, z_diff   LIMIT 400;我不是解析這些查詢計劃的專家,但明顯的區別似乎在于x它使用的范圍是Hash Left Join為LEFT OUTER JOIN(這非???,而對于另一個范圍,它使用的是Nested Loop Left Join(這似乎很慢)。在這兩種情況下,查詢都返回大約90行。如果我做了SET ENABLE_NESTLOOP TO FALSE在查詢的慢版本之前,它運行得非??欤依斫庖话銇碚f,使用這種設置是個壞主意。.例如,我是否可以創建一個特定的索引,以使查詢計劃者更有可能選擇明顯更有效的策略?有人能提出為什么PostgreSQL的查詢規劃器會為其中一個查詢選擇這么糟糕的策略嗎?下面我已經包含了可能有幫助的模式的細節。
查看完整描述

3 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

如果查詢規劃者做了錯誤的決定,這主要是兩件事中的一件:

1.統計是不準確的。

你跑嗎?ANALYZE足夠的?在它的組合形式中也很流行VACUUM ANALYZE..如果自真空是ON(這是現代Postgres的默認設置),ANALYZE自動運行。但請考慮:

(前兩個答案仍然適用于Postgres 9.6。)

如果你的桌子是大的而數據分布是不規則,提高default_statistics_target也許會有幫助。或者說,只是設置統計目標相關欄(WHEREJOIN(基本上是查詢的子句):

ALTER TABLE ... ALTER COLUMN ... SET STATISTICS 400;  -- calibrate number

目標可以設定在0到10000之間;

ANALYZE在此之后(在相關的表格上)。

2.成本設置對規劃師來說,估計值已經取消了。

讀這一章計劃成本常數在手冊里。

看看這些章節默認統計量目標隨機頁成本在這個問題上一般有用的PostgreSQL Wiki頁面.

還有許多其他可能的原因,但這些是目前為止最常見的原因。



查看完整回答
反對 回復 2019-08-05
?
慕森卡

TA貢獻1806條經驗 獲得超8個贊

歐文對統計數字的評價。此外:

ORDER BY parentid DESC, id, z_diff

分揀

parentid DESC, id, z

可能會給樂觀主義者更多的洗牌空間。(我認為這不會有多大關系,因為這是最后一個學期,而且也不那么昂貴,但你可以試一試)




查看完整回答
反對 回復 2019-08-05
  • 3 回答
  • 0 關注
  • 740 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號