K.24. lt_qualstats

K.24.1. Configuration
K.24.2. 更新扩展
K.24.3. 使用方法

lt_qualstats是LightDB的一个扩展,用于统计WHERE语句和JOIN子句中出现的谓词的统计信息。

如果您想要分析数据库中最常执行的谓词,那么使用此功能将会很有帮助。

此外,它还可以帮助您识别相关列,通过识别哪些列最常一起查询。

该扩展通过查找查询中已知的模式来进行工作。目前,已知的模式包括:

该扩展还会保存每个执行的不同queryid的第一个查询文本,原封不动地保存, 最多保存 lt_qualstats.max 条目。

请注意,当 LightDB 服务器重新启动时,收集的数据不会被保存。

K.24.1. Configuration

可以在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, 因此从统计上来说,并发问题很少发生。

K.24.2. 更新扩展

请注意,由于所有扩展都配置在 shared_preload_libraries 中, 因此大多数更改仅在使用新共享库重新启动LightDB时应用。 扩展对象本身仅提供SQL包装器以访问内部数据结构。

还请注意,lt_qualstats不提供扩展升级脚本,因为在创建的任何对象中都没有保存数据。 因此,您需要先删除扩展,然后再创建它以获得新版本。

K.24.3. 使用方法

  • 在任何数据库中创建扩展:

                           CREATE EXTENSION lt_qualstats;
                    

K.24.3.1. 函数

该扩展定义了以下函数:

  • 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:重置内部计数器并忘记每个遇到的谓词。

K.24.3.2. 视图

此外,该扩展还在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返回谓词。