我们有许多数据库,每个客户都具有相同的架构。我想知道是否有一个查询可以通过 db_name 从 somesysview 组中选择 count(*),db_name;
从不同的角度,相同的查询被用户分解?
阅读以下博客后,我明白hash match聚合原因blocking。使用适当的索引,它可以作为stream aggregate.
我有一个数据库,其中包含 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
SQL Server 在名为tempdb 的数据库中工作以处理大量任务。连接和聚合等查询操作发生在那里。在线索引重建、排序依据、聚合函数、触发器也在tempdb 中完成。
如何衡量何时应该添加另一个 tempdb 数据文件?需要多少个 tempdb 数据文件?
我有一个 SQLite DB,其中只有一个大小约 1.5 MB 的表(实际上,总共有约 30 个表,但每个表都存储在一个单独的 .db 文件中)。
当我EXPLAIN QUERY PLAN用于任何表时,它显示全表扫描,据我所知这是不好的。但是,没有一个表有索引,而且选择查询的速度很快。
所以,我想知道我是应该在我们的表上添加一些索引还是保持它们原样?(现在,表最多有 5k 行,将来它们最多可能有 100k 行)。
附注。选择和插入的数量几乎相同..
所有的想法都受到高度赞赏。
CXCONSUMER当我运行时,我有一些等待时间的查询,sp_whoisactive如下面的屏幕截图所示。
当我检查状态时,它是suspended。这意味着它正在等待某个进程释放资源。据我所知CXPACKET,生产者CXCONSUMER是消费者,而 CXPACKET 是罪魁祸首,应该对此采取行动。但我不”没有看到任何CXPACKET。由于这是一个并行执行,我不确定应该从哪里开始修复。
任何人都可以建议我如何找出我的查询正在等待的过程(因为我将挂起视为状态)?
附加信息
当我查询时sys.dm_os_wait_stats,前两个条目是 CONSUMER 和 CXPACKETS。
performance sql-server parallelism blocking waits performance-tuning
对于我们的一个数据库,如下所示的查询非常慢。
由于安全原因,我无法分享实际的查询或计划,但只是想知道如何编写查询如下
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 数据库,它真的很慢。
CreationDate和LastAccessdate列都是日期时间 (10)
和 DisplayName是VARCHAR(50)
如果以上可以重写,请建议我如何提高性能
sql-server sql-server-2012 query-performance performance-tuning
那些使用优秀的 sp_HumanEvents 的人,也许是作者本人,请帮助我理解我所缺少的东西(因为我的愚蠢)。
#1
当监控阻塞时,必须设置阻塞进程阈值(以秒为单位),否则blocked_process_event将不会被触发。这与 @blocking_duration_ms 参数有何关联?
示例:阻塞进程阈值 ID 设置为 10 秒 @blocking_duration_ms 保留默认 = 500 毫秒
#2
当我想在服务器重新启动时连续且独立地将结果记录到表中时,建议我使用代理作业,并使用一个示例设置一个名为sp_HumanEvents 的计划:10 秒签入 ,但在周日午夜重复运行。当SQL Server代理启动时自动启动它不是更合适吗?
实际计划: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-server availability-groups query-performance performance-tuning
以下查询正确输出搜索、扫描等的数量。我对理解输出中的某些行有疑问。在查询的某些输出行中,索引名称显示为、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
我正在尝试确定为审计目的设计表格的最佳方式。基本上,我在一张表中为许多用户记录了几个最后的事件。每个用户的记录数有限制。新记录来了,旧记录走了。
像这样的东西:
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 个活动,但对于另一个用户来说,产生的活动可能需要一年多的时间。这就是为什么我不希望所有用户一起使用一般有序的日志。
也不清楚我应该如何按日期时间进行聚类(如建议的那样)。我是在初始创建事件还是在更新事件上执行此操作?
sql-server ×8
performance ×6
index ×2
aggregate ×1
blocking ×1
index-tuning ×1
monitoring ×1
parallelism ×1
sqlite ×1
tempdb ×1
waits ×1