南大通用GBase 8a表打开缓冲参数table_open_cache和表定义缓冲参数table_definition_cache

gbase对每个访问的表,都将其表结构(frm)进行缓冲,最大缓冲数量通过table_definition_cache定义。当表每次被访问都被打开并缓冲,最大缓冲数量通过table_open_cache定义。

定义最大可缓冲的打开中的TABLE数量

每个表被open时,会使用1个文件描述符来处理数据,第一次打开时还需要1个文件描述符(file descriptor)来处理索引(索引后续共享使用)。表每次被访问到都会被open,如果同时多次打开,比如多session的并发或者一个SQL内使用多次,则计算多次。

参数设置建议根据并发数,每个session涉及的表数量计算。比如100个并发,每个访问N个表(无论是否为同一个表),那么这个参数建议设置成100*N。 当然实际设置时,是要考虑系统使用的量,比如中间临时表。

如果表OPEN数量超过了参数,且没有可回收的(LRU),有可能临时打开表,使用后立即释放。

该参数涉及到了open_files的操作系统参数。过大会占用太多内存,过小会每次都打开文件描述符,影响性能。

gbase> SHOW GLOBAL VARIABLES LIKE '%table_open_cache%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| table_open_cache | 64    |
+------------------+-------+
1 row in set (Elapsed: 00:00:00.00)

查看当前打开的table数量

如果一直是满的,可以考虑增加table_open_cache参数了。

gbase> SHOW GLOBAL STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 27    |
+---------------+-------+
1 row in set (Elapsed: 00:00:00.00)

定义表结构缓冲数量 table_definition_cache

可以缓冲表的frm结构。

参数设置建议根据实际表的数量,特别时近期常用的表数量进行缓冲,避免过大而浪费内存(但一半frm表结构都很小,K几倍,1万个也就10M),过小则每次从磁盘读取影响性能。

gbase> SHOW GLOBAL VARIABLES LIKE '%table_definition_cache%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| table_definition_cache | 256   |
+------------------------+-------+
1 row in set (Elapsed: 00:00:00.00)

查看当前打开的表定义

Opened_table_definitions 打开过的
Open_table_definitions 当前打开的。

gbase> show status like '%table_def%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Open_table_definitions   | 303   |
| Opened_table_definitions | 72    |
+--------------------------+-------+
2 rows in set (Elapsed: 00:00:00.00)
....
gbase> show status like '%table_def%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Open_table_definitions   | 547   |
| Opened_table_definitions | 1249  |
+--------------------------+-------+
2 rows in set (Elapsed: 00:00:00.00)

如果当前要打开的超过了前面定义的最大值,且在prepare 的SQL里,会报 Prepared statement needs to be re-prepared 错误。

查看当前打开的表

gbase> show open tables;
+------------+-------------------+--------+-------------+
| Database   | Table             | In_use | Name_locked |
+------------+-------------------+--------+-------------+
| testdb     | t1                |      0 |           0 |
| testdb     | t2                |      0 |           0 |
| gbase      | event             |      0 |           0 |
| gclusterdb | audit_log_express |      0 |           0 |
+------------+-------------------+--------+-------------+
4 rows in set (Elapsed: 00:00:00.00)
gbase> show open tables from testdb;
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| testdb   | t1    |      0 |           0 |
| testdb   | t2    |      0 |           0 |
+----------+-------+--------+-------------+
2 rows in set (Elapsed: 00:00:00.00)