首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Postgresql源码(125)游标恢复执行的原理分析

问题 为什么每次fetch游标能从上一次的位置继续?后面用一个简单用例分析原理。...【速查】 恢复扫描需要知道当前页面、上一次扫描到的偏移位置、当前页面一共有几条: 当前页面:HeapScanDesc结构中记录了扫到的页面(scan->rs_cblock) 上一次扫描到的偏移位置...:scan->rs_cindex,注意rs_cindex是每个页面内的可见元组,从0开始算,每个页面都会从0遍历到scan->rs_ntuples为止。...: heapgettup_pagemode执行第N次: 所以为什么每次游标fetch都能继续上次的值: HeapScanDesc结构中记录了扫到的页面(scan->rs_cblock)、页面中的位置(scan...->rs_cindex),注意rs_cindex是每个页面内的可见元组需要,从0开始算,每个页面都会从0遍历到scan->rs_ntuples为止。

17510

【错综复杂】一个执行计划异常变更的案例(中)

常理上认为,既然使用了绑定变量,在值分布均匀的情况下,只需要SQL执行第一次硬解析时窥探一下,后续执行的SQL执行计划应该比较稳定。...记录这次解析时间为T1,时间戳值为Tmax。但此时,仍是重用了已有游标,不会做硬解析,不会使用更新的统计信息来生成一个新的执行计划。...这就解释了为何同一条SQL,执行计划一致,但却有两个子游标的情况。...3.频繁使用的游标,在超过时间戳Tmax值后,下次解析时就会被置为失效。 很明显,上面的这些方法是有效的,因为失效标记仅仅适用于这些频繁重用的游标,对于其他场景的游标可以忽略,未有影响。...总结 1.凡事有因果,同一条SQL,执行计划相同,但产生了两个子游标,总会有其的原因,上面游标失效标记可能是一个原因,当然还有可能是其他原因。

92350
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一次Oracle bug的故障排查过程思考

    ,分别是90和10000,表示一次删除10000条90天以前的历史数据(一天大约20万),日志记录了一次删除10000条的用时,都在6-10秒内,和前几日的执行时间相比,基本一致,并未出现异常, delete...应用逻辑: 梳理下应用逻辑,出现问题的功能,是记录流水信息,大致的操作步骤, 1. insert一条记录,其中包括插入第一个CLOB列。 2. update这条记录的第二个CLOB列。...3. update这条记录的第三个CLOB列。 4. update这条记录的第四个CLOB列。...因此,当存在一个并发未提交的大数据量delete操作,而insert操作消耗了超高的buffer gets,同一个会话下次访问相同对象的时候,利用这个fix,就能从这个“黑名单”缓存中得到性能的提升。...难道是10019未生效?还是未启作用?bug的定位有问题?

    1.1K20

    mysql面试必会6题经典_经典sql面试题及答案第7期

    避免对索引列进行计算,对where子句列的任何计算如果不能被编译优化,都会导致查询时索引失效。 c. 比较值避免使用NULL d. 多表查询时要注意是选择合适的表做为内表。...实际多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方案并从中找出系统开销最小的最佳方案。 e. 查询列与索引列次序一致。 f. 用多表连接代替EXISTS子句。 g....把过滤记录数最多的条件放在最前面。 h. 善于使用存储过程,它使sql变得更加灵活和高效。...为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。...游标是把结果集放在服务器内存,并通过循环一条一条处理记录,对数据库资源(特别是内存和锁资源)的消耗是非常大的,所以,我们应该只有在没有其他方法的情况下才使用游标。

    91620

    db2 terminate作用_db2 truncate table immediate

    01594 对于所有信息,SQLDA 内的条目数不够多(即,没有足够的描述符返回相异名称)。01595 该视图已替换现有无效视图。01596 没有为基于长字符串数据类型的单值类型创建比较函数。...类代码 24 无效的游标状态 表 19. 类代码 24:无效的游标状态 SQLSTATE 值 含义24501 标识的游标未打开。24502 在 OPEN 语句中标识的游标已经打开。...42707 ORDER BY 内的列名不标识结果表中的列。42709 在键列列表中指定了重复的列名。42710 检测到重复的对象或约束名。...42707 ORDER BY 内的列名不标识结果表中的列。 42709 在键列列表中指定了重复的列名。 42710 检测到重复的对象或约束名。...42818 运算符或函数的操作数不兼容或者不可比较。 42819 算术运算的操作数或需要数字的函数的操作数不是数字。 42820 数字常数太长,或其值不在该数据类型取值范围内。

    7.7K20

    查看死锁

    这是因为即便相同的SQL,每次执行耗时也可能不一样,所以,考虑求平均值,所以需要对SQL分组统计,SQL_TEXT相同,大概率为同一条SQL,所以考虑从按SQL_TEXT分组统计的vsqlarea读取信息...NUMBER 此游标用于解析,执行,获取(fetch)的CPU耗时 (以微秒为单位) ELAPSED_TIME NUMBER 此游标用于解析,执行,获取的占用时间(以微秒为单位)。...VALID_UNAUTH - 有效,未授权。INVALID_UNAUTH - 无效,未授权。INVALID - 无效,未授权,但保留时间戳。...用于唯一标识会话的对象。如果会话结束,而另一个会话以相同的会话ID开始,则保证将会话级命令应用于当前会话的对象。...”列值为 0,则表示该命令未记录在V$SESSION中。

    2.1K50

    mysql查询缓慢原因和解决方案

    如果某 个表具有 timestamp 列,则时间戳会被记到行级。服务器就可以比较某行的当前时间戳值和上次提取时所存储的时间戳值,从而确定该行是否已更新。...服务器不必比较所有列的值,只需比较 timestamp 列即可。如果应用程序对没有 timestamp 列的表要求基于行版本控制的乐观并发,则游标默认为基于数值的乐观并发控制。...如果在事务内打开游标,则该事务更新锁将一直保持到事务被提交或回滚;当提取下一行时,将除去游标锁。如果在事务外打开游标,则提取下一行时,锁就被丢弃。...因此,每当用户需要完全的悲观并发控制时,游标都应在事务内打开。更新锁将阻止任何其它任务获取更新锁或排它锁,从而阻止其它任务更新该行。...更新 TABLOCKX 错误 未锁定 未锁定 更新其它 未锁定 未锁定 未锁定 更新 *指定 NOLOCK 提示将使指定了该提示的表在游标内是只读的。

    3.3K30

    SQL游标(cursor)详细说明及内部循环使用示例

    SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。...由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来...当将行读入游标时,sqlserver不锁定行,它改用timestamp列值的比较结果来确定行读入游标后是否发生了修改,如果表不行timestamp列,它改用校验和值进行确定。...,获得提取状态信息,该状态用于判断Fetch语句返回数据的有效性。...这个参数有四个值分别是: adOpenForwardOnly 表示只允许在记录集内的记录间往前移动。这个是缺省值。

    2.2K30

    SQL游标(cursor)详细说明及内部循环使用示例

    SQL游标(cursor)详细说明及内部循环使用示例 游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。...由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来...当将行读入游标时,sqlserver不锁定行,它改用timestamp列值的比较结果来确定行读入游标后是否发生了修改,如果表不行timestamp列,它改用校验和值进行确定。...,获得提取状态信息,该状态用于判断Fetch语句返回数据的有效性。...这个参数有四个值分别是: adOpenForwardOnly 表示只允许在记录集内的记录间往前移动。这个是缺省值。

    2K20

    sql第九章简答题_sql语句declare用法

    游标定义SELECT查询,该查询用于选择要由这些FETCH语句检索的记录。可以发出一条CLOSE语句来关闭(但不是删除)游标。 作为SQL语句,仅嵌入式SQL支持DECLARE。...游标名称可以是任意长度,但在前29个字符内必须是唯一的。游标名称区分大小写。如果已声明指定的游标,编译将失败,并显示SQLCODE-52错误,游标名称已声明。 游标名称不是特定于命名空间的。...通过游标更新 可以使用带有WHERE CURRENT OF子句的UPDATE或DELETE语句,通过声明的游标执行记录更新和删除。...SQL中,如果对受影响的表和列具有适当的权限,则游标始终可以用于更新或删除操作。 DECLARE语句可以在查询后指定FOR UPDATE或FOR READ ONLY关键字子句。...这些子句是可选的,不执行任何操作。它们是作为在代码中记录发出查询的进程是否具有所需的更新和删除对象权限的一种方式提供的。

    69820

    SQL命令 DECLARE

    游标定义SELECT查询,该查询用于选择要由这些FETCH语句检索的记录。可以发出一条CLOSE语句来关闭(但不是删除)游标。 作为SQL语句,仅嵌入式SQL支持DECLARE。...游标名称可以是任意长度,但在前29个字符内必须是唯一的。游标名称区分大小写。如果已声明指定的游标,编译将失败,并显示SQLCODE-52错误,游标名称已声明。 游标名称不是特定于命名空间的。...通过游标更新 可以使用带有WHERE CURRENT OF子句的UPDATE或DELETE语句,通过声明的游标执行记录更新和删除。...SQL中,如果对受影响的表和列具有适当的权限,则游标始终可以用于更新或删除操作。 DECLARE语句可以在查询后指定FOR UPDATE或FOR READ ONLY关键字子句。...这些子句是可选的,不执行任何操作。它们是作为在代码中记录发出查询的进程是否具有所需的更新和删除对象权限的一种方式提供的。

    2.7K21

    rolling invalidation对子游标产生的影响

    1.执行dbms_stats,所有依赖于这个已分析对象的缓存cursor游标会被标记为rolling invalidation,并且记录此时刻是T0。...记录这次解析时间为T1,时间戳值为Tmax。但此时,仍是重用了已有游标,不会做硬解析,不会使用更新的统计信息来生成一个新的执行计划。...这就解释了为何同一条SQL,执行计划一致,但却有两个子游标的情况。...3.频繁使用的游标,在超过时间戳Tmax值后,下次解析时就会被置为失效。 很明显,上面的这些方法是有效的,因为失效标记仅仅适用于这些频繁重用的游标,对于其他场景的游标可以忽略,未有影响。...总结: 1.凡事有因果,同一条SQL,执行计划相同,但产生了两个子游标,总会有其的原因,上面游标失效标记可能是一个原因,当然还有可能是其他原因。

    1K10

    一个执行计划异常变更的案例 - 外传之rolling invalidation

    1.执行dbms_stats,所有依赖于这个已分析对象的缓存cursor游标会被标记为rolling invalidation,并且记录此时刻是T0。...记录这次解析时间为T1,时间戳值为Tmax。但此时,仍是重用了已有游标,不会做硬解析,不会使用更新的统计信息来生成一个新的执行计划。...这就解释了为何同一条SQL,执行计划一致,但却有两个子游标的情况。...3.频繁使用的游标,在超过时间戳Tmax值后,下次解析时就会被置为失效。 很明显,上面的这些方法是有效的,因为失效标记仅仅适用于这些频繁重用的游标,对于其他场景的游标可以忽略,未有影响。...总结: 1.凡事有因果,同一条SQL,执行计划相同,但产生了两个子游标,总会有其的原因,上面游标失效标记可能是一个原因,当然还有可能是其他原因。

    65920

    MySQL 入门常用命令大全(下)

    Read Uncommitted:读取未提交内容 所有事务都可以读取未提交事务的执行结果,也就是允许脏读。但不允许更新丢失。...3.7CCL(游标控制语言) 游标(cursor)是系统为用户开设的一个数据缓冲区,存放 SQL 语句的执行结果。...游标的操作主要用于存储过程中用来书写过程化的 SQL,类似于 Oracle 的 PL/SQL。使用 SQL 的一般遵循的步骤如下。 (1) 声明游标,把游标与 T-SQL 语句的结果集联系起来。...,游标也随之指向了记录的第一行*/ WHILE no_more_record !...此权限是在 MySQL5.0 中引入的; Create_user_priv: 执行 CREATE USER 命令,这个命令用于创建新的 MySQL 账户; Event_priv: 确定用户能否创建、修改和删除事件

    2.4K00

    MySQL 教程下

    游标主要用于交互式应用,其中用户需要滚动屏幕上的数据,并对数据进行浏览或做出更改。 只能用于存储过程 不像多数 DBMS, MySQL 游标只能用于存储过程(和函数)。...所需的存储过程代码需要复制到触发器内。...MySQL 事务 事务的隔离级别 事务的并发问题: 脏读 最可怕: 读取到另一个未提交的数据 不可重复读: 对同一记录的两次读取不一致, 因为另一事务对该记录做了修改 幻读(虚读): 对同一记录的两次查询不一致...EXTENDED 执行最彻底的检查,FAST 只检查未正常关闭的表,MEDIUM 检查所有被删除的链接并进行键检验,QUICK 只进行快速扫描。...它记录更新过数据(或者可能更新过数据)的所有语句。此日志通常名为 hostname-bin,位于 data 目录内。此名字可以用 --log-bin 命令行选项更改。

    1.1K10

    PLSQL 游标变量

    一、什么是游标变量     显示游标用于命名一个工作区域,其中保存多行查询的信息,而且该游标始终指向工作区域的内容。...我们可以用显式游标为工作区命名然后访问相关的信息;或者声明指向工作区的一个游标变量。无论在什么地方使用游标,它总是指向同一个查询工作区,而游标变量则可以指向不同的工作区。    ...-->声明游标变量 --下面的本地过程用于处理游标变量的结果集 --注,对于游标变量返回的结果集是一次性处理,而非对返回的每一行记录调用一次过程 PROCEDURE process_emp_cv...4、不能使用比较运算符来测试游标变量的等价性、不等价性或者非空性 5、游标变量不能被赋予NULL值 6、REF CURSOR类型不能在CREATE TABLE或者VIEW语句中使用,因为不存在数据库列的等价数据类型...7、使用游标变量的存储过程只能被用作查询块数据源,它不能用于DML块数据源。

    1.3K40

    SQL必知必会总结4-第18到22章

    fee=400 where id=2; # 语句2 语句1的成功执行,并不能将底层数据库中的第一个账户的数据进行修改,只是单纯地记录操作,记录在内存中完成 第二条语句成功执行之后,和底层数据库文件中的数据完成同步...若第二条数据执行失败,清空所有的历史记录 事务相关术语 事务处理相关的术语: 事务transaction:一组SQL语句。...解决了脏读问题,但是会对其他session产生两次不一样的读取结果 幻读:会话T1事务中执行一次查询,然后会话T2新插入一行记录,这行记录恰好可以满足T1所使用的查询的条件。...只有事务成功执行,硬盘中的数据才会进行修改更新。 2、 失败结束的标识 rollback:回滚 将所有的DML语句的操作记录进行全部清空。 使用游标 本章节中讲解的是什么是游标,以及如何使用游标。...创建索引前记住几点: 索引改善检索操作的性能,但是降低了数据插入、修改和删除的性能 索引数据可能要占用大量的存储空间 索引用于数据过滤和数据排序 可以在索引中定义多个列 索引必须唯一命名 CREATE

    1.3K30

    V$SQL、V$SQLAREA 和 V$SQLSTATS 的区别

    Oracle 数据库提供了三个动态视图,用于查询当前共享池中的所有 SQL 语句的执行统计信息。它们分别是 V$SQL、V$SQLAREA 和 V$SQLSTATS。本文将探讨它们之间的区别。...V$SQL 对于每个不同版本的 SQL 语句都有一行记录。这意味着每个子语句都有自己的执行统计信息,而且一个 SQL 语句在该视图中可能有多行记录。...V$SQLAREA 和 V$SQLSTATS 对于每个不同的 SQL 字符串(即每个父游标)只有一行记录。这意味着所有子游标的统计信息,即该游标的不同版本,都被合并到一起。...首先,我们执行相同的 SQL 语句两次,同时在两次执行之间更改会话变量,以创建同一个SQL的两个执行版本: SQL> select /* sql_version */ last_name from employees...,而 V$SQLAREA 和 V$SQLSTATS 只包含其中一行,并且执行统计信息列如 BUFFER_GETS 和 ELAPSED_TIME 已被汇总。

    75010
    领券