查詢最佳化——查詢樹結構

瀚高PG实验室發表於2024-03-12

瀚高資料庫

文件用途

查詢樹作為PG最佳化器的輸入引數,瞭解此類資料結構,在此基礎上了解PG最佳化的規則。

詳細資訊

1.如何檢視查詢樹

第一種方式:修改postgres.conf配置檔案中下列引數,之後執行的查詢語句的查詢樹會在日誌檔案中顯示。

debug_print_parse = on     # 列印查詢樹debug_print_rewritten = off   # 列印重寫之後的查詢樹
debug_print_plan = off      # 列印執行計劃debug_pretty_print = on    # 結構化方式顯示查詢樹結構

第二種方式:elog_node_dispaly,在gdb的時候呼叫,或者程式碼中嵌入之後再編譯。比第一種方式好在可以列印多次,對比變化。

if(Debug_print_parse) //debug模式,輸出parse tree樹
  elog_node_display(LOG, "parse tree", root->parse,
	        Debug_pretty_print);

2. 透過具體sql看查詢樹

建表:

if(Debug_print_parse) //debug模式,輸出parse tree樹
  elog_node_display(LOG, "parse tree", root->parse,
	        Debug_pretty_print);

SQL:

SELECT * FROM student LEFT JOIN SCORE ON TRUE LEFT JOIN COURSE ON SCORE.cno = COURSE.cno;

查詢樹結構:


image.png

查詢樹展開(有的欄位沒顯示):

https://github.com/nullemp/postgres_notes/blob/master/image/sample13.node.jpg

3. 透過查詢樹認識查詢樹中的各個節點

RangeTblEntry:描述了查詢中出現的表,即FROM子句中的表。

jointree:PG顯示指定了兩個表的關係,即使用了join關鍵字,使用JoinExpr來表示連線關係,表示連線關係需要使用表相關資訊,需要RangeTblRef。

RangeTblRef:索引RangeTblEntry中表的位置的結構。

FromExpr:表示隱式的連線關係,PG中用逗號連線的兩個表,比如下邊:

SQL:

SELECT * FROM STUDENT, SCORE LEFT JOIN COURSE ON SCORE.cno = COURSE.cno;


image.png

join優先順序高於逗號,上圖中JOINEXPR表示表2 表3的連線關係,然後在跟表1做內連線。

最佳化器中子查詢提升會對jointree指向的遞迴結構進行調整,遞迴的入口是FROMEXPR中的fromlist,出口是RangeTbLRef。

圖中還有其它的節點型別,比如TARGETENTRY, VAR,在子連線提升中介紹。






來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/69994931/viewspace-3008739/,如需轉載,請註明出處,否則將追究法律責任。

相關文章