导航:首页 > 程序命令 > sql预处理命令

sql预处理命令

发布时间:2024-06-28 20:27:54

❶ 如何用python写sql

python可以利用pymysql模块操作数据库。

什么是 PyMySQL?

PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。

PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

PyMySQL 安装

在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装。

PyMySQL 下载地址:https://github.com/PyMySQL/PyMySQL。

如果还未安装,我们可以使用以下命令安装最新版的 PyMySQL:

$ pip3 install PyMySQL

如果你的系统不支持 pip 命令,可以使用以下方式安装:

1、使用 git 命令下载安装包安装(你也可以手动下载):

$ git clone https://github.com/PyMySQL/PyMySQL$ cd PyMySQL/$ python3 setup.py install

2、如果需要制定版本号,可以使用 curl 命令来安装:

$ # X.X 为 PyMySQL 的版本号$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz$ cd PyMySQL*$ python3 setup.py install
$ # 现在你可以删除 PyMySQL* 目录

注意:请确保您有root权限来安装上述模块。

安装的过程中可能会出现"ImportError: No mole named setuptools"的错误提示,意思是你没有安装setuptools,你可以访问https://pypi.python.org/pypi/setuptools找到各个系统的安装方法。

Linux 系统安装实例:

$ wget https://bootstrap.pypa.io/ez_setup.py$ python3 ez_setup.py

数据库连接

连接数据库前,请先确认以下事项:

❷ 试述嵌入式SQL语言使用要考虑

嵌入式SQL程序的VC+SQL server 2000实现的环境配置

嵌入SQL的C应用程序具体到VC++6.0, SQL Server2000 下调试可分为五步:1、环境初始化;2、预编译;3、编译;4、连接;5、运行。下面就其中重要的的操作方法给以详细说明。
1、环境初始化
(1) SQL Server2000为其嵌入式SQL提供了一此特殊的接口;默认的安装方式没有安装这此接口;因此,需要把devtools.rar解压到SQLServer的系统日录下(即文件夹devtools中的所有文件);如果操作系统安装在C盘,则SQL Server的系统目录是C:\Program Files\Microsoft SQL Server。(或 在安装Microsoft SQL Server 2000时选择安装Development Tools,为使用嵌入式SQL语言准备必要的头文件和库文件。)
( 2)初始化Visual C++ 6.0编译器环境。在命令行方式下运行文件\Microsoft Visual Studio\VC98\Bin\vcvars32.bat。
(3)初始化SQL Server的预编译环境。在命令行方式下运行文件:\Devtools\samples\esqlc\setenv.bat。
( 4) VC++6.0环境配置。具体配置分为如下三步[:
①Tools->options->directories->Include Files:添加 C:\Program Files\Microsoft SQL Server\devtools\include。将SQL server自带的用于数据库开发的头文件包含到工程环境中。
②Tools->options->directories->Lib Files:添加C:\Program Files\Microsoft SQL Server\devtools\x861ib。将开发用到的包包含到工程中。
③project->Settings->Link->Object/Library Moles,添加库文件:SQLakw32.lib, Caw32.lib。这两个文件之间用空格分开。

2、预编译
C语言编译程序不能识别应用程序中的SQL语句,需要经过预处理程序将其转换成C语句。SQL Server的预处理程序是nsqlprep.exe。 nsqlprep.exe在SQL Server安装日录的MSSQL\Binn下。若SQL Server数据库采用的是默任安装方式,则需要把binn.rar的内容拷贝到指定目录下。

Microsoft SQL Server 2000提供的预编译程序nsqlprep.exe,用于对嵌入式SQL程序进行预编译处理,生成C语言源程序.实际上就是将嵌入式SQL程序中的嵌入式SQL语句替换为对运行时库文件Sqlakw32. dll的函数调用,接着运行时库文件调用动态连接库Ntwdblib. dll通过网络来存取Microsoft SQL Server 2000数据库服务器.

❸ SQL语句执行过程详解

SQL语句执行过程详解
一条sql,plsql的执行到底是怎样执行的呢?
一、SQL语句执行原理:
第一步:客户端把语句发给服务器端执行当我们在客户端执行 select 语句时,客户端会把这条 SQL 语句发送给服务器端,让服务器端的
进程来处理这语句。也就是说,Oracle 客户端是不会做任何的操作,他的主要任务就是把客户端产生
的一些 SQL 语句发送给服务器端。虽然在客户端也有一个数据库进程,但是,这个进程的作用跟服务器
上的进程作用事不相同的。服务器上的数据库进程才会对SQL 语句进行相关的处理。不过,有个问题需
要说明,就是客户端的进程跟服务器的进程是一一对应的。也就是说,在客户端连接上服务器后,在客户
端与服务器端都会形成一个进程,客户端上的我们叫做客户端进程;而服务器上的我们叫做服务器进程。
第二步:语句解析
当客户端把 SQL 语句传送到服务器后,服务器进程会对该语句进行解析。同理,这个解析的工作,
也是在服务器端所进行的。虽然这只是一个解析的动作,但是,其会做很多“小动作”。
1. 查询高速缓存(library cache)。服务器进程在接到客户端传送过来的 SQL 语句时,不
会直接去数据库查询。而是会先在数据库的高速缓存中去查找,是否存在相同语句的执行计划。如果在
数据高速缓存中,则服务器进程就会直接执行这个 SQL 语句,省去后续的工作。所以,采用高速数据缓
存的话,可以提高 SQL 语句的查询效率。一方面是从内存中读取数据要比从硬盘中的数据文件中读取
数据效率要高,另一方面,也是因为这个语句解析的原因。
不过这里要注意一点,这个数据缓存跟有些客户端软件的数据缓存是两码事。有些客户端软件为了
提高查询效率,会在应用软件的客户端设置数据缓存。由于这些数据缓存的存在,可以提高客户端应用软
件的查询效率。但是,若其他人在服务器进行了相关的修改,由于应用软件数据缓存的存在,导致修改的
数据不能及时反映到客户端上。从这也可以看出,应用软件的数据缓存跟数据库服务器的高速数据缓存
不是一码事。
2. 语句合法性检查(data dict cache)。当在高速缓存中找不到对应的 SQL 语句时,则服
务器进程就会开始检查这条语句的合法性。这里主要是对 SQL 语句的语法进行检查,看看其是否合乎
语法规则。如果服务器进程认为这条 SQL 语句不符合语法规则的时候,就会把这个错误信息,反馈给客
户端。在这个语法检查的过程中,不会对 SQL 语句中所包含的表名、列名等等进行 SQL 他只是语法
上的检查。
3. 语言含义检查(data dict cache)。若 SQL 语句符合语法上的定义的话,则服务器进程
接下去会对语句中的字段、表等内容进行检查。看看这些字段、表是否在数据库中。如果表名与列名不
准确的话,则数据库会就会反馈错误信息给客户端。所以,有时候我们写 select 语句的时候,若语法
与表名或者列名同时写错的话,则系统是先提示说语法错误,等到语法完全正确后,再提示说列名或表名
错误。
4. 获得对象解析锁(control structer)。当语法、语义都正确后,系统就会对我们需要查询
的对象加锁。这主要是为了保障数据的一致性,防止我们在查询的过程中,其他用户对这个对象的结构发
生改变。
5. 数据访问权限的核对(data dict cache)。当语法、语义通过检查之后,客户端还不一定
能够取得数据。服务器进程还会检查,你所连接的用户是否有这个数据访问的权限。若你连接上服务器
的用户不具有数据访问权限的话,则客户端就不能够取得这些数据。有时候我们查询数据的时候,辛辛苦
苦地把 SQL 语句写好、编译通过,但是,最后系统返回个 “没有权限访问数据”的错误信息,让我们气
半死。这在前端应用软件开发调试的过程中,可能会碰到。所以,要注意这个问题,数据库服务器进程先
检查语法与语义,然后才会检查访问权限。
6. 确定最佳执行计划 ?。当语句与语法都没有问题,权限也匹配的话,服务器进程还是不会直接对
数据库文件进行查询。服务器进程会根据一定的规则,对这条语句进行优化。不过要注意,这个优化是有
限的。一般在应用软件开发的过程中,需要对数据库的 sql 语言进行优化,这个优化的作用要大大地大
于服务器进程的自我优化。所以,一般在应用软件开发的时候,数据库的优化是少不了的。当服务器进程
的优化器确定这条查询语句的最佳执行计划后,就会将这条 SQL 语句与执行计划保存到数据高速缓存
(library cache)。如此的话,等以后还有这个查询时,就会省略以上的语法、语义与权限检查的步骤,
而直接执行 SQL 语句,提高 SQL 语句处理效率。
第三步:语句执行
语句解析只是对 SQL 语句的语法进行解析,以确保服务器能够知道这条语句到底表达的是什么意
思。等到语句解析完成之后,数据库服务器进程才会真正的执行这条 SQL 语句。这个语句执行也分两
种情况。
一是若被选择行所在的数据块已经被读取到数据缓冲区的话,则服务器进程会直接把这个数据传递
给客户端,而不是从数据库文件中去查询数据。
若数据不在缓冲区中,则服务器进程将从数据库文件中查询相关数据,并把这些数据放入到数据缓冲
区中(buffer cache)。
第四步:提取数据
当语句执行完成之后,查询到的数据还是在服务器进程中,还没有被传送到客户端的用户进程。所以,
在服务器端的进程中,有一个专门负责数据提取的一段代码。他的作用就是把查询到的数据结果返回给
用户端进程,从而完成整个查询动作。从这整个查询处理过程中,我们在数据库开发或者应用软件开发过
程中,需要注意以下几点:
一是要了解数据库缓存跟应用软件缓存是两码事情。数据库缓存只有在数据库服务器端才存在,在
客户端是不存在的。只有如此,才能够保证数据库缓存中的内容跟数据库文件的内容一致。才能够根据
相关的规则,防止数据脏读、错读的发生。而应用软件所涉及的数据缓存,由于跟数据库缓存不是一码事
情,所以,应用软件的数据缓存虽然可以提高数据的查询效率,但是,却打破了数据一致性的要求,有时候
会发生脏读、错读等情况的发生。所以,有时候,在应用软件上有专门一个功能,用来在必要的时候清除
数据缓存。不过,这个数据缓存的清除,也只是清除本机上的数据缓存,或者说,只是清除这个应用程序
的数据缓存,而不会清除数据库的数据缓存。
二是绝大部分 SQL 语句都是按照这个处理过程处理的。我们 DBA 或者基于 Oracle 数据库的
开发人员了解这些语句的处理过程,对于我们进行涉及到 SQL 语句的开发与调试,是非常有帮助的。有
时候,掌握这些处理原则,可以减少我们排错的时间。特别要注意,数据库是把数据查询权限的审查放在
语法语义的后面进行检查的。所以,有时会若光用数据库的权限控制原则,可能还不能满足应用软件权限
控制的需要。此时,就需要应用软件的前台设置,实现权限管理的要求。而且,有时应用数据库的权限管
理,也有点显得繁琐,会增加服务器处理的工作量。因此,对于记录、字段等的查询权限控制,大部分程
序涉及人员喜欢在应用程序中实现,而不是在数据库上实现。
DBCC DROPCLEANBUFFERS
从缓冲池中删除所有清除缓冲区。
DBCC FREEPROCCACHE
从过程缓存中删除所有元素。
DBCC FREESYSTEMCACHE
从所有缓存中释放所有未使用的缓存条目
SQL语句中的函数、关键字、排序等执行顺序:
1. FROM 子句返回初始结果集。
2. WHERE 子句排除不满足搜索条件的行。
3. GROUP BY 子句将选定的行收集到 GROUP BY 子句中各个唯一值的组中。
4. 选择列表中指定的聚合函数可以计算各组的汇总值。
5. 此外,HAVING 子句排除不满足搜索条件的行。
6. 计算所有的表达式;
7. 使用 order by 对结果集进行排序。
8. 查找你要搜索的字段。
二、SQL语句执行完整过程:
1.用户进程提交一个 sql 语句:
update temp set a=a*2,给服务器进程。
2.服务器进程从用户进程把信息接收到后,在 PGA 中就要此进程分配所需内存,存储相关的信息,如在会
话内存存储相关的登录信息等。
3.服务器进程把这个 sql 语句的字符转化为 ASCII 等效数字码,接着这个 ASCII 码被传递给一个
HASH 函数,并返回一个 hash 值,然后服务器进程将到shared pool 中的 library cache 中去查找是否存在相
同的 hash 值,如果存在,服务器进程将使用这条语句已高速缓存在 SHARED POOL 的library cache 中的已
分析过的版本来执行。
4.如果不存在,服务器进程将在 CGA 中,配合 UGA 内容对 sql,进行语法分析,首先检查语法的正确性,接
着对语句中涉及的表,索引,视图等对象进行解析,并对照数据字典检查这些对象的名称以及相关结构,并根据
ORACLE 选用的优化模式以及数据字典中是否存在相应对象的统计数据和是否使用了存储大纲来生成一个
执行计划或从存储大纲中选用一个执行计划,然后再用数据字典核对此用户对相应对象的执行权限,最后生成
一个编译代码。
5.ORACLE 将这条 sql 语句的本身实际文本、HASH 值、编译代码、与此语名相关联的任何统计数据
和该语句的执行计划缓存在 SHARED POOL 的 library cache中。服务器进程通过 SHARED POOL 锁存
器(shared pool latch)来申请可以向哪些共享 PL/SQL 区中缓存这此内容,也就是说被SHARED POOL 锁存
器锁定的 PL/SQL 区中的块不可被覆盖,因为这些块可能被其它进程所使用。
6.在 SQL 分析阶段将用到 LIBRARY
CACHE,从数据字典中核对表、视图等结构的时候,需要将数据
字典从磁盘读入 LIBRARY
CACHE,因此,在读入之前也要使用LIBRARY
CACHE 锁存器(library cache
pin,library cache lock)来申请用于缓存数据字典。 到现在为止,这个 sql 语句已经被编译成可执行的代码了,
但还不知道要操作哪些数据,所以服务器进程还要为这个 sql 准备预处理数据。
7.首先服务器进程要判断所需数据是否在 db buffer 存在,如果存在且可用,则直接获取该数据,同时根据
LRU 算法增加其访问计数;如果 buffer 不存在所需数据,则要从数据文件上读取首先服务器进程将在表头部
请求 TM 锁(保证此事务执行过程其他用户不能修改表的结构),如果成功加 TM 锁,再请求一些行级锁(TX
锁),如果 TM、TX 锁都成功加锁,那么才开始从数据文件读数据,在读数据之前,要先为读取的文件准备好
buffer 空间。服务器进程需要扫面 LRU list 寻找 free db buffer,扫描的过程中,服务器进程会把发现的所有
已经被修改过的 db buffer 注册到 dirty list 中, 这些 dirty buffer 会通过 dbwr 的触发条件,随后会被写出到
数据文件,找到了足够的空闲 buffer,就可以把请求的数据行所在的数据块放入到 db buffer 的空闲区域或者
覆盖已经被挤出 LRU list 的非脏数据块缓冲区,并排列在 LRU list 的头部,也就是在数据块放入 DB
BUFFER 之前也是要先申请 db buffer 中的锁存器,成功加锁后,才能读数据到 db buffer。
8.记日志 现在数据已经被读入到 db buffer 了,现在服务器进程将该语句所影响的并被读
入 db buffer 中的这些行数据的 rowid 及要更新的原值和新值及 scn 等信息从 PGA 逐条的写入 redo log
buffer 中。在写入 redo log buffer 之前也要事先请求 redo log buffer 的锁存器,成功加锁后才开始写入,当
写入达到 redo log buffer 大小的三分之一或写入量达到 1M 或超过三秒后或发生检查点时或者 dbwr 之前
发生,都会触发 lgwr 进程把 redo log buffer 的数据写入磁盘上的 redo file 文件中(这个时候会产生log file
sync 等待事件)
已经被写入 redofile 的 redo log buffer 所持有的锁存器会被释放,并可被后来的写入信息覆盖,
redo log buffer是循环使用的。Redo file 也是循环使用的,当一个 redo file 写满后,lgwr 进程会自动切换到
下一 redo file(这个时候可能出现 log fileswitch(checkpoint complete)等待事件)。如果是归档模式,归档进
程还要将前一个写满的 redo file 文件的内容写到归档日志文件中(这个时候可能出现 log file
switch(archiving needed)。
9.为事务建立回滚段 在完成本事务所有相关的 redo log buffer 之后,服务器进程开始改写这个 db buffer
的块头部事务列表并写入 scn,然后 包含这个块的头部事务列表及 scn 信息的数据副本放入回滚段中,将
这时回滚段中的信息称为数据块的“前映像“,这个”前映像“用于以后的回滚、恢复和一致性读。(回滚段可以
存储在专门的回滚表空间中,这个表空间由一个或多个物理文件组成,并专用于回滚表空间,回滚段也可在其它
表空间中的数据文件中开辟。
10.本事务修改数据块 准备工作都已经做好了,现在可以改写 db buffer 块的数据内容了,并在块的头部写
入回滚段的地址。
11.放入 dirty list 如果一个行数据多次 update 而未 commit,则在回滚段中将会有多个“前映像“,除了第
一个”前映像“含有 scn 信息外,其他每个“前映像“的头部都有 scn 信息和“前前映像”回滚段地址。一个
update 只对应一个 scn,然后服务器进程将在 dirty list 中建立一
条指向此 db buffer 块的指针(方便 dbwr 进程可以找到 dirty list 的 db buffer 数据块并写入数据文件中)。
接着服务器进程会从数据文件中继续读入第二个数据块,重复前一数据块的动作,数据块的读入、记日志、建
立回滚段、修改数据块、放入 dirty list。当 dirty queue 的长度达到阀值(一般是 25%),服务器进程将通知
dbwr 把脏数据写出,就是释放 db buffer 上的锁存器,腾出更多的 free db buffer。前面一直都是在说明
oracle 一次读一个数据块,其实 oracle 可以一次读入多个数据块(db_file_multiblock_read_count 来设置一
次读入块的个数)
说明:
在预处理的数据已经缓存在 db buffer 或刚刚被从数据文件读入到 db buffer 中,就要根据 sql 语句
的类型来决定接下来如何操作。
1>如果是 select 语句,则要查看 db buffer 块的头部是否有事务,如果有事务,则从回滚段中读取数据;如
果没有事务,则比较 select 的 scn 和 db buffer 块头部的 scn,如果前者小于后者,仍然要从回滚段中读取数据;
如果前者大于后者,说明这是一非脏缓存,可以直接读取这个 db buffer 块的中内容。
2>如果是 DML 操作,则即使在 db buffer 中找到一个没有事务,而且 SCN 比自己小的非脏
缓存数据块,服务器进程仍然要到表的头部对这条记录申请加锁,加锁成功才能进行后续动作,如果不成功,则要
等待前面的进程解锁后才能进行动作(这个时候阻塞是 tx 锁阻塞)。
用户 commit 或 rollback 到现在为止,数据已经在 db buffer 或数据文件中修改完
成,但是否要永久写到数文件中,要由用户来决定 commit(保存更改到数据文件) rollback 撤销数据的更改)。
1.用户执行 commit 命令
只有当 sql 语句所影响的所有行所在的最后一个块被读入 db buffer 并且重做信息被写入 redo log
buffer(仅指日志缓冲区,而不包括日志文件)之后,用户才可以发去 commit 命令,commit 触发 lgwr 进程,但不
强制立即 dbwr来释放所有相应 db buffer 块的锁(也就是no-force-at-commit,即提交不强制写),也就是说有
可能虽然已经 commit 了,但在随后的一段时间内 dbwr 还在写这条 sql 语句所涉及的数据块。表头部的行锁
并不在 commit 之后立即释放,而是要等 dbwr 进程完成之后才释放,这就可能会出现一个用户请求另一用户
已经 commit 的资源不成功的现象。
A .从 Commit 和 dbwr 进程结束之间的时间很短,如果恰巧在 commit 之后,dbwr 未结束之前断电,因为
commit 之后的数据已经属于数据文件的内容,但这部分文件没有完全写入到数据文件中。所以需要前滚。由
于 commit 已经触发 lgwr,这些所有未来得及写入数据文件的更改会在实例重启后,由 smon 进程根据重做日
志文件来前滚,完成之前 commit 未完成的工作(即把更改写入数据文件)。
B.如果未 commit 就断电了,因为数据已经在 db buffer 更改了,没有 commit,说明这部分数据不属于数
据文件,由于 dbwr 之前触发 lgwr 也就是只要数据更改,(肯定要先有 log) 所有 DBWR,在数据文件上的修改
都会被先一步记入重做日志文件,实例重启后,SMON 进程再根据重做日志文件来回滚。
其实 smon 的前滚回滚是根据检查点来完成的,当一个全部检查点发生的时候,首先让 LGWR 进程将
redo log buffer 中的所有缓冲(包含未提交的重做信息)写入重做日志文件,然后让 dbwr 进程将 db buffer 已
提交的缓冲写入数据文件(不强制写未提交的)。然后更新控制文件和数据文件头部的 SCN,表明当前数据库
是一致的,在相邻的两个检查点之间有很多事务,有提交和未提交的。
像前面的前滚回滚比较完整的说法是如下的说明:

A.发生检查点之前断电,并且当时有一个未提交的改变正在进行,实例重启之后,SMON 进程将从上一个
检查点开始核对这个检查点之后记录在重做日志文件中已提交的和未提交改变,因为
dbwr 之前会触发 lgwr,所以 dbwr 对数据文件的修改一定会被先记录在重做日志文件中。因此,断电前被
DBWN 写进数据文件的改变将通过重做日志文件中的记录进行还原,叫做回滚,
B. 如果断电时有一个已提交,但 dbwr 动作还没有完全完成的改变存在,因为已经提交,提交会触发 lgwr
进程,所以不管 dbwr 动作是否已完成,该语句将要影响的行及其产生的结果一定已经记录在重做日志文件中
了,则实例重启后,SMON 进程根据重做日志文件进行前滚.
实例失败后用于恢复的时间由两个检查点之间的间隔大小来决定,可以通个四个参数设置检查点执行的频
率:

Log_checkpoint_interval:
决定两个检查点之间写入重做日志文件的系统物理块(redo blocks)
的大小,默认值是 0,无限制。
log_checkpoint_timeout:
两 个 检 查 点 之 间 的 时 间 长 度(秒)默 认 值 1800s。
fast_start_io_target:
决定了用于恢复时需要处理的块的多少,默认值是 0,无限制。
fast_start_mttr_target:
直接决定了用于恢复的时间的长短,默认值是 0,无限制(SMON 进程执行的前滚
和回滚与用户的回滚是不同的,SMON 是根据重做日志文件进行前滚或回滚,而用户的回滚一定是根据回滚段
的内容进行回滚的。
在这里要说一下回滚段存储的数据,假如是 delete 操作,则回滚段将会记录整个行的数据,假如是 update,
则回滚段只记录被修改了的字段的变化前的数据(前映像),也就是没有被修改的字段是不会被记录的,假如是
insert,则回滚段只记录插入记录的 rowid。 这样假如事务提交,那回滚段中简单标记该事务已经提交;假如是
回退,则如果操作是 delete,回退的时候把回滚段中数据重新写回数据块,操作如果是 update,则把变化前数据
修改回去,操作如果是 insert,则根据记录的 rowid 把该记录删除。
2.如果用户 rollback。
则服务器进程会根据数据文件块和 DB BUFFER 中块的头部的事务列表和 SCN 以及回滚段地址找到
回滚段中相应的修改前的副本,并且用这些原值来还原当前数据文件中已修改但未提交的改变。如果有多个
“前映像”,服务器进程会在一个“前映像”的头部找到“前前映像”的回滚段地址,一直找到同一事务下的最早的
一个“前映像”为止。一旦发出了 COMMIT,用户就不能rollback,这使得 COMMIT 后 DBWR 进程还没有
全部完成的后续动作得到了保障。到现在为例一个事务已经结束了。
说明:
TM 锁:
符合 lock 机制的,用于保护对象的定义不被修改。 TX 锁:
这个锁代表一个事务,是行
级锁,用数据块头、数据记录头的一些字段表示,也是符合 lock 机制,有 resource structure、lock
structure、enqueue 算法。

❹ pg镆ヨ㈠勭悊娴佺▼

骞惰屾煡璇浣跨敤澶氢釜钖庡彴杩涚▼锛屼絾钖庣杩涚▼锘烘湰涓婂勭悊杩炴帴镄勫㈡埛绔鍙戝嚭镄勬墍链夋煡璇銆傛敼钖庣链変簲涓瀛愮郴缁熺粍鎴愩

瑙f瀽鍣ㄧ敓鎴愪竴涓瑙f瀽镙戯纴钖庣画瀛愮郴缁熷彲浠ヤ粠绾鏂囨湰镄 SQL 璇鍙ヤ腑璇诲彇璇ヨВ鏋愭爲銆

濡备笅闱㈢殑镆ヨ锛

瑙f瀽镙戞槸鍏舵牴鑺傜偣鏄瀹氢箟鍦 parsenodes.h涓镄 [SelectStmt](javascript:void(0))缁撴瀯镄勬爲銆

SELECT 镆ヨ㈢殑鍏幂礌鍜岃В鏋愭爲镄勭浉搴斿厓绱犵紪鍙风浉钖屻备緥濡傦纴(1) 鏄绗涓涓鐩镙囧垪琛ㄧ殑涓涓椤圭洰锛屽畠鏄琛ㄧ殑钬渋d钬濆垪锛(4) 鏄 WHERE 瀛愬彞锛屼緷姝ょ被鎺ㄣ

鐢变簬瑙f瀽鍣ㄥ湪鐢熸垚瑙f瀽镙戞椂鍙妫镆ヨ緭鍏ョ殑璇娉曪纴锲犳ゅ彧链夊湪镆ヨ涓鍑虹幇璇娉曢敊璇镞舵墠浼氲繑锲为敊璇銆

瑙f瀽鍣ㄤ笉妫镆ヨ緭鍏ユ煡璇㈢殑璇涔夈备緥濡傦纴鍗充娇镆ヨ㈠寘钖涓嶅瓨鍦ㄧ殑琛ㄥ悕锛岃В鏋愬櫒涔熶笉浼氲繑锲为敊璇銆傝涔夋镆ョ敱鍒嗘瀽鍣/鍒嗘瀽鍣ㄥ畬鎴愩

鍒嗘瀽鍣ㄨ繍琛岀敱瑙f瀽鍣ㄧ敓鎴愮殑瑙f瀽镙戠殑璇涔夊垎鏋愬苟鐢熸垚镆ヨ㈡爲銆

镆ヨ㈡爲镄勬牴鏄瀹氢箟鍦 parsenodes.h涓镄 [镆ヨ](javascript:void(0))缁撴瀯锛涙ょ粨鏋勫寘钖鍏剁浉搴旀煡璇㈢殑鍏冩暟鎹锛屼緥濡傛ゅ懡浠ょ殑绫诲瀷锛圫ELECT銆両NSERT 鎴栧叾浠栵级鍜屽嚑涓鍙跺瓙锛涙疮涓鍙跺瓙褰㈡垚涓涓鍒楄〃鎴栨爲锛屽苟淇濆瓨钖勪釜鐗瑰畾瀛愬彞镄勬暟鎹銆

杩版煡璇㈡爲绠杩板备笅銆

閲嶅啓鍣ㄦ槸瀹炵幇 瑙勫垯绯荤粺 镄勭郴缁燂纴蹇呰佹椂镙规嵁瀛桦偍鍦 pg_rules绯荤粺鐩褰曚腑镄勮勫垯鍙樻崲镆ヨ㈡爲銆

PostgreSQL 涓镄勮嗗浘 鏄浣跨敤瑙勫垯绯荤粺瀹炵幇镄勚傚綋瑙嗗浘鐢 CREATE VIEW 锻戒护瀹氢箟镞讹纴鐩稿簲镄勮勫垯浼氲嚜锷ㄧ敓鎴愬苟瀛桦偍鍦ㄧ洰褰曚腑銆

锅囱惧凡缁忓畾涔変简浠ヤ笅瑙嗗浘锛屽苟涓斿瑰簲镄勮勫垯瀛桦偍鍦 pg_rules 绯荤粺鐩褰曚腑銆

褰揿彂鍑哄寘钖濡备笅镓绀鸿嗗浘镄勬煡璇㈡椂锛岃В鏋愬櫒灏嗗垱寤鸿В鏋愭爲锛屽傚浘镓绀恒

鍦ㄨ繖涓阒舵碉纴閲嶅啓鍣ㄥ皢锣冨洿琛ㄨ妭镣瑰勭悊涓哄瓙镆ヨ㈢殑瑙f瀽镙戯纴鍗冲瑰簲镄勮嗗浘锛屽瓨鍌ㄥ湪 pg_rules 涓銆

璁″垝鍣ㄤ粠閲嶅啓鍣ㄦ帴鏀舵煡璇㈡爲骞剁敓鎴愬彲浠ョ敱镓ц屽櫒链链夋晥鍦板勭悊镄勶纸镆ヨ锛夎″垝镙戙

PostgreSQL 涓镄勮″垝鍣ㄦ槸锘轰簬绾鎴愭湰浼桦寲镄勶绂瀹冧笉鏀鎸佸熀浜庤勫垯镄勪紭鍖栧拰鎻愮ず銆傝繖涓瑙勫垝鍣ㄦ槸 RDBMS 涓链澶嶆潅镄勫瓙绯荤粺

涓庡叾浠 RDBMS 涓镙凤纴PostgreSQL 涓镄 EXPLAIN锻戒护鏄剧ず璁″垝镙戞湰韬銆 濡备笅镓绀恒

浠栧瑰簲镄勮″垝镙戯细

姣忎釜璁″垝鑺傜偣閮芥湁镓ц屽櫒闇瑕佸勭悊镄勪俊鎭锛屽崟琛ㄦ煡璇㈢殑𨱍呭喌涓嬶纴镓ц屽櫒浠庤″垝镙戠殑链绔鍒版牴杩涜屽勭悊銆

PostgreSQL 镄勬煡璇浼桦寲鏄锘轰簬鎴愭湰镄勚傛垚链鏄镞犻噺绾插硷纴瀹冧滑涓嶆槸缁濆圭殑缁╂晥鎸囨爣锛岃屾槸姣旇缉杩愯惀鐩稿圭哗鏁堢殑鎸囨爣銆傛垚链鐢 costsize.c 涓瀹氢箟镄勫嚱鏁颁及绠椼傛墽琛屽櫒镓ц岀殑镓链夋搷浣滈兘链夌浉搴旂殑鎴愭湰鍑芥暟銆备緥濡傦纴椤哄簭镓鎻忓拰绱㈠紩镓鎻忕殑鎴愭湰鍒嗗埆鐢 cost_seqscan() 鍜 cost_index() 浼扮畻銆

链変笁绉嶆垚链锛屽惎锷ㄦ垚链锛屾墽琛屾垚链浠ュ强镐绘垚链銆傚叾涓镐绘垚链 = 钖锷ㄦ垚链 + 镓ц屾垚链銆

椤哄簭镓鎻忕殑鎴愭湰鐢 cost_seqscan() 鍑芥暟浼扮畻銆

鍏朵腑 seq_page_cost 銆 cpu_tuple_cost 鍜 cpu_operator_cost 鍦 postgresql.conf 鏂囦欢涓璁剧疆锛岄粯璁ゅ煎垎鍒涓 1.0 銆 0.01 鍜 0.0025 锛孨tuple鍜孨page鍒嗗埆鏄璇ヨ〃镄勬墍链夊厓缁勫拰镓链夐〉镄勭紪鍙枫

浠庤繍琛屾垚链浼扮畻鍙浠ョ湅鍑猴纴PostgreSQL 锅囱炬墍链夐〉闱㈤兘灏嗕粠瀛桦偍涓璇诲彇锛涗篃灏辨槸璇达纴PostgreSQL 涓嶈冭槛镓鎻忕殑椤甸溃鏄钖﹀湪鍏变韩缂揿啿鍖轰腑銆

铏界劧 PostgreSQL 鏀鎸 涓浜涚储寮曟柟娉 锛屼緥濡 BTree銆 GiST 銆 GIN 鍜 BRIN 锛屼絾绱㈠紩镓鎻忕殑鎴愭湰鏄浣跨敤甯歌佺殑鎴愭湰鍑芥暟浼扮畻镄勶细cost_index()銆

绱㈠紩镓鎻忕殑钖锷ㄦ垚链鏄璇诲彇绱㈠紩椤典互璁块梾鐩镙囱〃涓绗涓涓鍏幂粍镄勬垚链锛屽畠鐢变互涓嬬瓑寮忓畾涔夛细

Hindex鏄绱㈠紩镙戠殑楂桦害銆

绱㈠紩镓鎻忕殑杩愯屾垚链鏄琛ㄥ拰绱㈠紩镄 cpu 鎴愭湰鍜 IO锛堣緭鍏/杈揿嚭锛夋垚链涔嫔拰锛

鍓崭笁涓鎴愭湰瀹氢箟濡备笅锛


鍏朵腑 cpu_index_tuple_cost 鍜 random_page_cost 鍦 postgresql.conf 鏂囦欢涓璁剧疆锛堥粯璁ゅ垎鍒涓 0.005 鍜 4.0锛夛绂 qual_op_cost绮楃暐𨱒ヨ村氨鏄鎸囨暟镄勮瘎浼版垚链锛屽间负0.0025銆傞夋嫨镐ч夋嫨镐ф槸鎸囧畾WHERE瀛愬彞瀵圭储寮旷殑鎼灭储锣冨洿镄勬瘆渚嬶绂瀹冩槸涓涓浠 0 鍒 1 镄勬诞镣规暟

镆ヨ㈣皳璇岖殑阃夋嫨鐜囨槸阃氲繃鐩存柟锲剧晫鍊间笌楂橀戝间及璁$殑锛岃繖浜涗俊鎭閮藉偍瀛桦湪绯荤粺鐩褰昿g_staticstics涓锛屽苟鍙阃氲繃pg_stats瑙嗗浘镆ヨ銆

琛ㄤ腑镄勬疮涓鍒楃殑楂橀戝奸兘鍦╬g_stats瑙嗗浘镄刴ost_common_vals鍜宫ost_common_freqs涓鎴愬瑰瓨鍌ㄣ

鎺掑簭璺寰勪细鍦ㄦ帓搴忔搷浣滀腑琚浣跨敤銆傛帓搴忔搷浣滃寘𨰾琽rder by銆佸綊骞惰繛鎺ョ殑棰勫勭悊镎崭綔锛屼互鍙婂叾浠栧嚱鏁般傚嚱鏁瘫ost_sort()鐢ㄤ簬浼拌℃帓搴忔搷浣灭殑浠d环銆傚傛灉鑳藉湪宸ヤ綔鍐呭瓨涓鏀句笅镓链夊厓缁勶纴闾d箞鎺掑簭镎崭綔浼氶夌敤蹇阃熸帓搴忕畻娉曘傚惁鍒椤氨浼氩垱寤轰复镞舵枃浠讹纴浣跨敤鏂囦欢褰掑苟鎺掑簭绠楁硶銆

鎺掑簭璺寰勭殑钖锷ㄤ唬浠峰氨鏄瀵圭洰镙囱〃镄勬帓搴忎唬浠凤纴锲犳や唬浠峰氨鏄疧(Nsort) * Log 2 (Nsort)锛岃繖閲孨sort灏辨槸甯︽帓搴忕殑鍏幂粍鏁般傛帓搴忚矾寰勭殑杩愯屼唬浠峰氨鏄璇诲彇宸茬粡鎺掑簭濂界殑鍏幂粍镄勪唬浠凤纴锲犳や唬浠峰氨鏄疧锛圢sort锛夈

PostgreSQL涓镄勮″垝鍣ㄤ细镓ц屼笁涓姝ラわ细

璁块梾璺寰勬槸浼扮畻浠d环镞剁殑澶勭悊鍗曞厓銆傛瘆濡傞‘搴忔壂鎻忋佺储寮曟壂鎻忋佹帓搴忥纴浠ュ强钖勭嶈繛鎺ユ搷浣滈兘链夊叾瀵瑰簲镄勮矾寰勚傝块梾璺寰勫彧鍦ㄨ″垝鍣ㄥ垱寤烘煡璇㈣″垝镙戠殑镞跺欎娇鐢ㄣ傛渶蹇屾湰镄勮块梾璺寰勬暟鎹缁撴瀯灏辨槸relation.h涓瀹氢箟镄刾ath缁撴瀯浣掳纴鐩稿綋浜庨‘搴忔壂鎻忋傛墍链夊叾浠栫殑璺寰勮块梾閮藉熀浜庤ョ粨鏋勚

鍦ㄥ垱寤鸿″垝镙戜箣鍓嶏纴璁″垝鍣ㄥ皢绾垮笔lannerInfo涓镄勬煡璇涔﹁繘琛屼竴浜涢勫勭悊銆傞勫勭悊链夊緢澶氭ラわ纴链鑺傚艰ㄨ哄拰鍗曡〃镆ヨ㈠勭悊鐩稿叧镄勪富瑕佹ラゃ

璁″垝鍣ㄥ规墍链夊彲鑳界殑璁块梾璺寰勮繘琛屼唬浠蜂及璁★纴铹跺悗阃夋嫨浠d环链灏忕殑闾d釜銆

鍦ㄦ渶钖庝竴姝ヤ腑锛岃″垝鍣ㄦ寜镦т唬浠锋渶灏忕殑璺寰勭敓鎴愪竴棰楄″垝镙戙

璁″垝镙戠殑镙硅妭镣规槸瀹氢箟鍦╬lannodes.h涓镄凯lannedstmt缁撴瀯锛屽寘钖19涓瀛楁碉纴鍏朵腑链4涓浠h〃镐у瓧娈碉细

璁″垝镙戝寘钖钖勫纺钖勬牱镄勮″垝鑺傜偣銆侾lanNode鏄镓链夎″垝鑺傜偣镄勫熀绫伙纴鍏朵粬璁″垝鑺傜偣閮戒细鍖呭惈PlanNode缁撴瀯銆傛瘆濡傞‘搴忔壂鎻忚妭镣笋eqScanNode鍖呭惈涓涓狿lanNode鍜屼竴涓鏁村瀷鍙橀噺scanrelid銆侾lanNode鍖呭惈14涓瀛楁碉纴涓嬮溃鏄7涓浠h〃镐у瓧娈:

鍦ㄥ崟琛ㄦ煡璇㈢殑渚嫔瓙涓锛屾墽琛屽櫒浠庤″垝镙戜腑鍙栧嚭璁″垝鑺傜偣锛屾寜镦ц嚜搴曞悜涓婄殑椤哄簭杩涜屽勭悊锛屽苟璋幂敤鑺傜偣鐩稿簲镄勫勭悊鍑芥暟銆

姣忎釜璁″垝鑺傜偣閮芥湁鐩稿簲镄勫嚱鏁帮纴鐢ㄤ簬镓ц岃妭镣瑰瑰簲镄勬搷浣溿傝繖浜涘嚱鏁板湪src/backend/executor鐩褰曚腑銆

鐞呜В镓ц屽櫒濡备綍宸ヤ綔镄勬渶濂芥柟寮忥纴灏辨槸阒呰笾xplain锻戒护镄勮緭鍑恒

鎴戜滑鍙浠ヨ嚜搴曞悜涓婇槄璇笾xplain镄勭粨鏋滐纴𨱒ョ湅涓鐪嬫墽琛屽櫒鏄濡备綍宸ヤ綔镄勚

绗鍏琛岋细棣栧厛锛屾墽琛屽櫒阃氲繃nodeSeqscan.c涓瀹氢箟镄勫嚱鏁版墽琛岄‘搴忔壂鎻忔搷浣溿

绗锲涜岋细铹跺悗锛屾墽琛屽櫒阃氲繃nodeSort.c涓瀹氢箟镄勫嚱鏁帮纴瀵归‘搴忔壂鎻忕殑缁撴灉杩涜屾帓搴忋

镓ц屽櫒鍦ㄥ勭悊镆ヨ㈡椂浼氢娇鐢ㄥ伐浣滃唴瀛桦拰涓存椂缂揿啿鍖猴纴涓よ呴兘鍦ㄥ唴瀛树腑鍒嗛厤銆傚傛灉镆ヨ㈡棤娉曞湪鍐呭瓨涓瀹屾垚锛屽氨浼氱敤鍒颁复镞舵枃浠躲

浣跨敤甯︽湁Analyze阃夐”镄别xplain锛屽緟瑙i喷镄勫懡浠や细鐪熸f墽琛岋纴骞舵樉绀哄疄闄呯粨鏋滆屾暟銆佸疄闄呮墽琛屾椂闂村拰瀹为檯鍐呭瓨浣跨敤閲忋

鍦ㄧ6琛岋纴explain锻戒护鏄剧ず镓ц屽櫒浣跨敤浜10000KB镄勪复镞舵枃浠躲备复镞舵枃浠朵细琚涓存椂鍒涘缓鍦╞ase/pg_tmp瀛愮洰褰曚腑锛屽苟阆靛惊濡备笅锻戒护瑙勫垯锛氾经钬减gsql_tmp钬濓綕+ 锝涘垱寤烘湰鏂囦欢镄刾ostgres杩涚▼pid锝.{浠0寮濮嬬殑搴忓垪鍙穧

姣斿傦纴涓存椂鏂囦欢pgsql_tmp8903.5鏄痯id涓8903镄刾ostgres杩涚▼鍒涘缓镄勭6涓涓存椂鏂囦欢銆

PostgreSQL涓鏀鎸佷笁绉嶈繛鎺ユ搷浣滐纴鍒嗗埆鏄宓屽楀惊鐜杩炴帴锛屽綊骞惰繛鎺ュ拰鏁e垪杩炴帴銆傚湪pg涓锛屽祵濂楀惊鐜杩炴帴鍜屽綊骞惰繛鎺ユ湁鍑犵嶅彉浣撱

杩欎笁绉嶈繛鎺ユ柟寮忛兘鏀鎸乸g涓镓链夌殑杩炴帴镎崭綔锛屾敞鍏inner join銆 left/right outer join銆 full outer join绛夈

寰鐜宓屽楄繛鎺ヤ笉闇瑕佷换浣曞惎锷ㄤ唬浠凤纴锲犳わ细start-up cost = 0

杩愯屼唬浠峰拰鍐呭栬〃灏哄哥殑涔樼Н鎴愭瘆渚嬶纴鍗硆un cost鏄疧(Nouter * Ninner)锛 Nouter鍜孨inner鍒嗗埆鏄澶栬〃鍜屽唴琛ㄧ殑鍏幂粍𨱒℃暟銆俽un cost镄勫畾涔夊备笅锛

Couter鍜孋inner鍒嗗埆鏄鍐呰〃鍜屽栬〃椤哄簭镓鎻忕殑浠d环銆

寰鐜宓屽楄繛鎺ョ殑浠d环镐讳细琚浼拌★纴浣嗗疄闄呬腑寰埚皯浼氢娇鐢ㄨ繖绉嶈繛鎺ユ搷浣滐纴锲犱负瀹冩湁鍑犵嶆洿楂樻晥镄勫彉浣撱

鍦ㄤ笂闱㈡弿杩扮殑寰鐜宓屽楄繛鎺ヤ腑锛屾疮褰撹诲彇涓𨱒″栬〃涓镄勫厓缁勬椂锛岄兘闇瑕佹壂鎻忓唴镙囦腑镄勬墍链夊厓缁勚备綅姣忔浔澶栬〃鍏幂粍瀵瑰唴镙囧仛鍏ㄨ〃镓鎻忥纴杩欎竴杩囩▼浠d环楂樻槀锛宲g鏀鎸佷竴绉岖墿鍖栧祵濂楀惊鐜杩炴帴锛屽彲浠ュ噺灏戝唴镙囧叏琛ㄦ壂鎻忕殑浠d环銆

鍦ㄨ繍琛屽祵濂楀惊鐜杩炴帴涔嫔墠锛屾墽琛屽櫒浼氢娇鐢ㄤ复镞跺厓缁勫瓨鍌ㄦā鍧楀瑰唴琛ㄨ繘琛屼竴娆℃壂鎻忥纴灏嗗唴琛ㄥ厓缁勫姞杞藉埌宸ヤ綔鎴栦复镞舵枃浠朵腑銆傚湪澶勭悊鍐呰〃鍏幂粍镞讹纴涓存椂鍏幂粍瀛桦偍姣旂紦鍐插尯绠$悊鍣ㄦ洿涓洪珮鏁堬纴鐗瑰埆鏄褰撴墍链夌殑鍏幂粍閮借兘鏀惧叆宸ヤ綔鍐呭瓨涓銆

qg鍐呴儴鎻愪緵浜嗕复镞跺厓缁勫瓨鍌ㄧ殑妯″潡锛屽彲鐢ㄤ簬钖勭嶆搷浣滐纴濡备簲鑺辫啒銆佸垱寤烘贩钖堟暎鍒楄繛鎺ョ殑镓规$瓑銆傝ユā鍧楀寘钖涓绯诲垪鍑芥暟锛岄兘鍦╰uplestore.c涓銆傝繖浜涘嚱鏁扮敤浜庝粠宸ヤ綔鍐呭瓨鎴栦复镞舵枃浠惰诲啓鍏幂粍銆傝ュ伐浣滃唴瀛樿缮鏄涓存椂鏂囦欢鍙栧喅浜庡緟瀛桦偍鍏幂粍镄勬绘暟銆

涓婇溃鏄剧ず浜嗘墽琛屽櫒瑕佽繘琛岀殑镎崭綔锛屾墽琛屽櫒瀵硅繖浜涜″垝鑺傜偣镄勫勭悊杩囩▼濡备笅锛

绗7琛岋细镓ц屽櫒浣跨敤椤哄簭镓鎻忥纴鐗╁寲鍐呴儴琛╰bl_b銆

绗4琛岋细镓ц屽櫒镓ц屽祵濂楀惊鐜杩炴帴镎崭綔锛屽栬〃鏄痶bl_a锛屽唴琛ㄦ槸鐗╁寲镄则bl_b銆

濡傛灉鍐呰〃涓婃湁绱㈠紩锛屼笖璇ョ储寮曡兘鐢ㄤ簬鎼灭储婊¤冻杩炴帴𨱒′欢镄勫厓缁勶纴闾d箞璁″垝鍣ㄥ湪澶栧栬〃镄勬疮𨱒″厓缁勬悳绱㈠唴镙囦腑镄勫尮閰嶅厓缁勬椂锛屼细钥冭槛浣跨敤绱㈠紩杩涜岀洿鎺ユ悳绱锛屼互镟夸唬椤哄簭镓鎻忋傝繖绉嶅彉浣揿彨锅氱储寮曞祵濂楀惊鐜杩炴帴锛屽备笅锲炬墍绀恒傝槠铹惰繖绉嶅彉浣揿彨锅气灭储寮曞祵濂楀惊鐜杩炴帴钬濓纴浣嗘槸璋佽ョ畻娉曞熀链涓婂彧闇瑕佸湪澶栬〃涓婂惊鐜涓娆★纴锲犳よ繛鎺ユ搷浣灭殑镓ц岄潪甯搁珮鏁堛

涓庡祵濂楀惊鐜杩炴帴涓嶅悓镄勬槸锛屽綊骞惰繛鎺ュ彧鑳界敤浜庤嚜铹惰繛鎺ヤ笌绛夊艰繛鎺ャ

鍑芥暟initial_cost_merge_join()鍜宖inal_cost_merge_join()鐢ㄤ簬浼拌″綊骞惰繛鎺ョ殑浠d环銆

褰掑苟杩炴帴镄勫惎锷ㄦ垚链鏄鍐呰〃涓庡栬〃鎺掑簭鎴愭湰涔嫔拰锛屽洜姝ゅ叾钖锷ㄦ垚链涓猴细

杩欓噷Nouter鍜孨inner鍒嗗埆鏄澶栬〃鍜屽唴镙囩殑鍏幂礌𨱒℃暟锛岃岃繍琛屼唬浠锋槸O(Nouter + Ninner)銆

涓嫔浘鏄褰掑苟杩炴帴镄勭ず镒忓浘銆

濡傛灉镓链夊厓缁勯兘鍙浠ュ瓨鍌ㄥ湪鍐呭瓨涓锛岄偅涔堟帓搴忔搷浣滃氨鑳藉湪鍐呭瓨涓杩涜岋纴钖﹀垯灏辨槸鐢ㄤ复镞舵枃浠躲

绗9琛岋细镓ц屽櫒瀵瑰唴琛╰bl_b杩涜屾帓搴忥纴浣跨敤椤哄簭镓鎻忥纸绗11琛岋级銆

绗6琛岋细镓ц屽櫒瀵瑰栬〃tbl_a杩涜屾帓搴忥纴浣跨敤椤哄簭镓鎻(绗8琛)銆

绗4琛岋细镓ц屽櫒镓ц屽綊骞惰繛鎺ユ搷浣滐纴澶栬〃鏄鎺掑簭濂界殑tbl_a锛屽唴琛ㄦ槸鎺掑ソ搴忕殑tbl_b銆

涓庡祵濂楀惊鐜杩炴帴绫讳技锛屽綊骞惰繛鎺ヨ缮鏀鎸佺墿鍖栧綊骞惰繛鎺ワ纴鐗╁寲鍐呰〃锛屼娇鍐呰〃镓鎻忔洿涓洪珮鏁堛

涓嬮溃鏄鐗╁寲褰掑苟杩炴帴镄别xplain缁撴灉锛屽緢瀹规槗鍙戠幇锛屼笌鏅阃氩綊骞惰繛鎺ョ殑宸寮傛槸绗9琛:Materialize銆

涓庡綊骞惰繛鎺ョ被浼硷纴hash杩炴帴鍙鑳界敤浜庤嚜铹惰繛鎺ヤ笌绛夊艰繛鎺ャ

PostgreSQL涓镄勬暎鍒楄繛鎺ョ殑琛屼负锲犺〃镄勫ぇ灏忚屽纾銆傚傛灉甯冩爣瓒冲熷皬锛堢‘鍒囩殑璇达纴鍐呰〃澶у皬涓嶈秴杩囧伐浣滃唴瀛樼殑25%锛夛纴闾d箞hash杩炴帴灏辨槸绠鍗旷殑涓ら桩娈靛唴瀛榟ash杩炴帴锛屽惁鍒椤皢浼氢娇鐢ㄥ甫鍊炬枩镓规$殑娣峰悎hash杩炴帴銆

鍐呭瓨涓镄删ash杩炴帴鏄鍦╳ork_mem涓澶勭悊镄勶纴鍦╬g涓锛屾暎鍒楄〃鍖哄烟琚绉颁綔澶勭悊镓规°备竴涓镓瑰勭悊镓规′细链夊氢釜鏁e垪妲斤纴鍐呴儴绉板叾涓烘《锛屾《镄勬暟閲忕敱nodeHash.c涓瀹氢箟镄凟xecChooseHashTableSize()鍑芥暟镓纭瀹氥傛《镄勬暟閲忔槸2镄勬暣鏁版″箓銆

鍐呭瓨鏁e垪杩炴帴链変袱涓阒舵碉纴鍒嗗埆鏄鏋勫缓阒舵靛拰鎺㈡祴阒舵点傚湪鏋勫缓阒舵碉纴鍐呭瓨琛ㄤ腑镄勬墍链夊厓缁勯兘浼氲鎻掑叆鍒板勭悊镓规′腑锛涘湪鎺㈡祴阒舵垫疮𨱒¤厱琛ㄥ厓缁勯兘浼氢笌澶勭悊镓规′腑镄勫唴琛ㄥ厓缁勬瘆杈冿纴濡傛灉婊¤冻杩炴帴𨱒′欢锛屽垯灏嗕袱𨱒″厓缁勮繛鎺ヨ捣𨱒ャ

褰揿唴琛ㄧ殑鍏幂粍镞犳硶鍏ㄩ儴瀛桦偍鍦ㄥ伐浣滃唴琛ㄤ腑镄勫崟涓澶勭悊镓规℃椂锛宲g浣跨敤甯﹀炬枩镓规$殑娣峰悎鏁e垪杩炴帴绠楁硶锛岃ョ畻娉曟椂娣峰悎鏁e垪杩炴帴璇剁殑涓绉嶅彉浣撱

鍦ㄧ涓涓鏋勫缓鍜屾帰娴嬮桩娈祊ostgresql鍑嗗囧氢釜镓规★纴瀹囬氱殑鏁扮洰绫讳技锛屽勭悊镓规$殑鏁版嵁鐢卞嚱鏁癊xecChooseHashTableSize()鍐冲畾锛屼篃灏辨槸2镄勬暣鏁版″箓銆傚伐浣滃唴瀛树腑鏅烘収鍒嗛厤涓涓澶勭悊镓规★纴钥屽叾浠栨壒娆¢兘浠ヤ复镞舵枃浠剁殑褰㈠纺鍒涘缓銆傚睘浜庤繖浜涙壒娆$殑鍏幂粍灏嗛氲繃涓存椂鍏幂粍瀛桦偍锷熻兘琚鍐椤叆鍒扮浉搴旂殑鏂囦欢涓銆

涓轰简銮峰彇链浣宠″垝镙戯纴璁″垝鍣ㄥ繀椤昏冭槛钖勪釜绱㈠紩涓庡悇绉嶈繛鎺ユ柟娉曚箣闂寸殑镓链夊彲鑳界粍钖堛傚傛灉琛ㄧ殑鏁伴噺瓒呰繃镆愪釜姘村钩锛岃ヨ繃绋嬬殑浠d环灏变细锲犱负缁勫悎鐖嗙偢钥屽彉寰楅潪甯告槀璐碉纴浠ヨ呖浜庢牴链涓嶅彲琛屻

濡傛灉琛ㄧ殑鏁伴噺灏忎簬12寮狅纴璁″垝鍣ㄥ彲浠ヤ娇鐢ㄥ姩镐佽勫垝𨱒ヨ幏鍙栨渶浣宠″垝銆

阅读全文

与sql预处理命令相关的资料

热点内容
海康录像机怎么关视频加密 浏览:786
编程以后有可能被机器人代替吗 浏览:515
windows创建文件命令 浏览:984
linuxcopy文件内容 浏览:381
程序员帅哥秃顶 浏览:839
阿里云服务器开通流程 浏览:105
如何开云服务器 浏览:979
网站小说源码 浏览:301
php用什么ide 浏览:867
网上预约课程app哪个好 浏览:152
android兼容测试工具 浏览:96
云服务器不支持虚拟化怎么办 浏览:189
加密方式的演变 浏览:364
java常用算法pdf 浏览:734
服务器数据遇到异常什么原因 浏览:450
phpexif信息 浏览:543
单片机三字节浮点数 浏览:756
命令与征服泰伯利亚战争下载 浏览:378
c窗口界面编程 浏览:23
hypermill编程能做模板吗 浏览:783