lt_qualstats是LightDB的一个扩展,用于统计WHERE语句和JOIN子句中出现的谓词的统计信息。
如果您想要分析数据库中最常执行的谓词,那么使用此功能将会很有帮助。
此外,它还可以帮助您识别相关列,通过识别哪些列最常一起查询。
该扩展通过查找查询中已知的模式来进行工作。目前,已知的模式包括:
二元OpExpr,其中至少一侧是来自表格的列。在可能的情况下,谓词将被交换, 以将CONST OP VAR表达式转换为VAR COMMUTED_OP CONST。AND和OR表达式成员被视为单独的条目。 例如:WHERE column1 = 2,WHERE column1 = column2,WHERE 3 = column3。
ScalarArrayOpExpr,其中左侧是一个VAR,右侧是一个数组常量。这将针对数组中的每个元素计数一次。 例如:WHERE column1 IN (2, 3) 将被计为(column1,'=')操作符对的2个出现次数。
BooleanTest,其中表达式是一个简单的布尔列引用。 例如:WHERE column1 IS TRUE。请注意,像WHERE column1、WHERE NOT column1这样的子句尚未由lt_qualstats处理。
该扩展还会保存每个执行的不同queryid的第一个查询文本,原封不动地保存,
最多保存 lt_qualstats.max
条目。
请注意,当 LightDB 服务器重新启动时,收集的数据不会被保存。
可以在lightdb.conf中配置以下GUC参数:
lt_qualstats.enabled
(布尔类型,默认值为true):是否启用lt_qualstats。
lt_qualstats.track_constants
(布尔类型,默认值为true):是否应将每个常量值单独跟踪。
禁用此GUC将显著减少跟踪谓词所需的条目数。
lt_qualstats.max
:跟踪的谓词和查询文本的最大数量(默认为1000)。
lt_qualstats.resolve_oids
(布尔类型,默认值为false):是否应在查询时解析oid,或者只存储oid。
启用此参数可以使数据分析更加容易,因为不需要连接到执行查询的数据库,但它会占用更多的空间(每个条目624字节而不是176字节)。
此外,这将需要一些不是免费的目录查找。
lt_qualstats.track_pg_catalog
(布尔类型,默认值为false):
是否应在pg_catalog架构中的对象上计算谓词。
lt_qualstats.sample_rate
(双精度浮点数,默认值为-1):应采样的查询的比例。
例如,0.1表示只对十个查询中的一个进行采样。默认值(-1)表示自动,结果为1 / max_connections,
因此从统计上来说,并发问题很少发生。
请注意,由于所有扩展都配置在 shared_preload_libraries 中, 因此大多数更改仅在使用新共享库重新启动LightDB时应用。 扩展对象本身仅提供SQL包装器以访问内部数据结构。
还请注意,lt_qualstats不提供扩展升级脚本,因为在创建的任何对象中都没有保存数据。 因此,您需要先删除扩展,然后再创建它以获得新版本。
在任何数据库中创建扩展:
CREATE EXTENSION lt_qualstats;
该扩展定义了以下函数:
pg_qualstats
:返回每个限定符的计数,由表达式哈希标识。
此哈希标识每个表达式。
userid
:执行查询的用户的oid。
dbid
:执行查询的数据库的oid。
lrelid, lattnum
:如果有,则为左侧VAR的关系和属性编号的oid。
opno
:表达式中使用的运算符的oid。
rrelid, rattnum
:如果有,则为右侧VAR的关系和属性编号的oid。
qualid
:如果有,则为父“AND”表达式的标准化标识符。
排除常量计算此标识符。这对于识别一起使用的谓词非常有用。
uniquequalid
:如果有,则为父“AND”表达式的唯一标识符。
包括常量在内计算此标识符。
qualnodeid
:此简单谓词的标准化标识符。
排除常量计算此标识符。
uniquequalnodeid
: 此简单谓词的唯一标识符。
此标识符包括常量在内进行计算。
occurences
: 谓词被调用的次数,即相关查询执行的次数。
execution_count
: 谓词执行的次数,即它处理的行数。
nbfiltered
: 谓词丢弃的元组数量。
constant_position
: 常量在原始查询字符串中的位置,由解析器报告。
queryid
: 如果安装了pg_stats_statements,则为标识此查询的queryid,否则为NULL。
constvalue
: 右侧常量的字符串表示,如果有的话,截断为80个字节。
需要超级用户或pg_read_all_stats
成员,否则将显示""。
eval_type
: 评估类型。'f'表示在扫描后评估的谓词,'i'表示索引谓词。
示例:
ro=# select * from pg_qualstats; userid │ dbid │ lrelid │ lattnum │ opno │ rrelid │ rattnum │ qualid │ uniquequalid │ qualnodeid │ uniquequalnodeid │ occurences │ execution_count │ nbfiltered │ constant_position │ queryid │ constvalue │ eval_type --------+--------+---------+----------+-------+---------+----------+---------+---------------+-------------+-------------------+-------------+------------------+-------------+--------------------+----------+-----------------+------------ 10 │ 16384 │ 16385 │ 2 │ 98 │ │ │ │ │ 115075651 │ 1858640877 │ 1 │ 100000 │ 99999 │ 29 │ │ 'line 1'::text │ f 10 │ 16384 │ 16391 │ 2 │ 98 │ 16385 │ 2 │ │ │ 497379130 │ 497379130 │ 1 │ 0 │ 0 │ │ │ │ f
pg_qualstats_index_advisor(min_filter, min_selectivity, forbidden_am)
:
执行全局索引建议。默认情况下,仅考虑过滤至少1000行和平均30%行的谓词,
但可以作为参数传递。如果您想要避免某些索引访问方法,可以提供一个索引访问方法数组。
示例:
SELECT v FROM json_array_elements( pg_qualstats_index_advisor(min_filter => 50)->'indexes') v ORDER BY v::text COLLATE "C"; v --------------------------------------------------------------- "CREATE INDEX ON public.adv USING btree (id1)" "CREATE INDEX ON public.adv USING btree (val, id1, id2, id3)" "CREATE INDEX ON public.pgqs USING btree (id)" (3 rows) SELECT v FROM json_array_elements( pg_qualstats_index_advisor(min_filter => 50)->'unoptimised') v ORDER BY v::text COLLATE "C"; v ----------------- "adv.val ~~* ?" (1 row)
pg_qualstats_deparse_qual
:以tablename.columname operatorname ?的形式格式化存储的谓词。
这主要是为了全局索引建议。
pg_qualstats_get_idx_col
:针对给定的谓词,检索底层列名和所有可能的操作符类。
这主要是为了全局索引建议。
pg_qualstats_get_qualnode_rel
:针对给定的谓词,返回底层表的完全限定名称。
这主要是为了全局索引建议。
pg_qualstats_example_queries
:返回所有存储的查询文本。
pg_qualstats_example_query
:如果有,则返回给定queryid的存储查询文本,否则为NULL。
pg_qualstats_names
:返回所有存储的谓词名称。
pg_qualstats_reset
:重置内部计数器并忘记每个遇到的谓词。
此外,该扩展还在pg_qualstats函数之上定义了一些视图:
pg_qualstats
:通过当前数据库过滤对pg_qualstats()的调用。
pg_qualstats_pretty
:执行适当的连接,以显示pg_qualstats视图中每个属性的可读聚合形式。
示例:
ro=# select * from pg_qualstats_pretty; left_schema | left_table | left_column | operator | right_schema | right_table | right_column | occurences | execution_count | nbfiltered -------------+------------------+-------------+--------------+--------------+-------------+--------------+------------+-----------------+------------ public | ltbench_accounts | aid | pg_catalog.= | | | | 5 | 5000000 | 4999995 public | ltbench_tellers | tid | pg_catalog.= | | | | 10 | 10000000 | 9999990 public | ltbench_branches | bid | pg_catalog.= | | | | 10 | 2000000 | 1999990 public | t1 | id | pg_catalog.= | public | t2 | id_t1 | 1 | 10000 | 9999
pg_qualstats_all
:对每个属性/操作符对的计数求和,无论其作为操作数(左侧或右侧)的位置如何,
都将用于AND子句中的属性分组在一起。
示例:
ro=# select * from pg_qualstats_all; dbid | relid | userid | queryid | attnums | opno | qualid | occurences | execution_count | nbfiltered | qualnodeid ------+-------+--------+---------+---------+------+--------+------------+-----------------+------------+------------ 16384 | 16385 | 10 | | {2} | 98 | | 1 | 100000 | 99999 | 115075651 16384 | 16391 | 10 | | {2} | 98 | | 2 | 0 | 0 | 497379130
pg_qualstats_by_query
:仅按queryid汇总的形式VAR OPERATOR CONSTANT返回谓词。