标签: performance-tuning

我可以找出查询最多的数据库吗?

我们有许多数据库,每个客户都具有相同的架构。我想知道是否有一个查询可以通过 db_name 从 somesysview 组中选择 count(*),db_name;

从不同的角度,相同的查询被用户分解?

performance sql-server-2012 performance-tuning

3
推荐指数
1
解决办法
269
查看次数

查找哈希匹配聚合

阅读以下博客后,我明白hash match聚合原因blocking。使用适当的索引,它可以作为stream aggregate.

  1. 阻塞/非阻塞聚合运算符
  2. 聚合的阻塞性质 - Rob Farley
  3. 哈希聚合-Craig Freedman

我有一个数据库,其中包含 200 多个多年前创建的表。我正在尝试通过 group by 查找当前正在使用hash match聚合运算符的所有查询。我发现的一种可能性是使用 dmv,如下所示。但我不知道如何过滤它以仅列出带有hash match聚合运算符的查询。如何实现这一目标?此外,从大局来看,除了遵循 dmv 之外,还有哪些其他选项可以获取此信息?

SELECT cp.objtype AS ObjectType,
    OBJECT_NAME(st.objectid,st.dbid) AS ObjectName,
    cp.usecounts AS ExecutionCount,
    st.TEXT AS QueryText,
    qp.query_plan AS QueryPlan
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st
WHERE st.TEXT LIKE '%GROUP%'
Run Code Online (Sandbox Code Playgroud)

performance sql-server aggregate execution-plan performance-tuning

3
推荐指数
1
解决办法
532
查看次数

如何判断我的 tempdb 数据库是否存在性能问题/需要添加更多数据文件?

SQL Server 在名为tempdb 的数据库中工作以处理大量任务。连接和聚合等查询操作发生在那里。在线索引重建、排序依据、聚合函数、触发器也在tempdb 中完成。

如何衡量何时应该添加另一个 tempdb 数据文件?需要多少个 tempdb 数据文件?

performance sql-server tempdb performance-tuning

3
推荐指数
1
解决办法
2138
查看次数

SQLite - 即使选择查询速度很快,我是否应该添加一些索引?

我有一个 SQLite DB,其中只有一个大小约 1.5 MB 的表(实际上,总共有约 30 个表,但每个表都存储在一个单独的 .db 文件中)。

当我EXPLAIN QUERY PLAN用于任何表时,它显示全表扫描,据我所知这是不好的。但是,没有一个表有索引,而且选择查询的速度很快。

所以,我想知道我是应该在我们的表上添加一些索引还是保持它们原样?(现在,表最多有 5k 行,将来它们最多可能有 100k 行)。

附注。选择和插入的数量几乎相同..

所有的想法都受到高度赞赏。

sqlite performance index performance-tuning

3
推荐指数
1
解决办法
292
查看次数

识别资源上的查询等待

CXCONSUMER当我运行时,我有一些等待时间的查询,sp_whoisactive如下面的屏幕截图所示。

在此处输入图片说明 当我检查状态时,它是suspended。这意味着它正在等待某个进程释放资源。据我所知CXPACKET,生产者CXCONSUMER是消费者,而 CXPACKET 是罪魁祸首,应该对此采取行动。但我不”没有看到任何CXPACKET。由于这是一个并行执行,我不确定应该从哪里开始修复。

任何人都可以建议我如何找出我的查询正在等待的过程(因为我将挂起视为状态)?

附加信息

当我查询时sys.dm_os_wait_stats,前两个条目是 CONSUMER 和 CXPACKETS。

  • SQL Server 2016
  • 128 GB 内存
  • 最大 DOP : 8
  • 门槛成本:20

performance sql-server parallelism blocking waits performance-tuning

3
推荐指数
1
解决办法
655
查看次数

需要帮助来了解调优慢速 SQL 服务器查询

对于我们的一个数据库,如下所示的查询非常慢。

由于安全原因,我无法分享实际的查询或计划,但只是想知道如何编写查询如下

SELECT [Id]
      ,[AboutMe]
      ,[Age]
      ,[CreationDate]
      ,[DisplayName]
      ,[DownVotes]
      ,[EmailHash]
      ,[LastAccessDate]
      ,[Location]
      ,[Reputation]
      ,[UpVotes]
      ,[Views]
      ,[WebsiteUrl]
      ,[AccountId]
  FROM [StackOverflow2010].[dbo].[Users]
  WHERE DisplayName IN (

 SELECT DisplayName from dbo.Users
 WHERE CAST(LastAccessDate AS DATE) = CAST ('20160814' AS DATE)
 AND CreationDate>= DATEADD (DAY, -30,LastAccessDate)
 AND CreationDate<= LastAccessDate)
Run Code Online (Sandbox Code Playgroud)

在 stackoverflow 数据库中,这不会返回任何行,但对于我们现有的 6 TBS 数据库,它真的很慢。

CreationDateLastAccessdate列都是日期时间 (10)

DisplayName是VARCHAR(50)

如果以上可以重写,请建议我如何提高性能

sql-server sql-server-2012 query-performance performance-tuning

3
推荐指数
1
解决办法
489
查看次数

sp_HumanEvents @event_type = N'blocking' 并需要日志记录作业帮助

那些使用优秀的 sp_HumanEvents 的人,也许是作者本人,请帮助我理解我所缺少的东西(因为我的愚蠢)。

#1

当监控阻塞时,必须设置阻塞进程阈值(以秒为单位),否则blocked_process_event将不会被触发。这与 @blocking_duration_ms 参数有何关联?

示例:阻塞进程阈值 ID 设置为 10 秒 @blocking_duration_ms 保留默认 = 500 毫秒

#2

当我想在服务器重新启动时连续且独立地将结果记录到表中时,建议我使用代理作业,并使用一个示例设置一个名为sp_HumanEvents 的计划:10 秒签入 ,但在周日午夜重复运行。当SQL Server代理启动时自动启动它不是更合适吗?

monitoring sql-server performance-tuning

3
推荐指数
1
解决办法
176
查看次数

存储过程调优帮助

实际计划:https://www.brentozar.com/pastetheplan/? id=SJviG_y1h

我正在寻找有关从哪里开始调整上述存储过程的建议。我们需要它在尽可能接近 1 秒的时间内完成,但目前在生产中最多需要 40 秒。SP 似乎会根据服务器工作负载而波动,因此需要它尽可能高效地运行。在 UAT 没有负载的情况下,针对同一数据库的副本,它在 5 秒内运行。

来自 Brent Ozar 的 sp_blitzcache 的警告包括:并行、计划警告、参数嗅探、隐式转换、函数连接、琐碎计划、未使用的内存授予、最近 4 小时创建的计划、多行表假脱机、非 SARGable

它在 Always On 可用性组数据库的主副本上运行(2 个节点设置,在辅助副本上启用同步提交和只读)。我们无法创建任何额外的索引。

SQL 版本为: Microsoft SQL Server 2017 (RTM-CU29) (KB5010786) - 14.0.3436.1 (X64) Enterprise Edition:Windows Server 2019 Standard 10.0(内部版本 17763:)(虚拟机管理程序)上基于核心的许可(64 位)

其他值得注意的配置:

  • SQL 最大内存设置为 92GB
  • 服务器有 8 个 CPU(全部位于 1 个 numa 节点上)
  • CTFP设置为50
  • MAXDOP 设置为 4
  • 主数据库启用了 RCSI

sql-server availability-groups query-performance performance-tuning

3
推荐指数
1
解决办法
219
查看次数

如何收集索引使用信息

以下查询正确输出搜索、扫描等的数量。我对理解输出中的某些行有疑问。在查询的某些输出行中,索引名称显示为、NULL、、0;而在同一行中,它显示了和/或 的一些非零数字。问题:我们如何解释这些行?index_typeHEAPNumOfSeeksNumOfScansNumOfLookups

备注:所有表都没有聚集索引,因此所有表都是 HEAP。但在以下查询的输出的大多数行中,索引名称都显示(并且不显示为 NULL),并且 index_type 也显示(作为 NONSLUSTER)。因此,问题特定于此评论上面描述的输出行。

参考:sys.dm_db_index_usage_stats

SELECT OBJECT_NAME(IX.OBJECT_ID) Table_Name
       ,IX.name AS Index_Name
       ,IX.type_desc Index_Type
       ,SUM(PS.[used_page_count]) * 8 IndexSizeKB
       ,IXUS.user_seeks AS NumOfSeeks
       ,IXUS.user_scans AS NumOfScans
       ,IXUS.user_lookups AS NumOfLookups
       ,IXUS.user_updates AS NumOfUpdates
       ,IXUS.last_user_seek AS LastSeek
       ,IXUS.last_user_scan AS LastScan
       ,IXUS.last_user_lookup AS LastLookup
       ,IXUS.last_user_update AS LastUpdate
FROM sys.indexes IX
INNER JOIN sys.dm_db_index_usage_stats IXUS ON IXUS.index_id = IX.index_id AND IXUS.OBJECT_ID = IX.OBJECT_ID
INNER JOIN sys.dm_db_partition_stats PS on PS.object_id=IX.object_id
WHERE OBJECTPROPERTY(IX.OBJECT_ID,'IsUserTable') = 1 …
Run Code Online (Sandbox Code Playgroud)

index sql-server azure-sql-managed-instance query-performance performance-tuning

3
推荐指数
1
解决办法
421
查看次数

为插入和删除优化审计表

我正在尝试确定为审计目的设计表格的最佳方式。基本上,我在一张表中为许多用户记录了几个最后的事件。每个用户的记录数有限制。新记录来了,旧记录走了。

像这样的东西:

CREATE TABLE Audit
(
  UserId INT NOT NULL,
  EventId INT NOT NULL,
  CreationDate DATETIME NOT NULL,
  UpdateDate DATETIME NULL,
  -- Other data fields
)
Run Code Online (Sandbox Code Playgroud)

问题是如何处理索引。我正在考虑在(UserId, EventId). 但是由于用户活动是独立发生的,这意味着在表中间插入并在表中间删除。恐怕不好。

另一个想法是添加一个人工AuditId字段只是为了让新记录的数量增加。像这样:

CREATE TABLE Audit
(
  Id INT, -- Becomes the clustered index
  -- The same as above
)
Run Code Online (Sandbox Code Playgroud)

这样,新的审计条目将被附加到末尾,但删除仍将发生在表的中间。它可能比第一个选项更好,但我不确定。

该表将被频繁使用,基本上每个用户活动都会被记录(1 次插入),并且最早的活动会在同一个事务中被删除(1 次删除)。这需要快速。好吧,我希望它在理想情况下是即时的,并且在性能方面不明显。

我还需要能够快速检索特定用户的记录集。它可能会被非聚集索引覆盖。

我正在寻求设计此表以获得最佳性能的建议。

编辑:我想我错过了一些重要的事情要提。

我试图追踪的不是瞬时的,而是一段时间内的。系统中有几个地方我需要这个。考虑用户正在做的某种活动可能会跨越某个时间段。如果满足某些条件,则重新使用(刷新、更新)现有活动。我只想删除旧的废弃活动。例如,在 2 周内,一个用户可能已经发布了 50 个活动,但对于另一个用户来说,产生的活动可能需要一年多的时间。这就是为什么我不希望所有用户一起使用一般有序的日志。

也不清楚我应该如何按日期时间进行聚类(如建议的那样)。我是在初始创建事件还是在更新事件上执行此操作?

performance sql-server index-tuning performance-tuning

2
推荐指数
1
解决办法
2098
查看次数