我正在处理的数据处理系统存在一些性能问题。我从一小时的 peroid 中收集了等待统计数据,其中显示了大量的 CXPACKET 和 LATCH_EX 等待事件。
该系统由 3 个处理 SQL Server 组成,它们进行大量的数字运算和计算,然后将数据馈送到中央集群服务器。处理服务器最多可以同时运行 6 个作业。这些等待统计数据适用于我认为导致瓶颈的中央集群。中央集群服务器有 16 个内核和 64GB RAM。MAXDOP 设置为 0。
我猜 CXPACKET 来自正在运行的多个并行查询,但是我不确定 LATCH_EX 等待事件表示什么。从我读到的这可能是一个非缓冲等待?
任何人都可以建议这种等待统计的原因是什么,以及我应该采取什么行动来调查这个性能问题的根本原因?
顶部查询结果是总等待统计数据,底部查询结果是 1 小时内的统计数据

performance sql-server parallelism wait-types query-performance
我们的企业应用程序使用 SQL Server 进行数据存储,主要是一个 OLTP 系统。但是,我们应用程序的一个重要组件会产生大量的 OLAP 工作负载。
我们对 tempdb 的写入延迟约为 100 毫秒。这种趋势发展随着时间的推移,和ALLOW_SNAPSHOT_ISOLATION关断。我们正在对此相关问题进行故障排除,到目前为止我们发现的唯一有趣的事情是有大量散列和排序溢出到 tempdb。我们推测这来自我们的 OLAP 工作负载。
泄漏的频率是多少?任何?多少次溢出/秒?我们的初步数据表明我们每秒大约有 2 次哈希溢出和每分钟 25 次排序溢出。
这种溢出频率是否可能是导致 tempdb 写入延迟高的罪魁祸首?
我们按照每个内核数的建议为 tempdb 使用多个文件。tempdb 文件位于 RAID 1+0 SAN(具有高性能 SSD)上,但它与主数据库数据和日志文件位于同一设备上。tempdb 文件的大小足够大,它们很少增长。我们不使用跟踪标志 1117 或 1118。另一个变量是此设置为许多不同的数据库共享,这些数据库都经历中到高负载。
我们的 100 毫秒写入延迟远大于我们在 MSDN、SQL Skills 和其他站点上发现的 tempdb 写入延迟的可接受范围。但是,我们其他数据库的写入延迟很好(低于 10 毫秒)。根据其他统计数据,我们确实在大量使用 tempdb,尤其是对于内部对象。因此,我们正在深入研究以找出为什么我们的应用程序如此大量地使用内部对象。
我们的平台确实存在以不同方式表现出来的实际性能问题。我们一直在监控性能计数器、查看 DM 视图并分析我们的应用程序行为,以尝试深入了解我们系统的资源使用特征。我们现在专注于溢出,因为我们已经读到溢出具有巨大的负面影响,因为它们是在磁盘上而不是在内存中执行的。我们似乎有很多泄漏,但我想就人们认为的“高”获得一些意见。
我有一张这样的表:
CREATE TABLE products (
id serial PRIMARY KEY,
category_ids integer[],
published boolean NOT NULL,
score integer NOT NULL,
title varchar NOT NULL);
Run Code Online (Sandbox Code Playgroud)
一个产品可以属于多个类别。category_ids列包含所有产品类别的 id 列表。
典型的查询看起来像这样(总是搜索单个类别):
SELECT * FROM products WHERE published
AND category_ids @> ARRAY[23465]
ORDER BY score DESC, title
LIMIT 20 OFFSET 8000;
Run Code Online (Sandbox Code Playgroud)
为了加快速度,我使用以下索引:
CREATE INDEX idx_test1 ON products
USING GIN (category_ids gin__int_ops) WHERE published;
Run Code Online (Sandbox Code Playgroud)
除非某一类别中的产品太多,否则这会很有帮助。它会快速过滤掉属于该类别的产品,但随后必须以艰难的方式完成排序操作(没有索引)。
已安装的btree_gin扩展允许我像这样构建多列 GIN 索引:
CREATE INDEX idx_test2 ON products USING GIN (
category_ids gin__int_ops, score, title) WHERE published; …Run Code Online (Sandbox Code Playgroud) 我想知道以下两种方法中哪一种更快:
1) 三COUNT:
SELECT Approved = (SELECT COUNT(*) FROM dbo.Claims d
WHERE d.Status = 'Approved'),
Valid = (SELECT COUNT(*) FROM dbo.Claims d
WHERE d.Status = 'Valid'),
Reject = (SELECT COUNT(*) FROM dbo.Claims d
WHERE d.Status = 'Reject')
Run Code Online (Sandbox Code Playgroud)
2)SUM带 -FROM子句:
SELECT Approved = SUM(CASE WHEN Status = 'Approved' THEN 1 ELSE 0 END),
Valid = SUM(CASE WHEN Status = 'Valid' THEN 1 ELSE 0 END),
Reject = SUM(CASE WHEN Status = 'Reject' THEN 1 ELSE …Run Code Online (Sandbox Code Playgroud) 我正在尝试解决发生不到一秒钟的阻塞问题。OLTP 应用程序非常敏感,根据商定的 SLA,某些事务的响应时间必须小于 200 毫秒。我们在新代码版本中遇到了一些锁升级问题,我们能够通过减少更新中的批量大小来解决这些问题。即使批量较小,我们也怀疑新的 sp 阻塞了 OLTP 事务正在更新的相同行。
我需要找到被阻塞的会话及其等待的资源。根据我的理解,“阻塞进程阈值”可以设置至少 1 秒,因此这不会捕获阻塞。
我正在试验 wait_info 和 wait_completed x 事件。
有没有其他方法可以跟踪这个。谢谢
performance sql-server sql-server-2014 query-performance performance-tuning
我有20M行的表,每一行有3列:time,id,和value。对于每个id和time,value状态都有一个。我想知道time特定id.
我使用了两种方法来实现这一点。一种方法是使用加入和另一种方法是使用功能导致的窗口/滞后与聚簇索引time和id。
我通过执行时间比较了这两种方法的性能。join方法需要16.3秒,窗口函数方法需要20秒,不包括创建索引的时间。这让我感到惊讶,因为窗口函数似乎是先进的,而连接方法是蛮力的。
下面是这两种方法的代码:
创建索引
create clustered index id_time
on tab1 (id,time)
Run Code Online (Sandbox Code Playgroud)
select a1.id,a1.time
a1.value as value,
b1.value as value_lag,
c1.value as value_lead
into tab2
from tab1 a1
left join tab1 b1
on a1.id = b1.id
and a1.time-1= b1.time
left join tab1 c1
on a1.id = c1.id
and a1.time+1 = c1.time
Run Code Online (Sandbox Code Playgroud)
使用SET STATISTICS TIME, IO ON以下方法生成的 IO …
performance join sql-server window-functions sql-server-2016 query-performance
这有点偏离了真正的问题。如果提供上下文有帮助,则生成此数据对于处理字符串的性能测试方法、生成需要在游标内对其应用某些操作的字符串或为敏感数据生成唯一的匿名名称替换可能很有用。我只是对在 SQL Server 中生成数据的有效方法感兴趣,请不要问我为什么需要生成这些数据。
我将尝试从一个有点正式的定义开始。如果字符串仅由 A - Z 中的大写字母组成,则该字符串包含在该系列中。该系列的第一项是“A”。该系列由所有有效字符串组成,首先按长度排序,然后按典型的字母顺序排序。如果字符串位于名为 的列中的表中STRING_COL,则可以在 T-SQL 中将顺序定义为ORDER BY LEN(STRING_COL) ASC, STRING_COL ASC。
要给出一个不太正式的定义,请查看 Excel 中按字母顺序排列的列标题。该系列是相同的模式。考虑如何将整数转换为基数为 26 的数字:
1 -> A, 2 -> B, 3 -> C, ... , 25 -> Y, 26 -> Z, 27 -> AA, 28 -> AB, ...
这个类比并不完美,因为“A”的行为与基数 0 中的 0 不同。下面是一个选定值的表格,希望能让它更清楚:
???????????????????????
? ROW_NUMBER ? STRING ?
???????????????????????
? 1 ? A ?
? 2 ? B ?
? 25 ? Y ?
? 26 ? …Run Code Online (Sandbox Code Playgroud) 我们有一个在 VMware 虚拟机中运行的 SQL Server 2016 SP1 实例。它包含 4 个数据库,每个数据库用于不同的应用程序。这些应用程序都在单独的虚拟服务器上。它们都没有在生产中使用。不过,测试应用程序的人报告了性能问题。
这些是服务器的统计信息:
用户通过基于 C++ 的 ERP 应用程序执行单屏幕访问。
当我ostress使用许多小查询或大查询对 Microsoft 的 SQL Server 进行压力测试时,我获得了最大性能。唯一的限制是客户端,因为他不能足够快地回答。
但是当几乎没有任何用户时,SQL Server 几乎不做任何事情。然而,人们必须永远等待才能在应用程序中保存任何内容。
根据 Paul Randal 的“告诉我它在哪里受到伤害”查询,所有等待事件中有 50% 是ASYNC_NETWORK_IO.
这可能意味着网络问题,或应用程序服务器或客户端的性能问题。他们甚至都没有以最大能力远程使用他们的资源。大多数情况下,所有机器(客户端、应用程序服务器、数据库服务器)上的 CPU 都在 26% 左右。
网络连接的延迟约为 1-3 毫秒。数据库服务器的 IO 在应用程序正常使用期间的最大写入速度为 20MB/s(平均为 7-9MB/s)。当我进行压力测试时,我的速度最高可达 5GB/s。
缓冲区缓存大小为我们的 ERP 系统 DB 为 60GB,我们的财务软件为 20GB,质量保证软件为 1GB,文档归档系统为 3GB。
我授予 …
我在同一台服务器上有两个 SQL Server 实例:
sp_configure 结果在两个实例上相同(新的 2016 选项除外)。
我在同一个磁盘文件夹上的两个实例上创建了新数据库。自动生长参数相同。
自动创建和自动更新统计选项被关闭。
然后我做了一个测试,将 10000 次插入到一个堆中:
set nocount on
go
create table dbo.TestInsert ( i int not null, s varchar(50) not null )
declare @d1 datetime, @d2 datetime, @i int
set @d1 = getdate()
set @i = 1
while @i <= 10000
begin
insert into dbo.TestInsert ( i, s ) select @i, …Run Code Online (Sandbox Code Playgroud) I have the following tables (taken from the Sakila database):
I am selecting a particular film. For this film, I also want all actors participating in that film. I have two queries for this: one with a LEFT JOIN and one with a LEFT JOIN LATERAL.
select film.film_id, film.title, a.actors
from film
left join
(
select film_actor.film_id, array_agg(first_name) as actors
from actor
inner …Run Code Online (Sandbox Code Playgroud) postgresql performance join execution-plan postgresql-10 postgresql-performance
performance ×10
sql-server ×8
join ×2
postgresql ×2
index ×1
parallelism ×1
t-sql ×1
tempdb ×1
vmware ×1
wait-types ×1