2024-05-08 postgres-查询树Query-分析

摘要:

pg的词法分析和语法分析使用的技术与mysql相同,此法分析使用bison,语法分析使用了flex。之后ANSI SQL句子被转换为查询树。

Query 结构体保存了文本类型的 SQL,经过语法分析后的分析结果,Query 结构体的成员与 SOL语句的各个子句基本一一对应。SOL语法分析主要是把一条完整的文本字符串分解为查询树上具有不同含义的 Ouery结构体的成员,以便于程序理解SOL语句。如程序判断 hasSubLinks 值为 TRUE,则表示 SOL 语句中含有子链接操作。

本文对查询树进行一定的分析。

相关上下文: 2024-05-08 postgres-调试及分析-记录-CSDN博客

原始的查询SQL:

SELECT * FROM  t1 LEFT JOIN t2 ON t2.a = t1.a WHERE t2.b < 5;

函数调用堆栈:

(gdb) bt
#0  create_scan_plan (root=0x2ce5808, best_path=0x2cfb508, flags=2) at createplan.c:558
#1  0x00000000007dbaa4 in create_plan_recurse (root=0x2ce5808, best_path=0x2cfb508, flags=2) at createplan.c:410
#2  0x00000000007e2777 in create_mergejoin_plan (root=0x2ce5808, best_path=0x2cfbee8) at createplan.c:4376
#3  0x00000000007dc862 in create_join_plan (root=0x2ce5808, best_path=0x2cfbee8) at createplan.c:1067
#4  0x00000000007dbac0 in create_plan_recurse (root=0x2ce5808, best_path=0x2cfbee8, flags=1) at createplan.c:415
#5  0x00000000007db9ba in create_plan (root=0x2ce5808, best_path=0x2cfbee8) at createplan.c:346
#6  0x00000000007ecfbf in standard_planner (parse=0x2c16948, query_string=0x2c15718 "SELECT * FROM  t1 LEFT JOIN t2 ON t2.a = t1.a;", cursorOptions=2048, boundParams=0x0)
    at planner.c:407
#7  0x00000000007ecd2a in planner (parse=0x2c16948, query_string=0x2c15718 "SELECT * FROM  t1 LEFT JOIN t2 ON t2.a = t1.a;", cursorOptions=2048, boundParams=0x0) at planner.c:271
#8  0x000000000090572b in pg_plan_query (querytree=0x2c16948, query_string=0x2c15718 "SELECT * FROM  t1 LEFT JOIN t2 ON t2.a = t1.a;", cursorOptions=2048, boundParams=0x0)
    at postgres.c:847
#9  0x0000000000905869 in pg_plan_queries (querytrees=0x2ce5728, query_string=0x2c15718 "SELECT * FROM  t1 LEFT JOIN t2 ON t2.a = t1.a;", cursorOptions=2048, boundParams=0x0)
    at postgres.c:939
#10 0x0000000000905bc0 in exec_simple_query (query_string=0x2c15718 "SELECT * FROM  t1 LEFT JOIN t2 ON t2.a = t1.a;") at postgres.c:1133
#11 0x000000000090a0ef in PostgresMain (argc=1, argv=0x7fff70e94eb0, dbname=0x2c42428 "d1", username=0x2c10a58 "kevin") at postgres.c:4496
#12 0x0000000000857a54 in BackendRun (port=0x2c39e30) at postmaster.c:4530
#13 0x00000000008573c1 in BackendStartup (port=0x2c39e30) at postmaster.c:4252
#14 0x0000000000853b10 in ServerLoop () at postmaster.c:1745
#15 0x00000000008533c9 in PostmasterMain (argc=1, argv=0x2c0ea10) at postmaster.c:1417
#16 0x0000000000760270 in main (argc=1, argv=0x2c0ea10) at main.c:209

查询树Query的结构体:

查询树(Query)又称语法分析树SOL语法分析模块对文本类型的 SOL 语句进行词法分析和语法分析后,得到的语法树。语法分析用于检查 SOL语句的语法(格式)是否正确:把SOL语句按语法进行格式分解(P的语法规则参见 src/backend/parser/gram.y文件)即可转化为查询树。
初步得到的查询树,还将进行语义处理。语义处理是检查 SOL语句中的对象是否符合数据库的用户模式(如表定义)以及对象表达的意义是否有效(如对一个数值型列做LIKE操作是无意义的)等。
查询语句通过语法分析器形成查询树传给查询优化器的planner 函数进行优化。

/*****************************************************************************
 *	Query Tree
 *****************************************************************************/

/*
 * Query -
 *	  Parse analysis turns all statements into a Query tree
 *	  for further processing by the rewriter and planner.
 *
 *	  Utility statements (i.e. non-optimizable statements) have the
 *	  utilityStmt field set, and the rest of the Query is mostly dummy.
 *
 *	  Planning converts a Query tree into a Plan tree headed by a PlannedStmt
 *	  node --- the Query structure is not used by the executor.
 */
typedef struct Query
{
	NodeTag		type;

	CmdType		commandType;	/* select|insert|update|delete|utility */

	QuerySource querySource;	/* where did I come from? */

	uint64		queryId;		/* query identifier (can be set by plugins) */

	bool		canSetTag;		/* do I set the command result tag? */

	Node	   *utilityStmt;	/* non-null if commandType == CMD_UTILITY */

	int			resultRelation; /* rtable index of target relation for
								 * INSERT/UPDATE/DELETE; 0 for SELECT */

	bool		hasAggs;		/* has aggregates in tlist or havingQual */
	bool		hasWindowFuncs; /* has window functions in tlist */
	bool		hasTargetSRFs;	/* has set-returning functions in tlist */
	bool		hasSubLinks;	/* has subquery SubLink */
	bool		hasDistinctOn;	/* distinctClause is from DISTINCT ON */
	bool		hasRecursive;	/* WITH RECURSIVE was specified */
	bool		hasModifyingCTE;	/* has INSERT/UPDATE/DELETE in WITH */
	bool		hasForUpdate;	/* FOR [KEY] UPDATE/SHARE was specified */
	bool		hasRowSecurity; /* rewriter has applied some RLS policy */

	bool		isReturn;		/* is a RETURN statement */

	List	   *cteList;		/* WITH list (of CommonTableExpr's) */

	List	   *rtable;			/* list of range table entries */
	FromExpr   *jointree;		/* table join tree (FROM and WHERE clauses) */

	List	   *targetList;		/* target list (of TargetEntry) */

	OverridingKind override;	/* OVERRIDING clause */

	OnConflictExpr *onConflict; /* ON CONFLICT DO [NOTHING | UPDATE] */

	List	   *returningList;	/* return-values list (of TargetEntry) */

	List	   *groupClause;	/* a list of SortGroupClause's */
	bool		groupDistinct;	/* is the group by clause distinct? */

	List	   *groupingSets;	/* a list of GroupingSet's if present */

	Node	   *havingQual;		/* qualifications applied to groups */

	List	   *windowClause;	/* a list of WindowClause's */

	List	   *distinctClause; /* a list of SortGroupClause's */

	List	   *sortClause;		/* a list of SortGroupClause's */

	Node	   *limitOffset;	/* # of result tuples to skip (int8 expr) */
	Node	   *limitCount;		/* # of result tuples to return (int8 expr) */
	LimitOption limitOption;	/* limit type */

	List	   *rowMarks;		/* a list of RowMarkClause's */

	Node	   *setOperations;	/* set-operation tree if this is top level of
								 * a UNION/INTERSECT/EXCEPT query */

	List	   *constraintDeps; /* a list of pg_constraint OIDs that the query
								 * depends on to be semantically valid */

	List	   *withCheckOptions;	/* a list of WithCheckOption's (added
									 * during rewrite) */

	/*
	 * The following two fields identify the portion of the source text string
	 * containing this query.  They are typically only populated in top-level
	 * Queries, not in sub-queries.  When not set, they might both be zero, or
	 * both be -1 meaning "unknown".
	 */
	int			stmt_location;	/* start location, or -1 if unknown */
	int			stmt_len;		/* length in bytes; 0 means "rest of string" */
} Query;

 在执行堆栈中打印Query查询树:

(gdb) f 7
#7  0x00000000007ecd2a in planner (parse=0x134b9a8, query_string=0x134a598 "SELECT * FROM  t1 LEFT JOIN t2 ON t2.a = t1.a WHERE t2.b < 5;", cursorOptions=2048, boundParams=0x0)
    at planner.c:271
271			result = standard_planner(parse, query_string, cursorOptions, boundParams);
(gdb) p parse[0]
$1 = {
  type = T_Query, 
  commandType = CMD_SELECT, 
  querySource = QSRC_ORIGINAL, 
  queryId = 0, 
  canSetTag = true, 
  utilityStmt = 0x0, 
  resultRelation = 0, 
  hasAggs = false, 
  hasWindowFuncs = false, 
  hasTargetSRFs = false, 
  hasSubLinks = false, 
  hasDistinctOn = false, 
  hasRecursive = false, 
  hasModifyingCTE = false, 
  hasForUpdate = false, 
  hasRowSecurity = false, 
  isReturn = false, 
  cteList = 0x0, 
  rtable = 0x134bcd0, 
  jointree = 0x1404a98, 
  targetList = 0x142a728, 
  override = OVERRIDING_NOT_SET, 
  onConflict = 0x0, 
  returningList = 0x0, 
  groupClause = 0x0, 
  groupDistinct = false, 
  groupingSets = 0x0, 
  havingQual = 0x0, 
  windowClause = 0x0, 
  distinctClause = 0x0, 
  sortClause = 0x0, 
  limitOffset = 0x0, 
  limitCount = 0x0, 
  limitOption = LIMIT_OPTION_COUNT, 
  rowMarks = 0x0, 
  setOperations = 0x0, 
  constraintDeps = 0x0, 
--Type <RET> for more, q to quit, c to continue without paging--
  withCheckOptions = 0x0, 
  stmt_location = 0, 
  stmt_len = 60
}

修改配置文件 postgresql.conf  日志记录parse

1. 打开parse及相关的日志

debug_print_parse = on
debug_print_rewritten = on
debug_print_plan = on
debug_pretty_print = on

2. 日志文件

logging_collector = on		# Enable capturing of stderr and csvlog
log_directory = 'log'			# directory where log files are written,
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'	# log file name pattern,
log_file_mode = 0600			# creation mode for log files,

3. 日志文件位置

  1. 在  $PGDATA/log_directory  目录下
  2. $PGDATA为初始化时设置的data目录

parse后的Query结构体的内容:


2024-05-08 04:04:40.223 EDT [42965] LOG:  parse tree:
2024-05-08 04:04:40.223 EDT [42965] DETAIL:     {QUERY 
	   :commandType 1 
	   :querySource 0 
	   :canSetTag true 
	   :utilityStmt <> 
	   :resultRelation 0 
	   :hasAggs false 
	   :hasWindowFuncs false 
	   :hasTargetSRFs false 
	   :hasSubLinks false 
	   :hasDistinctOn false 
	   :hasRecursive false 
	   :hasModifyingCTE false 
	   :hasForUpdate false 
	   :hasRowSecurity false 
	   :isReturn false 
	   :cteList <> 
	   :rtable (
	      {RTE 
	      :alias <> 
	      :eref 
	         {ALIAS 
	         :aliasname t1 
	         :colnames ("a" "b")
	         }
	      :rtekind 0 
	      :relid 16385 
	      :relkind r 
	      :rellockmode 1 
	      :tablesample <> 
	      :lateral false 
	      :inh true 
	      :inFromCl true 
	      :requiredPerms 2 
	      :checkAsUser 0 
	      :selectedCols (b 8 9)
	      :insertedCols (b)
	      :updatedCols (b)
	      :extraUpdatedCols (b)
	      :securityQuals <>
	      }
	      {RTE 
	      :alias <> 
	      :eref 
	         {ALIAS 
	         :aliasname t2 
	         :colnames ("a" "b")
	         }
	      :rtekind 0 
	      :relid 16388 
	      :relkind r 
	      :rellockmode 1 
	      :tablesample <> 
	      :lateral false 
	      :inh true 
	      :inFromCl true 
	      :requiredPerms 2 
	      :checkAsUser 0 
	      :selectedCols (b 8 9)
	      :insertedCols (b)
	      :updatedCols (b)
	      :extraUpdatedCols (b)
	      :securityQuals <>
	      }
	      {RTE 
	      :alias <> 
	      :eref 
	         {ALIAS 
	         :aliasname unnamed_join 
	         :colnames ("a" "b" "a" "b")
	         }
	      :rtekind 2 
	      :jointype 1 
	      :joinmergedcols 0 
	      :joinaliasvars (
	         {VAR 
	         :varno 1 
	         :varattno 1 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 1 
	         :varattnosyn 1 
	         :location -1
	         }
	         {VAR 
	         :varno 1 
	         :varattno 2 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 1 
	         :varattnosyn 2 
	         :location -1
	         }
	         {VAR 
	         :varno 2 
	         :varattno 1 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 2 
	         :varattnosyn 1 
	         :location -1
	         }
	         {VAR 
	         :varno 2 
	         :varattno 2 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 2 
	         :varattnosyn 2 
	         :location -1
	         }
	      )
	      :joinleftcols (i 1 2)
	      :joinrightcols (i 1 2)
	      :join_using_alias <> 
	      :lateral false 
	      :inh false 
	      :inFromCl true 
	      :requiredPerms 0 
	      :checkAsUser 0 
	      :selectedCols (b)
	      :insertedCols (b)
	      :updatedCols (b)
	      :extraUpdatedCols (b)
	      :securityQuals <>
	      }
	   )
	   :jointree 
	      {FROMEXPR 
	      :fromlist (
	         {JOINEXPR 
	         :jointype 1 
	         :isNatural false 
	         :larg 
	            {RANGETBLREF 
	            :rtindex 1
	            }
	         :rarg 
	            {RANGETBLREF 
	            :rtindex 2
	            }
	         :usingClause <> 
	         :join_using_alias <> 
	         :quals 
	            {OPEXPR 
	            :opno 96 
	            :opfuncid 65 
	            :opresulttype 16 
	            :opretset false 
	            :opcollid 0 
	            :inputcollid 0 
	            :args (
	               {VAR 
	               :varno 2 
	               :varattno 1 
	               :vartype 23 
	               :vartypmod -1 
	               :varcollid 0 
	               :varlevelsup 0 
	               :varnosyn 2 
	               :varattnosyn 1 
	               :location 34
	               }
	               {VAR 
	               :varno 1 
	               :varattno 1 
	               :vartype 23 
	               :vartypmod -1 
	               :varcollid 0 
	               :varlevelsup 0 
	               :varnosyn 1 
	               :varattnosyn 1 
	               :location 41
	               }
	            )
	            :location 39
	            }
	         :alias <> 
	         :rtindex 3
	         }
	      )
	      :quals 
	         {OPEXPR 
	         :opno 97 
	         :opfuncid 66 
	         :opresulttype 16 
	         :opretset false 
	         :opcollid 0 
	         :inputcollid 0 
	         :args (
	            {VAR 
	            :varno 2 
	            :varattno 2 
	            :vartype 23 
	            :vartypmod -1 
	            :varcollid 0 
	            :varlevelsup 0 
	            :varnosyn 2 
	            :varattnosyn 2 
	            :location 52
	            }
	            {CONST 
	            :consttype 23 
	            :consttypmod -1 
	            :constcollid 0 
	            :constlen 4 
	            :constbyval true 
	            :constisnull false 
	            :location 59 
	            :constvalue 4 [ 5 0 0 0 0 0 0 0 ]
	            }
	         )
	         :location 57
	         }
	      }
	   :targetList (
	      {TARGETENTRY 
	      :expr 
	         {VAR 
	         :varno 1 
	         :varattno 1 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 1 
	         :varattnosyn 1 
	         :location 7
	         }
	      :resno 1 
	      :resname a 
	      :ressortgroupref 0 
	      :resorigtbl 16385 
	      :resorigcol 1 
	      :resjunk false
	      }
	      {TARGETENTRY 
	      :expr 
	         {VAR 
	         :varno 1 
	         :varattno 2 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 1 
	         :varattnosyn 2 
	         :location 7
	         }
	      :resno 2 
	      :resname b 
	      :ressortgroupref 0 
	      :resorigtbl 16385 
	      :resorigcol 2 
	      :resjunk false
	      }
	      {TARGETENTRY 
	      :expr 
	         {VAR 
	         :varno 2 
	         :varattno 1 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 2 
	         :varattnosyn 1 
	         :location 7
	         }
	      :resno 3 
	      :resname a 
	      :ressortgroupref 0 
	      :resorigtbl 16388 
	      :resorigcol 1 
	      :resjunk false
	      }
	      {TARGETENTRY 
	      :expr 
	         {VAR 
	         :varno 2 
	         :varattno 2 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 2 
	         :varattnosyn 2 
	         :location 7
	         }
	      :resno 4 
	      :resname b 
	      :ressortgroupref 0 
	      :resorigtbl 16388 
	      :resorigcol 2 
	      :resjunk false
	      }
	   )
	   :override 0 
	   :onConflict <> 
	   :returningList <> 
	   :groupClause <> 
	   :groupDistinct false 
	   :groupingSets <> 
	   :havingQual <> 
	   :windowClause <> 
	   :distinctClause <> 
	   :sortClause <> 
	   :limitOffset <> 
	   :limitCount <> 
	   :limitOption 0 
	   :rowMarks <> 
	   :setOperations <> 
	   :constraintDeps <> 
	   :withCheckOptions <> 
	   :stmt_location 0 
	   :stmt_len 60
	   }
	
2024-05-08 04:04:40.223 EDT [42965] STATEMENT:  SELECT * FROM  t1 LEFT JOIN t2 ON t2.a = t1.a WHERE t2.b < 5;
2024-05-08 04:04:40.223 EDT [42965] LOG:  rewritten parse tree:
2024-05-08 04:04:40.223 EDT [42965] DETAIL:  (
	   {QUERY 
	   :commandType 1 
	   :querySource 0 
	   :canSetTag true 
	   :utilityStmt <> 
	   :resultRelation 0 
	   :hasAggs false 
	   :hasWindowFuncs false 
	   :hasTargetSRFs false 
	   :hasSubLinks false 
	   :hasDistinctOn false 
	   :hasRecursive false 
	   :hasModifyingCTE false 
	   :hasForUpdate false 
	   :hasRowSecurity false 
	   :isReturn false 
	   :cteList <> 
	   :rtable (
	      {RTE 
	      :alias <> 
	      :eref 
	         {ALIAS 
	         :aliasname t1 
	         :colnames ("a" "b")
	         }
	      :rtekind 0 
	      :relid 16385 
	      :relkind r 
	      :rellockmode 1 
	      :tablesample <> 
	      :lateral false 
	      :inh true 
	      :inFromCl true 
	      :requiredPerms 2 
	      :checkAsUser 0 
	      :selectedCols (b 8 9)
	      :insertedCols (b)
	      :updatedCols (b)
	      :extraUpdatedCols (b)
	      :securityQuals <>
	      }
	      {RTE 
	      :alias <> 
	      :eref 
	         {ALIAS 
	         :aliasname t2 
	         :colnames ("a" "b")
	         }
	      :rtekind 0 
	      :relid 16388 
	      :relkind r 
	      :rellockmode 1 
	      :tablesample <> 
	      :lateral false 
	      :inh true 
	      :inFromCl true 
	      :requiredPerms 2 
	      :checkAsUser 0 
	      :selectedCols (b 8 9)
	      :insertedCols (b)
	      :updatedCols (b)
	      :extraUpdatedCols (b)
	      :securityQuals <>
	      }
	      {RTE 
	      :alias <> 
	      :eref 
	         {ALIAS 
	         :aliasname unnamed_join 
	         :colnames ("a" "b" "a" "b")
	         }
	      :rtekind 2 
	      :jointype 1 
	      :joinmergedcols 0 
	      :joinaliasvars (
	         {VAR 
	         :varno 1 
	         :varattno 1 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 1 
	         :varattnosyn 1 
	         :location -1
	         }
	         {VAR 
	         :varno 1 
	         :varattno 2 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 1 
	         :varattnosyn 2 
	         :location -1
	         }
	         {VAR 
	         :varno 2 
	         :varattno 1 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 2 
	         :varattnosyn 1 
	         :location -1
	         }
	         {VAR 
	         :varno 2 
	         :varattno 2 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 2 
	         :varattnosyn 2 
	         :location -1
	         }
	      )
	      :joinleftcols (i 1 2)
	      :joinrightcols (i 1 2)
	      :join_using_alias <> 
	      :lateral false 
	      :inh false 
	      :inFromCl true 
	      :requiredPerms 0 
	      :checkAsUser 0 
	      :selectedCols (b)
	      :insertedCols (b)
	      :updatedCols (b)
	      :extraUpdatedCols (b)
	      :securityQuals <>
	      }
	   )
	   :jointree 
	      {FROMEXPR 
	      :fromlist (
	         {JOINEXPR 
	         :jointype 1 
	         :isNatural false 
	         :larg 
	            {RANGETBLREF 
	            :rtindex 1
	            }
	         :rarg 
	            {RANGETBLREF 
	            :rtindex 2
	            }
	         :usingClause <> 
	         :join_using_alias <> 
	         :quals 
	            {OPEXPR 
	            :opno 96 
	            :opfuncid 65 
	            :opresulttype 16 
	            :opretset false 
	            :opcollid 0 
	            :inputcollid 0 
	            :args (
	               {VAR 
	               :varno 2 
	               :varattno 1 
	               :vartype 23 
	               :vartypmod -1 
	               :varcollid 0 
	               :varlevelsup 0 
	               :varnosyn 2 
	               :varattnosyn 1 
	               :location 34
	               }
	               {VAR 
	               :varno 1 
	               :varattno 1 
	               :vartype 23 
	               :vartypmod -1 
	               :varcollid 0 
	               :varlevelsup 0 
	               :varnosyn 1 
	               :varattnosyn 1 
	               :location 41
	               }
	            )
	            :location 39
	            }
	         :alias <> 
	         :rtindex 3
	         }
	      )
	      :quals 
	         {OPEXPR 
	         :opno 97 
	         :opfuncid 66 
	         :opresulttype 16 
	         :opretset false 
	         :opcollid 0 
	         :inputcollid 0 
	         :args (
	            {VAR 
	            :varno 2 
	            :varattno 2 
	            :vartype 23 
	            :vartypmod -1 
	            :varcollid 0 
	            :varlevelsup 0 
	            :varnosyn 2 
	            :varattnosyn 2 
	            :location 52
	            }
	            {CONST 
	            :consttype 23 
	            :consttypmod -1 
	            :constcollid 0 
	            :constlen 4 
	            :constbyval true 
	            :constisnull false 
	            :location 59 
	            :constvalue 4 [ 5 0 0 0 0 0 0 0 ]
	            }
	         )
	         :location 57
	         }
	      }
	   :targetList (
	      {TARGETENTRY 
	      :expr 
	         {VAR 
	         :varno 1 
	         :varattno 1 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 1 
	         :varattnosyn 1 
	         :location 7
	         }
	      :resno 1 
	      :resname a 
	      :ressortgroupref 0 
	      :resorigtbl 16385 
	      :resorigcol 1 
	      :resjunk false
	      }
	      {TARGETENTRY 
	      :expr 
	         {VAR 
	         :varno 1 
	         :varattno 2 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 1 
	         :varattnosyn 2 
	         :location 7
	         }
	      :resno 2 
	      :resname b 
	      :ressortgroupref 0 
	      :resorigtbl 16385 
	      :resorigcol 2 
	      :resjunk false
	      }
	      {TARGETENTRY 
	      :expr 
	         {VAR 
	         :varno 2 
	         :varattno 1 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 2 
	         :varattnosyn 1 
	         :location 7
	         }
	      :resno 3 
	      :resname a 
	      :ressortgroupref 0 
	      :resorigtbl 16388 
	      :resorigcol 1 
	      :resjunk false
	      }
	      {TARGETENTRY 
	      :expr 
	         {VAR 
	         :varno 2 
	         :varattno 2 
	         :vartype 23 
	         :vartypmod -1 
	         :varcollid 0 
	         :varlevelsup 0 
	         :varnosyn 2 
	         :varattnosyn 2 
	         :location 7
	         }
	      :resno 4 
	      :resname b 
	      :ressortgroupref 0 
	      :resorigtbl 16388 
	      :resorigcol 2 
	      :resjunk false
	      }
	   )
	   :override 0 
	   :onConflict <> 
	   :returningList <> 
	   :groupClause <> 
	   :groupDistinct false 
	   :groupingSets <> 
	   :havingQual <> 
	   :windowClause <> 
	   :distinctClause <> 
	   :sortClause <> 
	   :limitOffset <> 
	   :limitCount <> 
	   :limitOption 0 
	   :rowMarks <> 
	   :setOperations <> 
	   :constraintDeps <> 
	   :withCheckOptions <> 
	   :stmt_location 0 
	   :stmt_len 60
	   }
	)
	
2024-05-08 04:04:40.223 EDT [42965] STATEMENT:  SELECT * FROM  t1 LEFT JOIN t2 ON t2.a = t1.a WHERE t2.b < 5;
2024-05-08 04:04:40.223 EDT [42965] LOG:  plan:
2024-05-08 04:04:40.223 EDT [42965] DETAIL:     {PLANNEDSTMT 
	   :commandType 1 
	   :queryId 0 
	   :hasReturning false 
	   :hasModifyingCTE false 
	   :canSetTag true 
	   :transientPlan false 
	   :dependsOnRole false 
	   :parallelModeNeeded false 
	   :jitFlags 0 
	   :planTree 
	      {MERGEJOIN 
	      :startup_cost 232.74 
	      :total_cost 364.14 
	      :plan_rows 8509 
	      :plan_width 16 
	      :parallel_aware false 
	      :parallel_safe true 
	      :async_capable false 
	      :plan_node_id 0 
	      :targetlist (
	         {TARGETENTRY 
	         :expr 
	            {VAR 
	            :varno 65000 
	            :varattno 1 
	            :vartype 23 
	            :vartypmod -1 
	            :varcollid 0 
	            :varlevelsup 0 
	            :varnosyn 1 
	            :varattnosyn 1 
	            :location 7
	            }
	         :resno 1 
	         :resname a 
	         :ressortgroupref 0 
	         :resorigtbl 16385 
	         :resorigcol 1 
	         :resjunk false
	         }
	         {TARGETENTRY 
	         :expr 
	            {VAR 
	            :varno 65000 
	            :varattno 2 
	            :vartype 23 
	            :vartypmod -1 
	            :varcollid 0 
	            :varlevelsup 0 
	            :varnosyn 1 
	            :varattnosyn 2 
	            :location 7
	            }
	         :resno 2 
	         :resname b 
	         :ressortgroupref 0 
	         :resorigtbl 16385 
	         :resorigcol 2 
	         :resjunk false
	         }
	         {TARGETENTRY 
	         :expr 
	            {VAR 
	            :varno 65001 
	            :varattno 1 
	            :vartype 23 
	            :vartypmod -1 
	            :varcollid 0 
	            :varlevelsup 0 
	            :varnosyn 2 
	            :varattnosyn 1 
	            :location 7
	            }
	         :resno 3 
	         :resname a 
	         :ressortgroupref 0 
	         :resorigtbl 16388 
	         :resorigcol 1 
	         :resjunk false
	         }
	         {TARGETENTRY 
	         :expr 
	            {VAR 
	            :varno 65001 
	            :varattno 2 
	            :vartype 23 
	            :vartypmod -1 
	            :varcollid 0 
	            :varlevelsup 0 
	            :varnosyn 2 
	            :varattnosyn 2 
	            :location 7
	            }
	         :resno 4 
	         :resname b 
	         :ressortgroupref 0 
	         :resorigtbl 16388 
	         :resorigcol 2 
	         :resjunk false
	         }
	      )
	      :qual <> 
	      :lefttree 
	         {SORT 
	         :startup_cost 74.23 
	         :total_cost 76.11 
	         :plan_rows 753 
	         :plan_width 8 
	         :parallel_aware false 
	         :parallel_safe true 
	         :async_capable false 
	         :plan_node_id 1 
	         :targetlist (
	            {TARGETENTRY 
	            :expr 
	               {VAR 
	               :varno 65001 
	               :varattno 1 
	               :vartype 23 
	               :vartypmod -1 
	               :varcollid 0 
	               :varlevelsup 0 
	               :varnosyn 2 
	               :varattnosyn 1 
	               :location -1
	               }
	            :resno 1 
	            :resname <> 
	            :ressortgroupref 0 
	            :resorigtbl 0 
	            :resorigcol 0 
	            :resjunk false
	            }
	            {TARGETENTRY 
	            :expr 
	               {VAR 
	               :varno 65001 
	               :varattno 2 
	               :vartype 23 
	               :vartypmod -1 
	               :varcollid 0 
	               :varlevelsup 0 
	               :varnosyn 2 
	               :varattnosyn 2 
	               :location -1
	               }
	            :resno 2 
	            :resname <> 
	            :ressortgroupref 0 
	            :resorigtbl 0 
	            :resorigcol 0 
	            :resjunk false
	            }
	         )
	         :qual <> 
	         :lefttree 
	            {SEQSCAN 
	            :startup_cost 0.00 
	            :total_cost 38.25 
	            :plan_rows 753 
	            :plan_width 8 
	            :parallel_aware false 
	            :parallel_safe true 
	            :async_capable false 
	            :plan_node_id 2 
	            :targetlist (
	               {TARGETENTRY 
	               :expr 
	                  {VAR 
	                  :varno 2 
	                  :varattno 1 
	                  :vartype 23 
	                  :vartypmod -1 
	                  :varcollid 0 
	                  :varlevelsup 0 
	                  :varnosyn 2 
	                  :varattnosyn 1 
	                  :location 7
	                  }
	               :resno 1 
	               :resname <> 
	               :ressortgroupref 0 
	               :resorigtbl 0 
	               :resorigcol 0 
	               :resjunk false
	               }
	               {TARGETENTRY 
	               :expr 
	                  {VAR 
	                  :varno 2 
	                  :varattno 2 
	                  :vartype 23 
	                  :vartypmod -1 
	                  :varcollid 0 
	                  :varlevelsup 0 
	                  :varnosyn 2 
	                  :varattnosyn 2 
	                  :location 7
	                  }
	               :resno 2 
	               :resname <> 
	               :ressortgroupref 0 
	               :resorigtbl 0 
	               :resorigcol 0 
	               :resjunk false
	               }
	            )
	            :qual (
	               {OPEXPR 
	               :opno 97 
	               :opfuncid 66 
	               :opresulttype 16 
	               :opretset false 
	               :opcollid 0 
	               :inputcollid 0 
	               :args (
	                  {VAR 
	                  :varno 2 
	                  :varattno 2 
	                  :vartype 23 
	                  :vartypmod -1 
	                  :varcollid 0 
	                  :varlevelsup 0 
	                  :varnosyn 2 
	                  :varattnosyn 2 
	                  :location 52
	                  }
	                  {CONST 
	                  :consttype 23 
	                  :consttypmod -1 
	                  :constcollid 0 
	                  :constlen 4 
	                  :constbyval true 
	                  :constisnull false 
	                  :location 59 
	                  :constvalue 4 [ 5 0 0 0 0 0 0 0 ]
	                  }
	               )
	               :location 57
	               }
	            )
	            :lefttree <> 
	            :righttree <> 
	            :initPlan <> 
	            :extParam (b)
	            :allParam (b)
	            :scanrelid 2
	            }
	         :righttree <> 
	         :initPlan <> 
	         :extParam (b)
	         :allParam (b)
	         :numCols 1 
	         :sortColIdx  1 
	         :sortOperators  97 
	         :collations  0 
	         :nullsFirst  false
	         }
	      :righttree 
	         {SORT 
	         :startup_cost 158.51 
	         :total_cost 164.16 
	         :plan_rows 2260 
	         :plan_width 8 
	         :parallel_aware false 
	         :parallel_safe true 
	         :async_capable false 
	         :plan_node_id 3 
	         :targetlist (
	            {TARGETENTRY 
	            :expr 
	               {VAR 
	               :varno 65001 
	               :varattno 1 
	               :vartype 23 
	               :vartypmod -1 
	               :varcollid 0 
	               :varlevelsup 0 
	               :varnosyn 1 
	               :varattnosyn 1 
	               :location -1
	               }
	            :resno 1 
	            :resname <> 
	            :ressortgroupref 0 
	            :resorigtbl 0 
	            :resorigcol 0 
	            :resjunk false
	            }
	            {TARGETENTRY 
	            :expr 
	               {VAR 
	               :varno 65001 
	               :varattno 2 
	               :vartype 23 
	               :vartypmod -1 
	               :varcollid 0 
	               :varlevelsup 0 
	               :varnosyn 1 
	               :varattnosyn 2 
	               :location -1
	               }
	            :resno 2 
	            :resname <> 
	            :ressortgroupref 0 
	            :resorigtbl 0 
	            :resorigcol 0 
	            :resjunk false
	            }
	         )
	         :qual <> 
	         :lefttree 
	            {SEQSCAN 
	            :startup_cost 0.00 
	            :total_cost 32.60 
	            :plan_rows 2260 
	            :plan_width 8 
	            :parallel_aware false 
	            :parallel_safe true 
	            :async_capable false 
	            :plan_node_id 4 
	            :targetlist (
	               {TARGETENTRY 
	               :expr 
	                  {VAR 
	                  :varno 1 
	                  :varattno 1 
	                  :vartype 23 
	                  :vartypmod -1 
	                  :varcollid 0 
	                  :varlevelsup 0 
	                  :varnosyn 1 
	                  :varattnosyn 1 
	                  :location 7
	                  }
	               :resno 1 
	               :resname <> 
	               :ressortgroupref 0 
	               :resorigtbl 0 
	               :resorigcol 0 
	               :resjunk false
	               }
	               {TARGETENTRY 
	               :expr 
	                  {VAR 
	                  :varno 1 
	                  :varattno 2 
	                  :vartype 23 
	                  :vartypmod -1 
	                  :varcollid 0 
	                  :varlevelsup 0 
	                  :varnosyn 1 
	                  :varattnosyn 2 
	                  :location 7
	                  }
	               :resno 2 
	               :resname <> 
	               :ressortgroupref 0 
	               :resorigtbl 0 
	               :resorigcol 0 
	               :resjunk false
	               }
	            )
	            :qual <> 
	            :lefttree <> 
	            :righttree <> 
	            :initPlan <> 
	            :extParam (b)
	            :allParam (b)
	            :scanrelid 1
	            }
	         :righttree <> 
	         :initPlan <> 
	         :extParam (b)
	         :allParam (b)
	         :numCols 1 
	         :sortColIdx  1 
	         :sortOperators  97 
	         :collations  0 
	         :nullsFirst  false
	         }
	      :initPlan <> 
	      :extParam (b)
	      :allParam (b)
	      :jointype 0 
	      :inner_unique false 
	      :joinqual <> 
	      :skip_mark_restore false 
	      :mergeclauses (
	         {OPEXPR 
	         :opno 96 
	         :opfuncid 65 
	         :opresulttype 16 
	         :opretset false 
	         :opcollid 0 
	         :inputcollid 0 
	         :args (
	            {VAR 
	            :varno 65001 
	            :varattno 1 
	            :vartype 23 
	            :vartypmod -1 
	            :varcollid 0 
	            :varlevelsup 0 
	            :varnosyn 2 
	            :varattnosyn 1 
	            :location 34
	            }
	            {VAR 
	            :varno 65000 
	            :varattno 1 
	            :vartype 23 
	            :vartypmod -1 
	            :varcollid 0 
	            :varlevelsup 0 
	            :varnosyn 1 
	            :varattnosyn 1 
	            :location 41
	            }
	         )
	         :location -1
	         }
	      )
	      :mergeFamilies  1976 
	      :mergeCollations  0 
	      :mergeStrategies  1 
	      :mergeNullsFirst  false
	      }
	   :rtable (
	      {RTE 
	      :alias <> 
	      :eref 
	         {ALIAS 
	         :aliasname t1 
	         :colnames ("a" "b")
	         }
	      :rtekind 0 
	      :relid 16385 
	      :relkind r 
	      :rellockmode 1 
	      :tablesample <> 
	      :lateral false 
	      :inh false 
	      :inFromCl true 
	      :requiredPerms 2 
	      :checkAsUser 0 
	      :selectedCols (b 8 9)
	      :insertedCols (b)
	      :updatedCols (b)
	      :extraUpdatedCols (b)
	      :securityQuals <>
	      }
	      {RTE 
	      :alias <> 
	      :eref 
	         {ALIAS 
	         :aliasname t2 
	         :colnames ("a" "b")
	         }
	      :rtekind 0 
	      :relid 16388 
	      :relkind r 
	      :rellockmode 1 
	      :tablesample <> 
	      :lateral false 
	      :inh false 
	      :inFromCl true 
	      :requiredPerms 2 
	      :checkAsUser 0 
	      :selectedCols (b 8 9)
	      :insertedCols (b)
	      :updatedCols (b)
	      :extraUpdatedCols (b)
	      :securityQuals <>
	      }
	      {RTE 
	      :alias <> 
	      :eref 
	         {ALIAS 
	         :aliasname unnamed_join 
	         :colnames ("a" "b" "a" "b")
	         }
	      :rtekind 2 
	      :jointype 0 
	      :joinmergedcols 0 
	      :joinaliasvars <> 
	      :joinleftcols <> 
	      :joinrightcols <> 
	      :join_using_alias <> 
	      :lateral false 
	      :inh false 
	      :inFromCl true 
	      :requiredPerms 0 
	      :checkAsUser 0 
	      :selectedCols (b)
	      :insertedCols (b)
	      :updatedCols (b)
	      :extraUpdatedCols (b)
	      :securityQuals <>
	      }
	   )
	   :resultRelations <> 
	   :appendRelations <> 
	   :subplans <> 
	   :rewindPlanIDs (b)
	   :rowMarks <> 
	   :relationOids (o 16385 16388)
	   :invalItems <> 
	   :paramExecTypes <> 
	   :utilityStmt <> 
	   :stmt_location 0 
	   :stmt_len 60
	   }
	
2024-05-08 04:04:40.223 EDT [42965] STATEMENT:  SELECT * FROM  t1 LEFT JOIN t2 ON t2.a = t1.a WHERE t2.b < 5;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/608334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 147. 对链表进行插入排序

目录 1.原题链接&#xff1a; 2.从前往后插入结点&#xff1a; 代码实现&#xff1a; 3.提交结果&#xff1a; 4.读书分享&#xff1a; 1.原题链接&#xff1a; 147. 对链表进行插入排序 2.从前往后插入结点&#xff1a; 对于本题&#xff0c;我们可以以头结点作为参考…

【Leetcode】八大排序

总述 插入排序&#xff1a;直接插入排序&#xff1b;希尔排序&#xff1b; 选择排序&#xff1a;简单选择排序&#xff1b;堆排序&#xff1b; 交换排序&#xff1a;冒泡排序&#xff1b;快速排序&#xff1b; 归并排序&#xff1b; 桶排序/基数排序&#xff1b; 直接插入排序 …

NVIDIA Omniverse Cloud API支持数字孪生开发,可解决复杂AI问题 | 最新快讯

在全球范围内&#xff0c;价值超过 50 万亿美元的重工业市场&#xff0c;正在竞相实现数字化。 基于此&#xff0c;为帮助数字孪生技术更好地赋能千行百业&#xff0c;AI 企业 NVIDIA 在架构底层算力的同时&#xff0c;也搭建了 NVIDIA AI Enterprise 和 Omniverse 两大平台。 …

【隧道篇 / WAN优化】(7.4) ❀ 03. WAN优化的原理 ❀ FortiGate 防火墙

【简介】相信对WAN优化感兴趣的人都会有疑问&#xff0c;WAN优化真的有作用吗&#xff1f;如果真的有作用&#xff0c;那是根据什么原理呢&#xff1f;让我们来更深入的了解一下。 客户端和服务器端 其实很多人在一开始看到WAN优化这个词&#xff0c;就自然的以为上网速度太慢&…

基于51单片机的智能垃圾桶仿真设计( proteus仿真+程序+设计报告+原理图+讲解视频)

这里写目录标题 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单资料下载链接&#xff1a; 基于51单片机智能垃圾桶仿真设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus8.9及以上 程序编译…

ABB RobotStudio学习记录(一)新建工作站

RobotStudio新建工作站 最近遇到 虚拟示教器和 Rapid 代码不能控制 视图中机械臂的问题&#xff0c;其实是由于机械臂和工作站不匹配。以下是解决方法。 名称版本Robot Studio6.08 新建一个”空工作站“&#xff1b; 在目标位置新建一个目标文件夹 C:\solution\test&#xff0…

鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件

什么是文件 不说清楚什么是文件就说不清楚文件系统,更说不清楚内核是如何管理和为什么要这么来管理文件的。现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,将文件抽象成一个宽泛的概念,把文档、目录&#xff08;文件夹&#xff09;、键盘、监视器、硬盘、可移动…

视频监控平台:交通运输标准JTT808设备SDK接入源代码函数分享

目录 一、JT/T 808标准简介 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;协议特点 1、通信方式 2、鉴权机制 3、消息分类 &#xff08;三&#xff09;协议主要内容 1、位置信息 2、报警信息 3、车辆控制 4、数据转发 二、代码和解释 &#xff08;一…

C语言leetcode刷题笔记1

C语言leetcode刷题笔记1 第1题&#xff1a;136.只出现一次的数字两次遍历&#xff08;O(numsSize^2)&#xff09;位运算 第2题&#xff1a;202.快乐数快慢指针记录历史数据 第3题&#xff1a;53.最大子数组和暴力求解&#xff08;超时&#xff09;动态规划分治 第1题&#xff1…

机器学习初学者 6 个核心算法!建议收藏,反复观看!

今天再来介绍机器学习算法的基本概念和适用场景&#xff01; 首先&#xff0c;引用一句英国统计学家George E. P. Box的名言&#xff1a;All models are wrong, but some are useful. 没有哪一种算法能够适用所有情况&#xff0c;只有针对某一种问题更有用的算法。 也就是说&…

【新版系统架构】知识点背诵默写本

前言 系统架构考试在即&#xff0c;想要考试的人肯定感受到了沉甸甸的压力和紧迫感&#xff0c;脑海中不断闪过知识点的画面&#xff0c;却让人有些头昏脑胀&#xff0c;发现很难完全记住&#xff0c;这个考试很难&#xff0c;知识点很多。这次我在准备考试的同时&#xff0c;…

Android GPU渲染屏幕绘制显示基础概念(1)

Android GPU渲染屏幕绘制显示基础概念&#xff08;1&#xff09; Android中的图像生产者OpenGL&#xff0c;Skia&#xff0c;Vulkan将绘制的数据存放在图像缓冲区中&#xff0c;Android中的图像消费SurfaceFlinger从图像缓冲区将数据取出&#xff0c;进行加工及合成。 Surface…

华为云CodeArts API专场直播来袭!——探索API全生命周期管理新趋势

API的全生命周期管理是否让你摸不清头脑&#xff1f;你是否对API的前沿技术和应用充满了好奇&#xff0c;渴望一探究竟&#xff1f; 华为云PaaS服务即将在5月10日16:00&#xff0c;为你带来一场别开生面的CodeArts API专场直播活动&#xff01; 你可以在轻松愉快的氛围中&…

小巧简单实用的Linux端口转发工具Rinetd

Linux下实现端口转发有很多种方法&#xff0c;尤其是在可以联网的情况下&#xff0c;更是容易。最近在资源受限的定制系统中&#xff0c;找到一个方便离线安装和使用的端口转发工具Rinetd&#xff0c;安装包仅几十K&#xff0c;而且有很多版本的Linux发行系统的支持。 1、安装…

水质监测设备预警系统

随着工业化进程的加快和城市化水平的提高&#xff0c;水质安全问题愈发受到社会各界的广泛关注。为了确保水资源的清洁与安全&#xff0c;水质监测设备预警系统成为了不可或缺的利器。在这个背景下&#xff0c;HiWoo Cloud平台凭借其先进的技术和卓越的性能&#xff0c;为水质监…

【已解决】直接在远程新增文件本地再提交报Merge branch ‘master‘ of

【已解决】直接在远程新增文件本地再提交报Merge branch ‘master’ of … 1、问题产生背景 直接在远程仓库新建了md文件&#xff0c;本地库修改了文件已添加到暂存区之后再提交报错 2、分析 远程新建文件产生变更&#xff0c;版本号与本地拿到的不一致&#xff0c;本地再次提…

Docker 安装的MySQL迁移数据库

1. 导出数据库 docker ps :查看数据库对应的 CONTAINER ID docker exec -it id /bin/bash : 进入到mysql的docker实例中 cd /usr/bin : 进入到bin目录 mysqldump -u root -p123456 study > /root/study_backup0509.sql :使用mysqldump备份库&#xff0c;注意密码与-p之间…

PopChar for Mac v10.1激活版:特殊字符输入工具

PopChar for Mac是一款专为Mac用户设计的字符输入工具&#xff0c;其简单直观的功能使得查找和插入特殊字符变得轻而易举。 PopChar for Mac v10.1激活版下载 首先&#xff0c;PopChar为Mac提供了访问所有字体字符的能力&#xff0c;包括那些难以通过键盘直接输入的字符。用户只…

【3dmax笔记】032: 编辑顶点

一、编辑顶点概述 (1)启动安装好的3dmax软件。 (2)选择顶视图,用图形画出一个矩形。 (3)选择矩形,右击鼠标,将矩形转换成可编辑样条线。 (4)进入顶点层级。 展开可编辑样条线,选择顶点层级(快捷键为1,在不展开样条线的情况下也可以选择顶点层级)。选择后,可以…

postman介绍、安装、使用、功能特点、注意事项

Postman是一款流行的API开发工具&#xff0c;它提供了丰富的功能&#xff0c;包括创建、测试、调试和文档化API。本文将介绍Postman的安装、使用方法&#xff0c;以及其功能特点和注意事项。 1. 介绍 Postman是一款用于构建、测试和调试API的工具&#xff0c;它提供了用户友好的…
最新文章