千家信息网

Unique SQL原理是什么

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要介绍"Unique SQL原理是什么",在日常操作中,相信很多人在Unique SQL原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Unique
千家信息网最后更新 2026年11月01日Unique SQL原理是什么

这篇文章主要介绍"Unique SQL原理是什么",在日常操作中,相信很多人在Unique SQL原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Unique SQL原理是什么"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、什么是Unique SQL

用户执行SQL语句时,每一个SQL语句文本都会进入解析器(Parser),生成"解析树"(parse tree)。遍历解析树中各个结点,忽略其中的常数值,以一定的算法结合树中的各结点,计算出来一个整数值,用来唯一标识这一类SQL,这个整数值被称为Unique SQL ID,Unique SQL ID相同的SQL语句属于同一个"Unique SQL"。
例如,用户先后输入如下两条SQL语句:

select * from t1 where id = 1;select * from t1 where id = 2;

这两条SQL语句除了过滤条件的常数值不同,其他地方都相同,由此生成的解析树的拓扑结构完全相同,故Unique SQL ID也相同。因此两条语句属于如下同一个Unique SQL:
select * from t1 where id = ?;
GaussDB内核会对所有上面形式的SQL语句汇总统计信息,通过视图呈现给用户。通过这种方式,可以排除一些无关的常量值的干扰,获得某一类SQL语句的统计数据,为性能分析和问题定位提供数值依据。
注意,对于Unique SQL ID的计算,只会排除常数值,而不会排除其他的差异。例如,SQL语句"select * from t2 where id = 1;" 与上面的SQL不属于同一个Unique SQL,不同用户,从不同的CN节点执行的相同的SQL语句也不属于同一个Unique SQL。

2、Unique SQL如何统计

收到SQL请求后,GaussDB内核首先算出其Unique SQL ID。如果该Unique SQL ID已存在,则直接更新相关的统计信息。如果不存在,首先创建一个Unique SQL,然后再更新统计信息,如下图所示:

Unique SQL的统计信息包括执行次数,响应时间,Cache/IO数量,行活动和时间分布等信息,可以通过如下两个视图查询:

  • gs_instr_unique_sql

  • pgxc_instr_unique_sql
    前者显示当前CN(Coordinator Node)节点(执行当前SQL命令的节点)上的Unique SQL信息,后者显示系统中所有CN节点上的Unique SQL信息。两个视图的格式相同,均由下表中的字段组成:

3、如何使用Unique SQL

使用Unique SQL功能需要打开以下变量开关:

  • enable_resource_check(默认为on)

  • track_counts(默认为on,影响行活动和Cache/IO相关字段)
    此外还需要将instr_unique_sql_count设为正整数。该变量默认为0,且不能在gsql会话中修改,需要通过SIGHUP的方式设置,例如:

gs_guc reload -Z coordinator -D /path/to/coordinator1/ -c "instr_unique_sql_count=20" > /dev/null

instr_unique_sql_count参数决定了系统收集的unique sql的数量。当收集的unique数量达到这个数后,新的sql不再被收集。如果将该数值改大,原有的unique sql信息保留,同时开始收集新的unique sql。如果将该数值改小,则会清空当前CN节点所有已收集的unique sql信息,然后开始收集新的unique sql。

设置好上述变量后,Unique sql统计视图可以像普通视图一样查询,例如:

postgres=# select node_name,query,n_calls from pgxc_instr_unique_sql;  node_name   |                           query                            | n_calls--------------+------------------------------------------------------------+--------- coordinator2 | select node_name,query,n_calls from pgxc_instr_unique_sql; |       0(1 row)

系统函数reset_instr_unique_sql可以清理unique sql信息,该函数有3个参数,含义如下:

  1. scope:如果为"GLOBAL",则清除所有CN节点上的数据;如果为"LOCAL",只清空当前CN上的数据。

  2. type:如果为"ALL",则清除所有数据;如果为"BY_USERID",只清除指定用户的unique SQL;如果为"BY_CNID",只清除指定CN的unique SQL。

  3. value:如果type="ALL",该参数无意义;如果type="BY_USERID",该参数为指定用户的ID,如果type="BY_CNID",该参数为指定CN的ID。
    例如:

postgres=# select reset_instr_unique_sql('global','all',0); reset_instr_unique_sql------------------------ t(1 row)

此外,如果数据库进程重启,也会导致之前收集的unique SQL信息被清空。

4、用Unique SQL辅助定位问题

unique sql视图提供了丰富的信息,用户可以根据需要选取对自己有帮助的信息使用。本节针对客户在生产环境中遇到的实际情况,举例说明几种该视图的使用方法,可供性能优化参考。

4.1 查询异常的行活动导致的磁盘争用
异常的行活动可能引起磁盘争用,导致业务运行缓慢。通过查看扫描的行数、返回的函数、更改的行数等指标的波动情况,可以发现异常的行活动,帮助定位原因。

postgres=# select sum(n_returned_rows) n_returned_rows, sum(n_tuples_fetched) n_tuples_fetched,sum(n_tuples_returned) n_tuples_returned, sum(n_tuples_inserted) n_tuples_inserted,sum(n_tuples_updated) n_tuples_updated, sum(n_tuples_deleted) n_tuples_deleted from pgxc_instr_unique_sql; n_returned_rows | n_tuples_fetched | n_tuples_returned | n_tuples_inserted | n_tuples_updated | n_tuples_deleted-----------------+------------------+-------------------+-------------------+------------------+------------------             234 |                0 |                 0 |                 0 |                0 |                0(1 row)

4.2 查询Top SQL对资源的占用情况
可以基于执行时间、CPU时间、扫描行数、物理读/逻辑读等指标,对unique SQL视图中的SQL语句进行排序,找出占用资源最多的那些SQL语句,有针对性地其分析对性能的影响和原因,帮助查找和定位问题。例如,

  • 按SQL执行时间顺序或倒序排序:
    SELECT user_name, unique_sql_id, query, total_elapse_time FROM pgxc_instr_unique_sql ORDER BY total_elapse_time ASC 或 DESC;

  • 按SQL执行占用CPU时间进行顺序或倒序排序:
    SELECT user_name, unique_sql_id, query, cpu_time FROM pgxc_instr_unique_sql ORDER BY cpu_time ASC 或 DESC;

  • 按SQL顺序扫描行数顺序或倒序排序:
    SELECT user_name, unique_sql_id, query, n_tuples_returned FROM pgxc_instr_unique_sql ORDER BY n_tuples_returned ASC 或 DESC;

  • 按SQL总扫描行进行顺序或倒序排序:
    SELECT user_name, unique_sql_id, query, n_tuples_fetched + n_tuples_returned FROM pgxc_instr_unique_sql ORDER BY n_tuples_fetched + n_tuples_returned ASC 或 DESC;

  • 按SQL执行执行器时间进行顺序或倒序排序:
    SELECT user_name, unique_sql_id, query, execution_time FROM pgxc_instr_unique_sql ORDER BY execution_time ASC 或 DESC;

  • 按SQL执行物理读次数进行顺序或倒序排序:
    SELECT user_name, unique_sql_id, query, n_blocks_fetched FROM pgxc_instr_unique_sql ORDER BY n_blocks_fetched ASC 或 DESC;

  • 按SQL执行逻辑读次数进行顺序或倒序排序:
    SELECT user_name, unique_sql_id, query, n_blocks_hit FROM pgxc_instr_unique_sql ORDER BY n_blocks_hit ASC 或 DESC;

4.3 查询逻辑读/物理读数量
逻辑读/物理读过多可能导致SQL语句占用较多的CPU时间。通过查询unique SQL视图可以得到sql语句逻辑/物理读数据块的数量,辅助判断响应过慢的原因:

  • 查询物理读块数量:
    SELECT n_blocks_fetched FROM pgxc_instr_unique_sql;

  • 查询逻辑读块数量:
    SELECT n_blocks_hit FROM pgxc_instr_unique_sql;

4.4 诊断内存配额不足导致性能低下
如果数据库缓冲区设置得太小,会导致每个SQL语句执行的结果不能被缓存,当前SQL执行完毕如果有其他SQL执行就会把内存中上一个或上几个SQL缓存的执行结果挤出去,下一轮如果当前这个SQL再次执行时候又需要从磁盘进行物理IO读取数据,而不能直接从缓存中获取数据,进而导致SQL执行性能较差。
缓冲区配额是否足够大,可以通过命中率来判断。缓冲区命中率=n_blocks_hit/n_blocks_fetched,可以通过查询unique SQL来诊断是否存在内存配额不足的问题:
SELECT (n_blocks_hit/ n_blocks_fetched) AS hit_ratio from pgxc_instr_unique_sql;

到此,关于"Unique SQL原理是什么"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

语句 信息 数据 视图 查询 数值 时间 顺序 排序 倒序 数量 物理 用户 统计 相同 节点 逻辑 参数 问题 帮助 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网黑科技 广州大一互联网络科技有限公司 江苏根荣互联网科技 互联网科技活动banner 中资互联网科技 互联网科技公司发展 互联网科技革命 凡科互联网科技 上海喔噻互联网科技 广州互联网络科技有限公司 重庆科技学院互联网 富国互联网科技创新基金 青岛中康互联网医疗科技有限公司 互联网科技博主是什么意思 移动互联网科技股 受益于互联网科技的高速发展 济南小医互联网科技有限公司招聘 优雇互联网科技有限公司 广东猫王互联网科技有限公司电话 互联网的黑科技实验室 奇酷互联网络科技 狮子座互联网科技有限公司 互联网金融监管科技 太原新华互联网科技学校怎么样 杭州壁岐互联网科技有限公司 成都互联网科技公司工作好不好 互联网数据科技专业 锡山区互联网智能科技产品供应 产业互联网科技服务公司 杭州融税互联网科技有限公司
0