等待事件含义

IO:DataFileRead等待事件发生在会话连接等待后端进程从存储中读取所需页面,原因是该页面在共享内存中不可用或无法找到。

所有查询和数据操作(DML)操作都访问缓冲池中的页面,语句包括SELECT、UPDATE和DELETE。例如,UPDATE可以从表或索引中读取页面。如果请求或更新的页面不在共享缓冲池中,则此读取可能导致IO:DataFileRead事件。

因为共享缓冲池是有限的,如果业务繁忙,它可能会被填满。在这种情况下,对不在内存中的页面的请求会迫使数据库从磁盘中读取块。如果IO:DataFileRead事件频繁发生,则共享缓冲池可能太小,无法容纳工作负载。对于读取大量结果集的SELECT查询来说,这个问题非常严重。

等待时间增加的可能原因

1、连接峰值

您可能发现多个连接生成相同数量的等待事件DataFileRead,在这种情况下,DataFileRead等待事件可能出现尖峰式放大。

2、执行顺序扫描的 SELECT 和 DML 语句

应用程序可能正在执行新操作,例如新上业务,或者现有操作可能会因为新的执行计划而更改。在这种情况下,通过sys_stat_user_tables视图查看超大顺序扫描的大表,并使用sys_stat_statements视图跟踪这类型的大型查询语句。

3、用于大型数据集的 CTAS 和 CREATE INDEX

CTAS是CREATE TABLE AS SELECT语句。如果使用大型数据集作为源运行CTAS,或在大型表上创建索引,则可能会发生IO:DataFileRead事件。创建索引时,数据库可能需要使用顺序扫描读取整个对象。当页面不在内存中时,生成此等待事件。

4、多个vacuum进程同时运行

vacuum进程可以手动或自动触发。当一个表有许多更新或删除的行时,IO:DataFileRead等待事件会增加。表回收空间后,用于IO:DataFileRead的vacuum时间会减少。

5、引入大量数据

当应用程序接收大量数据时,ANALYZE操作可能会更频繁地发生。IO:DataFileRead等待事件会增加。

注:ANALYZE操作读取表的一个子集。必须扫描的页数是通过将30乘以default_statistics_target值来计算的。default_statistics_target参数接受介于1和10000之间的值,其中默认值为100。

6、服务器资源匮乏

如果实例网络带宽或 CPU 被消耗很多,则此事件可能会更频繁地发生。

解决方法

为生成等待事件的查询检查谓词筛选条件

如何确定正在生成IO:DataFileRead等待事件的特定查询,您可以使用以下方法找到特定查询:

例如扩展sys_stat_statements提供的视图,或者通过KWR报告中的top sql选项。

视图pg_stat_all_tables。

sys_statio_all_tables视图中会显示heap_blks_read正在增加。

在top sql中找到可疑的sql并运行EXPLAIN命令。在输出中,识别使用的扫描类型。注意顺序扫描并不一定表明表有问题。但是那些大量结果集使用顺序扫描的查询自然会产生更多的IO:DataFileRead事件。这时需要对sql调优。

将维护影响降至最低

vacuum和analyze等维护操作非常重要,不建议关闭,以下方法可以最大限度地减少这些操作的影响:

  • 在非高峰时段手动运行维护操作。此方法可防止数据库达到自动操作的阈值,或针对性设置表级vacuum触发阈值。
  • 对于非常大的表,请考虑对表进行分区。此技术可减少维护操作的开销。数据库仅需要维护子分区即可。
  • 引入大量数据时,请考虑禁用自动分析功能。

当以下公式成立时,autoivacuum功能会自动触发。

  1. sys_stat_user_tables.n_dead_tup > (sys_class.reltuples x autovacuum_vacuum_scale_factor) + autovacuum_vacuum_threshold

1、查找占用不必要空间的表

若查找占用过多空间的表,请运行以下查询。查询仅返回有关用户角色有权读取的那些表的信息。

  1. WITH report AS (
  2. SELECT schemaname
  3. ,tblname
  4. ,n_dead_tup
  5. ,n_live_tup
  6. ,block_size*tblpages AS real_size
  7. ,(tblpages-est_tblpages)*block_size AS extra_size
  8. ,CASE WHEN tblpages - est_tblpages > 0
  9. THEN 100 * (tblpages - est_tblpages)/tblpages::float
  10. ELSE 0
  11. END AS extra_ratio, fillfactor, (tblpages-est_tblpages_ff)*block_size AS bloat_size
  12. ,CASE WHEN tblpages - est_tblpages_ff > 0
  13. THEN 100 * (tblpages - est_tblpages_ff)/tblpages::float
  14. ELSE 0
  15. END AS bloat_ratio
  16. ,is_na
  17. FROM (
  18. SELECT ceil( reltuples / ( (block_size-page_hdr)/tpl_size ) ) + ceil( toasttuples / 4 ) AS est_tblpages
  19. ,ceil( reltuples / ( (block_size-page_hdr)*fillfactor/(tpl_size*100) ) ) + ceil( toasttuples / 4 ) AS est_tblpages_ff
  20. ,tblpages
  21. ,fillfactor
  22. ,block_size
  23. ,tblid
  24. ,schemaname
  25. ,tblname
  26. ,n_dead_tup
  27. ,n_live_tup
  28. ,heappages
  29. ,toastpages
  30. ,is_na
  31. FROM (
  32. SELECT ( 4 + tpl_hdr_size + tpl_data_size + (2*ma)
  33. - CASE WHEN tpl_hdr_size%ma = 0 THEN ma ELSE tpl_hdr_size%ma END
  34. - CASE WHEN ceil(tpl_data_size)::int%ma = 0 THEN ma ELSE ceil(tpl_data_size)::int%ma END
  35. ) AS tpl_size
  36. ,block_size - page_hdr AS size_per_block
  37. ,(heappages + toastpages) AS tblpages
  38. ,heappages
  39. ,toastpages
  40. ,reltuples
  41. ,toasttuples
  42. ,block_size
  43. ,page_hdr
  44. ,tblid
  45. ,schemaname
  46. ,tblname
  47. ,fillfactor
  48. ,is_na
  49. ,n_dead_tup
  50. ,n_live_tup
  51. FROM (
  52. SELECT tbl.oid AS tblid
  53. ,ns.nspname AS schemaname
  54. ,tbl.relname AS tblname
  55. ,tbl.reltuples AS reltuples
  56. ,tbl.relpages AS heappages
  57. ,coalesce(toast.relpages, 0) AS toastpages
  58. ,coalesce(toast.reltuples, 0) AS toasttuples
  59. ,psat.n_dead_tup AS n_dead_tup
  60. ,psat.n_live_tup AS n_live_tup
  61. ,24 AS page_hdr
  62. ,current_setting('block_size')::numeric AS block_size
  63. ,coalesce(substring( array_to_string(tbl.reloptions, ' ') FROM 'fillfactor=([0-9]+)')::smallint, 100) AS fillfactor
  64. ,CASE WHEN version()~'mingw32' OR version()~'64-bit|x86_64|ppc64|ia64|amd64' THEN 8 ELSE 4 END AS ma
  65. ,23 + CASE WHEN MAX(coalesce(null_frac,0)) > 0 THEN ( 7 + count(*) ) / 8 ELSE 0::int END AS tpl_hdr_size
  66. ,sum( (1-coalesce(s.null_frac, 0)) * coalesce(s.avg_width, 1024) ) AS tpl_data_size
  67. ,bool_or(att.atttypid = 'pg_catalog.name'::regtype) OR count(att.attname) <> count(s.attname) AS is_na
  68. FROM pg_attribute AS att
  69. JOIN pg_class AS tbl ON (att.attrelid = tbl.oid)
  70. JOIN pg_stat_all_tables AS psat ON (tbl.oid = psat.relid)
  71. JOIN pg_namespace AS ns ON (ns.oid = tbl.relnamespace)
  72. LEFT JOIN pg_stats AS s ON (s.schemaname=ns.nspname AND s.tablename = tbl.relname AND s.inherited=false AND s.attname=att.attname)
  73. LEFT JOIN pg_class AS toast ON (tbl.reltoastrelid = toast.oid)
  74. WHERE att.attnum > 0
  75. AND NOT att.attisdropped
  76. AND tbl.relkind = 'r'
  77. GROUP BY tbl.oid, ns.nspname, tbl.relname, tbl.reltuples, tbl.relpages, toastpages, toasttuples, fillfactor, block_size, ma, n_dead_tup, n_live_tup
  78. ORDER BY schemaname, tblname
  79. ) AS s
  80. ) AS s2
  81. ) AS s3
  82. ORDER BY bloat_size DESC
  83. )
  84. SELECT *
  85. FROM report
  86. WHERE bloat_ratio != 0
  87. -- AND schemaname = 'public'
  88. -- AND tblname = 'pgbench_accounts'
  89. ;
  90. -- WHERE NOT is_na
  91. -- AND tblpages*((pst).free_percent + (pst).dead_tuple_percent)::float4/100 >= 1

2、查找消耗不必要空间的索引

若要查找占用不必要空间的索引,请运行以下查询。

  1. -- WARNING: run with a nonsuperuser role, the query inspects
  2. -- only indexes on tables you have permissions to read.
  3. -- WARNING: rows with is_na = 't' are known to have bad statistics ("name" type is not supported).
  4. -- This query is compatible with PostgreSQL 8.2 and later.
  5. SELECT current_database(), nspname AS schemaname, tblname, idxname, bs*(relpages)::bigint AS real_size,
  6. bs*(relpages-est_pages)::bigint AS extra_size,
  7. 100 * (relpages-est_pages)::float / relpages AS extra_ratio,
  8. fillfactor, bs*(relpages-est_pages_ff) AS bloat_size,
  9. 100 * (relpages-est_pages_ff)::float / relpages AS bloat_ratio,
  10. is_na
  11. -- , 100-(sub.pst).avg_leaf_density, est_pages, index_tuple_hdr_bm,
  12. -- maxalign, pagehdr, nulldatawidth, nulldatahdrwidth, sub.reltuples, sub.relpages
  13. -- (DEBUG INFO)
  14. FROM (
  15. SELECT coalesce(1 +
  16. ceil(reltuples/floor((bs-pageopqdata-pagehdr)/(4+nulldatahdrwidth)::float)), 0
  17. -- ItemIdData size + computed avg size of a tuple (nulldatahdrwidth)
  18. ) AS est_pages,
  19. coalesce(1 +
  20. ceil(reltuples/floor((bs-pageopqdata-pagehdr)*fillfactor/(100*(4+nulldatahdrwidth)::float))), 0
  21. ) AS est_pages_ff,
  22. bs, nspname, table_oid, tblname, idxname, relpages, fillfactor, is_na
  23. -- , stattuple.pgstatindex(quote_ident(nspname)||'.'||quote_ident(idxname)) AS pst,
  24. -- index_tuple_hdr_bm, maxalign, pagehdr, nulldatawidth, nulldatahdrwidth, reltuples
  25. -- (DEBUG INFO)
  26. FROM (
  27. SELECT maxalign, bs, nspname, tblname, idxname, reltuples, relpages, relam, table_oid, fillfactor,
  28. ( index_tuple_hdr_bm +
  29. maxalign - CASE -- Add padding to the index tuple header to align on MAXALIGN
  30. WHEN index_tuple_hdr_bm%maxalign = 0 THEN maxalign
  31. ELSE index_tuple_hdr_bm%maxalign
  32. END
  33. + nulldatawidth + maxalign - CASE -- Add padding to the data to align on MAXALIGN
  34. WHEN nulldatawidth = 0 THEN 0
  35. WHEN nulldatawidth::integer%maxalign = 0 THEN maxalign
  36. ELSE nulldatawidth::integer%maxalign
  37. END
  38. )::numeric AS nulldatahdrwidth, pagehdr, pageopqdata, is_na
  39. -- , index_tuple_hdr_bm, nulldatawidth -- (DEBUG INFO)
  40. FROM (
  41. SELECT
  42. i.nspname, i.tblname, i.idxname, i.reltuples, i.relpages, i.relam, a.attrelid AS table_oid,
  43. current_setting('block_size')::numeric AS bs, fillfactor,
  44. CASE -- MAXALIGN: 4 on 32bits, 8 on 64bits (and mingw32 ?)
  45. WHEN version() ~ 'mingw32' OR version() ~ '64-bit|x86_64|ppc64|ia64|amd64' THEN 8
  46. ELSE 4
  47. END AS maxalign,
  48. /* per page header, fixed size: 20 for 7.X, 24 for others */
  49. 24 AS pagehdr,
  50. /* per page btree opaque data */
  51. 16 AS pageopqdata,
  52. /* per tuple header: add IndexAttributeBitMapData if some cols are null-able */
  53. CASE WHEN max(coalesce(s.null_frac,0)) = 0
  54. THEN 2 -- IndexTupleData size
  55. ELSE 2 + (( 32 + 8 - 1 ) / 8)
  56. -- IndexTupleData size + IndexAttributeBitMapData size ( max num filed per index + 8 - 1 /8)
  57. END AS index_tuple_hdr_bm,
  58. /* data len: we remove null values save space using it fractionnal part from stats */
  59. sum( (1-coalesce(s.null_frac, 0)) * coalesce(s.avg_width, 1024)) AS nulldatawidth,
  60. max( CASE WHEN a.atttypid = 'pg_catalog.name'::regtype THEN 1 ELSE 0 END ) > 0 AS is_na
  61. FROM pg_attribute AS a
  62. JOIN (
  63. SELECT nspname, tbl.relname AS tblname, idx.relname AS idxname,
  64. idx.reltuples, idx.relpages, idx.relam,
  65. indrelid, indexrelid, indkey::smallint[] AS attnum,
  66. coalesce(substring(
  67. array_to_string(idx.reloptions, ' ')
  68. from 'fillfactor=([0-9]+)')::smallint, 90) AS fillfactor
  69. FROM pg_index
  70. JOIN pg_class idx ON idx.oid=pg_index.indexrelid
  71. JOIN pg_class tbl ON tbl.oid=pg_index.indrelid
  72. JOIN pg_namespace ON pg_namespace.oid = idx.relnamespace
  73. WHERE pg_index.indisvalid AND tbl.relkind = 'r' AND idx.relpages > 0
  74. ) AS i ON a.attrelid = i.indexrelid
  75. JOIN pg_stats AS s ON s.schemaname = i.nspname
  76. AND ((s.tablename = i.tblname AND s.attname = pg_catalog.pg_get_indexdef(a.attrelid, a.attnum, TRUE))
  77. -- stats from tbl
  78. OR (s.tablename = i.idxname AND s.attname = a.attname))
  79. -- stats from functionnal cols
  80. JOIN pg_type AS t ON a.atttypid = t.oid
  81. WHERE a.attnum > 0
  82. GROUP BY 1, 2, 3, 4, 5, 6, 7, 8, 9
  83. ) AS s1
  84. ) AS s2
  85. JOIN pg_am am ON s2.relam = am.oid WHERE am.amname = 'btree'
  86. ) AS sub
  87. -- WHERE NOT is_na
  88. ORDER BY 2,3,4;

3、查找符合autovacuum条件的表

若要查找符合自动清除条件的表,请运行以下查询。

  1. --This query shows tables that need vacuuming and are eligible candidates.
  2. --The following query lists all tables that are due to be processed by autovacuum.
  3. -- During normal operation, this query should return very little.
  4. WITH vbt AS (SELECT setting AS autovacuum_vacuum_threshold
  5. FROM pg_settings WHERE name = 'autovacuum_vacuum_threshold')
  6. , vsf AS (SELECT setting AS autovacuum_vacuum_scale_factor
  7. FROM pg_settings WHERE name = 'autovacuum_vacuum_scale_factor')
  8. , fma AS (SELECT setting AS autovacuum_freeze_max_age
  9. FROM pg_settings WHERE name = 'autovacuum_freeze_max_age')
  10. , sto AS (SELECT opt_oid, split_part(setting, '=', 1) as param,
  11. split_part(setting, '=', 2) as value
  12. FROM (SELECT oid opt_oid, unnest(reloptions) setting FROM pg_class) opt)
  13. SELECT
  14. '"'||ns.nspname||'"."'||c.relname||'"' as relation
  15. , pg_size_pretty(pg_table_size(c.oid)) as table_size
  16. , age(relfrozenxid) as xid_age
  17. , coalesce(cfma.value::float, autovacuum_freeze_max_age::float) autovacuum_freeze_max_age
  18. , (coalesce(cvbt.value::float, autovacuum_vacuum_threshold::float) +
  19. coalesce(cvsf.value::float,autovacuum_vacuum_scale_factor::float) * c.reltuples)
  20. as autovacuum_vacuum_tuples
  21. , n_dead_tup as dead_tuples
  22. FROM pg_class c
  23. JOIN pg_namespace ns ON ns.oid = c.relnamespace
  24. JOIN pg_stat_all_tables stat ON stat.relid = c.oid
  25. JOIN vbt on (1=1)
  26. JOIN vsf ON (1=1)
  27. JOIN fma on (1=1)
  28. LEFT JOIN sto cvbt ON cvbt.param = 'autovacuum_vacuum_threshold' AND c.oid = cvbt.opt_oid
  29. LEFT JOIN sto cvsf ON cvsf.param = 'autovacuum_vacuum_scale_factor' AND c.oid = cvsf.opt_oid
  30. LEFT JOIN sto cfma ON cfma.param = 'autovacuum_freeze_max_age' AND c.oid = cfma.opt_oid
  31. WHERE c.relkind = 'r'
  32. AND nspname <> 'pg_catalog'
  33. AND (
  34. age(relfrozenxid) >= coalesce(cfma.value::float, autovacuum_freeze_max_age::float)
  35. or
  36. coalesce(cvbt.value::float, autovacuum_vacuum_threshold::float) +
  37. coalesce(cvsf.value::float,autovacuum_vacuum_scale_factor::float) * c.reltuples <= n_dead_tup
  38. -- or 1 = 1
  39. )
  40. ORDER BY age(relfrozenxid) DESC;

解决大量连接

当发现DatabaseConnections度量出现峰值。此增加表示与数据库的连接数量增加。建议采用以下方法:

限制应用程序可以对每个实例打开的连接数。如果您的应用程序具有嵌入式连接池功能,请设置合理的连接数量,设置基于实例中CPU可以有效并行化的数量。

对于不适用的空闲连接要及时释放。

KingbaseES V8R6 等待事件之DataFileRead的更多相关文章

  1. Oracle Tuning 基础概述01 - Oracle 常见等待事件

    对Oracle数据库整体性能的优化,首先要关注的是在有性能问题时数据库排名前几位等待事件是哪些.Oracle等待事件众多,随着版本的升级,数量还在不断增加,可以通过v$event_name查到当前数据 ...

  2. SQL SERVER中的OLEDB等待事件

    OLEDB等待事件介绍 OLEDB等待类型是SQL SERVER 数据库中最常见的几种等待类型之一.它意味着某个会话(SPID)通过SQL Server Native Client OLEDB Pro ...

  3. ORACLE等待事件:enq: TX - row lock contention

    enq: TX - row lock contention等待事件,这个是数据库里面一个比较常见的等待事件.enq是enqueue的缩写,它是一种保护共享资源的锁定机制,一个排队机制,先进先出(FIF ...

  4. ORACLE等待事件: log file parallel write

    log file parallel write概念介绍 log file parallel write 事件是LGWR进程专属的等待事件,发生在LGWR将日志缓冲区(log_buffer)中的重做日志 ...

  5. 数据库服务器CPU持续百分之百、部分Session一直处于执行状态---等待事件为:asynch descriptor resize(Oracle Bug )

    问题描述: 项目反馈数据库服务器的CPU持续100%的情况,跟踪发现很多活动会话的等待事件是“asynch descriptor resize”,并且这些会话一直处于Active状态,而这些会话执行的 ...

  6. DB SQL Monitor 阻塞及等待事件监控工具

    SQL Monitor Designed By zhaoguan wang 说明------------------------------------------------------------ ...

  7. truncate表hang住(等待时间较长),出现enq:RO fast object reuse等待事件

    有一个应用truncate表等待了一晚上,一个定时任务,跑了几年了,今天早上来发现昨晚没有执行完成,hang住了,查询发现等待事件 fast object reuse. 10.2.0.4的库 Bug ...

  8. Oracle等待事件db file parallel read

    SQL> select event#,name,parameter1,parameter2,parameter3 from v$event_name where name = 'db file ...

  9. Oracle常见的几种等待事件

    1. CPU time CPU time其实不是真正的等待事件.是衡量CPU是否瓶颈的一个重要指标.一般来讲,一个良好的系统,CPU TIME 应该排在TOP 5 TIME Event的最前面. 当然 ...

  10. 【等待事件】序列等待事件总结(enq: SQ - contention、row cache lock、DFS lock handle和enq: SV - contention)

    [等待事件]序列等待事件总结(enq: SQ - contention.row cache lock.DFS lock handle和enq: SV -  contention) 1  BLOG文档结 ...

随机推荐

  1. SpringBoot+Shiro+LayUI权限管理系统项目-6.实现角色管理

    1.说明 只讲解关键部分,详细看源码,文章下方捐赠或QQ联系捐赠获取. 2.功能展示 3.业务模型 @Data @EqualsAndHashCode(callSuper = false) @Acces ...

  2. 使用docker stack方式部署web集群

    如何部署swarm集群,请参考: https://blog.csdn.net/IndexMan/article/details/102713777 创建文件夹 mkdir -p /opt/docker ...

  3. Apipost参数描述的填写和参数描述库的使用

    请求参数的描述填写 对于header.query以及form-data和urlencode的body参数,我们在如下地方填写参数描述: 如图中所示,对于一个填写过的参数,我们可以在新建接口可以通过点击 ...

  4. Taurus.MVC WebMVC 入门开发教程1:框架下载环境配置与运行

    前言: 之前有网友说 Mvc系列的教程对新手不友好,因此补充新手入门系列教程. 在开始使用 Taurus.Mvc 进行 Web应用开发之前,建议可以观摩一下之前的文章:WebAPI 系列教程 因为两者 ...

  5. mybatis处理集合、数组参数使用in查询

    对于mybatis的参数类型是集合数组的时候进行查询. 第一种:参数list ,使用mybatis的标签 1 SELECT * FROM TABLE_NAME AS a WHERE 2 3 a.id ...

  6. MBD工具链的云部署

    MBD工具链的云部署 "云技术永远不会用于汽车开发".说到云部署在汽车行业的应用,业界曾经认为云技术并不适合用在汽车行业的产品开发.知识产权保护.数据的安全.流程不够透明.迁移成本 ...

  7. Jepsen 测试框架在图数据库 Nebula Graph 中的实践

    在本篇文章中主要介绍图数据库 Nebula Graph 在 Jepsen 这块的实践. Jepsen 简介 Jepsen 是一款用于系统测试的开源软件库,致力于提高分布式数据库.队列.共识系统等的安全 ...

  8. 在Avalonia项目中使用MediatR和MS.DI库实现事件驱动通信

    大家好,我是沙漠尽头的狼! AvaloniaUI是一个强大的跨平台.NET客户端开发框架,让开发者能够针对Windows.Linux.macOS.Android和iOS等多个平台构建应用程序.在构建复 ...

  9. [笔记]git pull vs git pull --rebase

    git pull vs git pull -rebase 背景 最近在实际开发过程,之前一直使用git pull 去更新该分支的代码,之前认为一旦pull 操作产生新的节点是对合并操作的一个记录,但是 ...

  10. liunx 进阶技术

    以下命令非学习阶段常用,在工作设汲到用liunx操作的时候以下必然要用,所以记录整理一下 关掉服务器所有java程序使用命令 pkill java 查看当前运行java服务 ps -ef | grep ...