国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Postgresql源碼(108)不同類型insert在parse階段的差異分析

這篇具有很好參考價(jià)值的文章主要介紹了Postgresql源碼(108)不同類型insert在parse階段的差異分析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

0 概述

分析三種類型的insert在parse的各個(gè)階段的差異:

insert into TAB_IS SELECT * FROM STUDENT a WHERE a.sno > ANY (SELECT b.sno from STUDENT b);
insert into TAB_IS values(10, 'AAA');
insert into TAB_IS values(20, 'CCC'),(30, 'DDD'),(40, 'EEE');

不同insert的計(jì)劃樹type

# T_NestLoopState
insert into TAB_IS SELECT * FROM STUDENT a WHERE a.sno > ANY (SELECT b.sno from STUDENT b);
# T_ResultState
insert into TAB_IS values(10, 'AAA');
# T_ValuesScanState
insert into TAB_IS values(20, 'CCC'),(30, 'DDD'),(40, 'EEE');
# T_FunctionScanState
insert into TAB_IS select i, 'QQQ', i % 10 from generate_series(1, 1000) t(i);
# T_ProjectSetState
insert into TAB_IS values(generate_series(1,10), 'DDD', 1);

1 語義分析差異

下面三種SQL在語義分析結(jié)果來看有什么區(qū)別?

insert into TAB_IS SELECT * FROM STUDENT a WHERE a.sno > ANY (SELECT b.sno from STUDENT b);
insert into TAB_IS values(10, 'AAA');
insert into TAB_IS values(20, 'CCC'),(30, 'DDD'),(40, 'EEE');

語義分析結(jié)果來看,insert語句都會(huì)構(gòu)造插入表和數(shù)據(jù)表兩張表(RangeTblEntry),數(shù)據(jù)表可能是值構(gòu)造出來的,或者是select查詢出來的。

核心流程都是構(gòu)造數(shù)據(jù)表的RangeTblEntry。


代碼位置:

transformInsertStmt
	SelectStmt *selectStmt = (SelectStmt *) stmt->selectStmt;

	// 如果selectStmt非空,表示存在select子句
	if (selectStmt == NULL)
		...						// 普通insert
	else if (isGeneralSelect)
		...						// 帶select子句
	else if (list_length(selectStmt->valuesLists) > 1)
		...						// 多values

1 insert select語義分析結(jié)果

pg_analyze_and_rewrite_fixedparams

insert into TAB_IS SELECT * FROM STUDENT a WHERE a.sno > ANY (SELECT b.sno from STUDENT b);語義分析結(jié)果
Postgresql源碼(108)不同類型insert在parse階段的差異分析

2 insert values語義分析結(jié)果

insert into TAB_IS values(10, 'AAA');語義分析結(jié)果
Postgresql源碼(108)不同類型insert在parse階段的差異分析

3 insert values values語義分析結(jié)果

insert into TAB_IS values(20, 'CCC'),(30, 'DDD'),(40, 'EEE');語義分析結(jié)果
Postgresql源碼(108)不同類型insert在parse階段的差異分析

2 優(yōu)化結(jié)果差異

一定存在ModifyTable節(jié)點(diǎn),因?yàn)檫@是一個(gè)寫表操作,也就是會(huì)進(jìn)入ExecModifyTable函數(shù)。

ExecModifyTable函數(shù)loop下層節(jié)點(diǎn)每次拿一條數(shù)據(jù),然后執(zhí)行insert操作。知道下層節(jié)點(diǎn)沒數(shù)據(jù)為止。

從ExecModifyTable節(jié)點(diǎn)的lefttree可以知道具體是哪種insert。
Postgresql源碼(108)不同類型insert在parse階段的差異分析

3 執(zhí)行階段

從執(zhí)行階段來看,下面三種SQL有什么區(qū)別?

insert into TAB_IS SELECT * FROM STUDENT a WHERE a.sno > ANY (SELECT b.sno from STUDENT b);
                                           QUERY PLAN
-------------------------------------------------------------------------------------------------
 Insert on tab_is  (cost=0.15..208.42 rows=0 width=0)
   ->  Nested Loop Semi Join  (cost=0.15..208.42 rows=367 width=46)
         ->  Seq Scan on student a  (cost=0.00..21.00 rows=1100 width=46)
         ->  Index Only Scan using student_pkey on student b  (cost=0.15..6.62 rows=367 width=4)
               Index Cond: (sno < a.sno)


insert into TAB_IS values(10, 'AAA');
                     QUERY PLAN
----------------------------------------------------
 Insert on tab_is  (cost=0.00..0.01 rows=0 width=0)
   ->  Result  (cost=0.00..0.01 rows=1 width=46)


insert into TAB_IS values(20, 'CCC'),(30, 'DDD'),(40, 'EEE');
                             QUERY PLAN
--------------------------------------------------------------------
 Insert on tab_is  (cost=0.00..0.04 rows=0 width=0)
   ->  Values Scan on "*VALUES*"  (cost=0.00..0.04 rows=3 width=46)

執(zhí)行階段沒什么區(qū)別,都是走ExecModifyTable內(nèi)部循環(huán)搞定。

  1. 每次從lefttree中執(zhí)行一把拿到一條,subplanstate = outerPlanState(node);context.planSlot = ExecProcNode(subplanstate);。
  2. 根據(jù)operation類型(insert)執(zhí)行具體insert操作ExecInsert,比較簡(jiǎn)單,中間會(huì)有slot到tuple的轉(zhuǎn)換。執(zhí)行器的元組都是包裝在slot中的?,F(xiàn)在PG的存儲(chǔ)引擎提供了AM接口,代碼更清晰了。

(執(zhí)行器層ExecInsert→存儲(chǔ)層入口table_tuple_insert)文章來源地址http://www.zghlxwxcb.cn/news/detail-514060.html

PortalRun
	PortalRunMulti
		ProcessQuery
			CreateQueryDesc
			ExecutorStart
			ExecutorRun
				standard_ExecutorRun
					ExecutePlan
						ExecProcNode
							ExecProcNodeFirst
								ExecModifyTable 
                             -----> ExecProcNode(subplanstate)  --- 
						   /     	switch (operation)              \
						   \			case CMD_INSERT:            /
                             ------------- ExecInsert   <----------
											
										

ps. 測(cè)試數(shù)據(jù)

drop table student;
create table student(sno int primary key, sname varchar(10), ssex int);
insert into student values(1, 'stu1', 0);
insert into student values(2, 'stu2', 1);
insert into student values(3, 'stu3', 1);
insert into student values(4, 'stu4', 0);

drop table course;
create table course(cno int primary key, cname varchar(10), tno int);
insert into course values(10, 'meth', 1);
insert into course values(11, 'english', 2);

drop table teacher;
create table teacher(tno int primary key, tname varchar(10), tsex int);
insert into teacher values(1, 'te1', 1);
insert into teacher values(2, 'te2', 0);

drop table score;
create table score (sno int, cno int, degree int);
insert into score values (1, 10, 100);
insert into score values (1, 11, 89);
insert into score values (2, 10, 99);
insert into score values (2, 11, 90);
insert into score values (3, 10, 87);
insert into score values (3, 11, 20);
insert into score values (4, 10, 60);
insert into score values (4, 11, 70);


SELECT * FROM STUDENT a WHERE a.sno > ANY (SELECT b.sno from STUDENT b); 


drop table TAB_IS;
create table TAB_IS(sno int, sname varchar(10), ssex int);
       
insert into TAB_IS SELECT * FROM STUDENT a WHERE a.sno > ANY (SELECT b.sno from STUDENT b);
insert into TAB_IS values(10, 'AAA');
insert into TAB_IS values(20, 'CCC'),(30, 'DDD'),(40, 'EEE');


到了這里,關(guān)于Postgresql源碼(108)不同類型insert在parse階段的差異分析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 不同開發(fā)語言在進(jìn)程、線程和協(xié)程的設(shè)計(jì)差異

    不同開發(fā)語言在進(jìn)程、線程和協(xié)程的設(shè)計(jì)差異

    在多線程項(xiàng)目開發(fā)時(shí),最常用、最常遇到的問題是 1,線程、協(xié)程安全 2,線程、協(xié)程間的通信和控制 本文主要探討不同開發(fā)語言go、java、python在進(jìn)程、線程和協(xié)程上的設(shè)計(jì)和開發(fā)方式的異同。 進(jìn)程 進(jìn)程是 操作系統(tǒng)進(jìn)行資源分配的基本單位,每個(gè)進(jìn)程都有自己的獨(dú)立內(nèi)存空

    2024年01月22日
    瀏覽(27)
  • 微軟 Windows Server 版本對(duì)比:了解不同版本之間的差異

    微軟 Windows Server 版本對(duì)比:了解不同版本之間的差異

    類似于客戶端 Windows 版本,Windows Server?也分別提供了各種版本。 Windows Server 是一個(gè)操作系統(tǒng),旨在管理和控制它周圍的網(wǎng)絡(luò)基礎(chǔ)架構(gòu)。每個(gè)版本都是針對(duì)不同的受眾設(shè)計(jì)的,為他們提供獨(dú)特的工具和功能,以更有效地管理他們的環(huán)境。 此外,它們專為不同尺寸的組織而設(shè)計(jì)

    2024年02月15日
    瀏覽(25)
  • Docker內(nèi)部時(shí)間與主機(jī)時(shí)間不同導(dǎo)致時(shí)間差異的解決方法

    Docker內(nèi)部時(shí)間與主機(jī)時(shí)間不同導(dǎo)致時(shí)間差異的解決方法 在使用Docker進(jìn)行開發(fā)或部署應(yīng)用程序時(shí),我們可能會(huì)遇到一個(gè)常見的問題,就是Docker容器內(nèi)部的時(shí)間與主機(jī)的時(shí)間存在差異。這種時(shí)間差異可能會(huì)導(dǎo)致一些應(yīng)用程序出現(xiàn)問題,尤其是涉及到時(shí)間敏感操作的情況。本文將介

    2024年02月07日
    瀏覽(19)
  • Java Stream比較兩個(gè)List的差異,并取出不同的對(duì)象

    可以使用Java8的Stream API來比較兩個(gè)List的差異,并取出不同的對(duì)象。 ? 1. 將兩個(gè)List轉(zhuǎn)換為Stream類型; ? 2. 調(diào)用Stream的filter方法,將不同的對(duì)象過濾出來; ? 3. 將過濾出的不同的對(duì)象轉(zhuǎn)換為L(zhǎng)ist類型。 ????????上述代碼中,將兩個(gè)List類型的對(duì)象list1和list2轉(zhuǎn)換為Stream類型,并

    2024年02月08日
    瀏覽(84)
  • 基于 Spring Boot+MySQL實(shí)現(xiàn)的在線考試系統(tǒng)源碼+數(shù)據(jù)庫,基于不同類型的客觀題,進(jìn)行自動(dòng)組卷、批卷等功能的考試系統(tǒng)

    基于 Spring Boot+MySQL實(shí)現(xiàn)的在線考試系統(tǒng)源碼+數(shù)據(jù)庫,基于不同類型的客觀題,進(jìn)行自動(dòng)組卷、批卷等功能的考試系統(tǒng)

    一個(gè) JAVA 實(shí)現(xiàn)的在線考試系統(tǒng),主要實(shí)現(xiàn)一套基于不同類型的客觀題,進(jìn)行自動(dòng)組卷、批卷等功能的考試系統(tǒng)(沒有主觀題) 后端技術(shù)棧 基于 Spring Boot 數(shù)據(jù)庫 MySQL ORM MyBatis MyBatis-plus 緩存 Redis 、guava的LoadingCache 安全 Shiro Excel 導(dǎo)出 easyexcel 日志 slf4j、log4j2 圖片上傳 qiniu 其它工具

    2024年01月22日
    瀏覽(983)
  • Qt/C++音視頻開發(fā)50-不同ffmpeg版本之間的差異處理

    ffmpeg的版本眾多,從2010年開始計(jì)算的項(xiàng)目的話,基本上還在使用的有ffmpeg2/3/4/5/6,最近幾年版本彪的比較厲害,直接4/5/6,大版本之間接口有一些變化,特別是一些廢棄接口被徹底刪除了,而網(wǎng)絡(luò)上的各種文章幾乎都是ffmpeg3左右為主的,所以本人在寫這個(gè)全功能播放組件的時(shí)

    2024年02月14日
    瀏覽(28)
  • 巨量千川不同階段人群定向策略使用技巧匯總

    巨量千川不同階段人群定向策略使用技巧匯總

    巨量千川不同階段人群定向策略 一: 人群定向和轉(zhuǎn)化的關(guān)系 1: 人群定向 巨量千川中,哪個(gè)數(shù)據(jù)指標(biāo)最能反應(yīng)人群價(jià)格? 質(zhì)量高低? 第一個(gè)千展: 千次展現(xiàn)平均消耗,本質(zhì)是平臺(tái)對(duì)人群的定價(jià) 編輯切換為居中 第二個(gè)客單價(jià): 客單價(jià),本質(zhì)是人群質(zhì)量的高低 編輯切換為居中 平臺(tái)

    2024年02月16日
    瀏覽(26)
  • Java/Python/Go不同開發(fā)語言在進(jìn)程、線程和協(xié)程的設(shè)計(jì)差異

    Java/Python/Go不同開發(fā)語言在進(jìn)程、線程和協(xié)程的設(shè)計(jì)差異

    在多線程項(xiàng)目開發(fā)時(shí),最常用、最常遇到的問題是 1,線程、協(xié)程安全 2,線程、協(xié)程間的通信和控制 本文主要探討不同開發(fā)語言go、java、python在進(jìn)程、線程和協(xié)程上的設(shè)計(jì)和開發(fā)方式的異同。 進(jìn)程 進(jìn)程是 操作系統(tǒng)進(jìn)行資源分配的基本單位,每個(gè)進(jìn)程都有自己的獨(dú)立內(nèi)存空

    2024年01月23日
    瀏覽(21)
  • TS和JS的差異;ts與js的不同;ts對(duì)比js的優(yōu)勢(shì)

    TS(TypeScript)是JavaScript的超集,它提供了靜態(tài)類型檢查、類和接口等面向?qū)ο缶幊烫匦?,并且編譯成JavaScript運(yùn)行在瀏覽器或者Node.js環(huán)境中。TS比JS的優(yōu)勢(shì)包括: 強(qiáng)類型:TS引入了類型檢查,可以在編譯階段發(fā)現(xiàn)類型錯(cuò)誤,減少程序運(yùn)行期間的錯(cuò)誤。 更好的代碼維護(hù)性:TS支持

    2024年02月07日
    瀏覽(13)
  • mysql 5.7 json 類型 json 數(shù)組類型 普通字符串類型 10w數(shù)據(jù) 查詢速度差異

    mysql 5.7 json 類型 json 數(shù)組類型 普通字符串類型 10w數(shù)據(jù) 查詢速度差異

    建表語句ddl 10w 數(shù)據(jù) 插入 存儲(chǔ)過程 ?json 類型 vs 普通字符串類型 建表語句ddl CREATE TABLE tb_json_array_test ( id INT NOT NULL AUTO_INCREMENT, user_no VARCHAR(100), user_name VARCHAR(100), score INT, create_time date, update_time date, remark VARCHAR(100), field1 VARCHAR(100), field2 VARCHAR(100), field3 VARCHAR(100), field4 VARCHAR(

    2024年02月04日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包