我是一个系统管理员,我对Server的度量不太熟悉。我一直与我们的一个DB和DBA似乎不太了解测量性能的问题,所以我试图确定为什么我们会有这些问题。
这是一个包含134 GB数据文件和25 GB日志文件的DB。数据库是在rest (TDE)加密的,并使用存储在Azure KeyVault (与服务器相同的区域)中的密钥。它在复制模式下运行,并复制到单个Server实例。主实例运行在Azure (8 vCPU,56 GB RAM)上,并复制到Azure中的备份实例。
我们遇到的主要问题是Page写/秒。目前,它总是在250写/秒或以上,很少下降到200以下。我读过90次写入/秒是一个正常的阈值。有时,存储过程执行会从几毫秒增加到半秒或更多,严重影响应用程序的性能。
同时,PLE为60,766秒,缓存命中率为100%,页面读取/秒为0.2/秒。所以这很可能不是记忆问题,对吧?
那么,在当前的基础上,确定导致最多页面写入量的最佳方法是什么呢?我们如何才能知道它是简单的糟糕的设计,代码需要优化,还是其他问题?
发布于 2019-03-01 00:24:36
那么,在当前的基础上,确定导致最多页面写入量的最佳方法是什么呢?
问得好。页面写入是由更改数据库引起的。句号。更改在提交之前写入日志文件,但数据库页在内存中更改,而不是在提交时写入。
因此,首先,在没有用户等待的情况下,在后台执行页面写入。如果同时读取页面,这可能是一个问题,但似乎大多数相关页面都是缓存的。因此,页面写入并不一定会导致任何问题。
话虽如此,你怎么确定是什么导致了写作呢?不是超容易的。
有一个DMV,它允许您查询所有缓存的页面,并查看哪些页面是脏的。然而,在内存丰富的系统上运行这个DMV是很昂贵的。类似于:
select schema_name(o.schema_id) schema_name, object_name(p.object_id) table_name, i.type_desc index_type, i.name index_name, bd.page_type, count(*) page_count
from sys.dm_os_buffer_descriptors bd
join sys.allocation_units au
on bd.allocation_unit_id = au.allocation_unit_id
join sys.partitions p
on (p.hobt_id = au.container_id and au.type in (1,3))
or(p.partition_id = au.container_id and au.type = 2)
join sys.indexes i
on p.index_id = i.index_id
and p.object_id = i.object_id
join sys.objects o
on o.object_id = i.object_id
where database_id = db_id()
and is_modified = 1
group by o.schema_id, p.object_id, i.name, i.type_desc, bd.page_type
order by page_count deschttps://dba.stackexchange.com/questions/231008
复制相似问题