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.mzph.cn/web/9192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI中LangChain实现RAG中的pdf原理以及快速上手

AI中LangChain实现RAG中的pdf原理以及快速上手 什么是LangChain LangChain是一种基于自然语言处理技术的语言生成模型&#xff0c;它可以将输入的文本转换为自然语言的输出。LangChain的实现原理是基于RAG&#xff08;Retriever-Reader-Generator&#xff09;模型&#xff0c…

C++ 动态内存管理

例如&#xff1a;动态内存和释放单个数据的存储区 一 用new运算符初始化单个数据的存储区 举例

Qt:实现git中diff的功能

在 Git 中&#xff0c;有四种 diff 算法&#xff0c;即 Myers、Minimal、Patience 和 Histogram&#xff0c;用于获取位于两个不同 commit 中的两个相同文件的差异。 Myers算法实现参考&#xff1a; Myers‘Diff之贪婪算法_myers算法-CSDN博客 Git Diff 算法详解&#xff1a…

深度学习算法集成部署

文章目录 0 Docker容器部署1 制作dockerfile2 新建镜像3 新建容器4 运行脚本5 异常处理0 Docker容器部署 使用 Docker 容器部署深度学习模型有以下几个主要优势: 环境一致性:Docker 容器可以将应用程序及其所需的依赖项打包在一起,确保应用程序在不同环境中的运行一致性。这对…

为什么在二三十岁时应该努力变强大?

一、对于即将三十岁或三十岁的人的建议&#xff0c;包括举重、跑步、学习等健身技能&#xff0c;以及在生活中如何处理困难和挑战。 举重是二三十岁的人的最佳做法之一 学习如何在身体上、感情上和精神上挑战极限 在城市里寻找机会&#xff0c;接受邀请&#xff0c;强迫自己出去…

C++之Eigen库基本使用

目录 1、矩阵的构造和初始化操作 2、矩阵的算术运算 3、矩阵的分解和求解 4、矩阵的变换 5、矩阵的访问和修改 6、矩阵遍历 7、线性方程组求解 8、其他操作 Eigen库是一个高级的C库&#xff0c;用于线性代数&#xff0c;矩阵和向量运算&#xff0c;数值分析和相关的数学…

【智能算法】人工原生动物优化算法(APO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.获取代码 1.背景 2024年&#xff0c;X Wang受到自然界原生动物启发&#xff0c;提出了人工原生动物优化算法&#xff08; Artificial Protozoa Optimizer, APO&#xff09;。 2.算法原理 2.1算法思想 AP…

压缩归档库-Snappy介绍

1.简介 Snappy 是一个 C 编写的压缩和解压缩库&#xff0c;由 Google 开发。它专为速度而设计&#xff0c;而不是最大压缩率或与其他压缩库的兼容性。 Snappy 通常用于需要快速压缩和解压缩的场景。 Snappy具有以下属性&#xff1a; 快速&#xff1a;压缩速度达到250 MB/秒及…

数智化快速开发平台

助力企业IT规划标准化&#xff0c;实现企业IT生态化 目前市场上有很多面向企业各种业务场景的产品&#xff0c;这些产品给企业管理带来便利性的同时&#xff0c;也带来了一系列问题&#xff0c;例如&#xff1a; 不同系统的后台管理功能基本一致&#xff0c;却需要重复建设&a…

linux调试

文章目录 1. 使用打印来调试1.1 重定向1.2 标准预定义宏1.3 日志代码 2. 内核异常2.1 内核打印2.1.1 打印级别2.1.2 跟踪异常2.1.3 动态打印2.1.4 RAM console 2.2 OOPS2.2.1 有源代码的情况2.2.2 没有源代码的情况 3 查看日志4 工具调试 1. 使用打印来调试 1.1 重定向 2>…

代码随想录学习Day 33

动态规划理论基础 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪心&#x…

[Collection与数据结构] Map与Set(一):二叉搜索树与Map,Set的使用

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …

python socket通讯 学习记录

python socket 1. 初级实现2. 添加header3. 中级实现&#xff08;引用pickle库&#xff09;4. 高级实现&#xff08;相互发送信息&#xff09;5. 一点尝试5. 1个server对应2个client5.2个server对应1个client 名称版本python3.11 本文涉及到socket的server与client通讯从简单到…

LeetCode 257. 二叉树的所有路径

LeetCode 257. 二叉树的所有路径 1、题目 题目链接&#xff1a;257. 二叉树的所有路径 给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root…

java.net.SocketInputStream.socketRead0 卡死导致 tomcat 线程池打满的问题

0 TL;DR; 问题与原因&#xff1a;某些特定条件下 java.net.SocketInputStream.socketRead0 方法会卡死&#xff0c;导致运行线程一直被占用导致泄露采用的方案&#xff1a;使用监控线程异步监控卡死事件&#xff0c;如果发生直接关闭网络连接释放链接以及对应的线程 1. 问题 …

【视频格式转换】【ffmepg】对mp4文件进行重新编码输出新的mp4文件

【视频格式转换】【ffmepg】对mp4文件进行重新编码输出新的mp4文件 背景 之前开发调试了个能正常调用ffmpeg解码mp4文件得到yuv数据的testbed(把ffmpeg开源库移植并交叉编译到一个嵌入式平台)&#xff0c;用了好几年了&#xff0c;今天用来挂测一批新的采集视频mp4文件&#x…

nacos下载安装和nacos启动报错

nacos简介: Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称&#xff0c;一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集&#xff0c;帮助您…

YOLOv9中模块总结补充|RepNCSPELAN4详图

专栏地址&#xff1a;目前售价售价69.9&#xff0c;改进点70 专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;助力高效涨点&#xff01;&#xff01;&#xff01; 1. RepNCSPELAN4详图 RepNCSPELAN4是YOLOv9中的特征提取-融合模块&#xff0c;类似前几…

【数据结构-二叉搜索树的增删查改】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

C#面试题: 寻找中间值

给定一个数组&#xff0c;在区间内从左到右查找中间值&#xff0c;每次查找最小值与最大值区间内的中间值&#xff0c;且这个区间元素数量不小于3。 例如 1.给定数组float[] data { 1, 2.3f, 4, 5.75f, 8.125f, 10.5f, 13, 15, 20 } 输出&#xff1a;10.5、5.75、4、2.3、8…