小编Chr*_*ods的帖子

IF EXISTS 花费的时间比嵌入式 select 语句长

当我运行以下代码时,它需要 22.5 分钟并进行 1.06 亿次读取。但是,如果我只运行内部 select 语句本身,它只需要 15 秒并执行 264k 读取。作为旁注,选择查询不返回任何记录。

知道为什么IF EXISTS它会运行更长时间并进行更多读取吗?我还更改了 select 语句,SELECT TOP 1 [dlc].[id]并在 2 分钟后将其杀死。

作为临时修复,我已将其更改为执行 count( * ) 并将该值分配给变量@cnt。然后它做一个IF 0 <> @cnt声明。但我认为EXISTS会更好,因为如果在 select 语句中返回了记录,它会在找到至少一条记录后停止执行扫描/搜索,而count(*)将完成完整查询。我错过了什么?

IF EXISTS
   (SELECT [dlc].[ID]
   FROM TableDLC [dlc]
   JOIN TableD [d]
   ON [d].[ID] = [dlc].[ID]
   JOIN TableC [c]
   ON [c].[ID] = [d].[ID2]
   WHERE [c].[Name] <> [dlc].[Name])
BEGIN
   <do something>
END
Run Code Online (Sandbox Code Playgroud)

performance sql-server exists

37
推荐指数
2
解决办法
4518
查看次数

与 sys.allocation_units 中的表大小不匹配的 DATALENGTH 总和

我的印象是,如果我要对DATALENGTH()表中所有记录的所有字段求和,我将得到表的总大小。我错了吗?

SELECT 
SUM(DATALENGTH(Field1)) + 
SUM(DATALENGTH(Field2)) + 
SUM(DATALENGTH(Field3)) TotalSizeInBytes
FROM SomeTable
WHERE X, Y, and Z are true
Run Code Online (Sandbox Code Playgroud)

我在下面使用了这个查询(我从网上得到的表大小,聚集索引,所以它不包括 NC 索引)来获取我的数据库中特定表的大小。出于计费目的(我们按部门使用的空间量收费),我需要计算出每个部门在此表中使用了多少空间。我有一个查询来标识表中的每个组。我只需要弄清楚每个组占用了多少空间。

由于VARCHAR(MAX)表中的字段,每行的空间可能会剧烈波动,所以我不能只取平均大小 * 部门的行数比率。当我使用上述DATALENGTH()方法时,我只能获得下面查询中使用的总空间的 85%。想法?

SELECT 
s.Name AS SchemaName,
t.NAME AS TableName,
p.rows AS RowCounts,
(SUM(a.total_pages) * 8)/1024 AS TotalSpaceMB, 
(SUM(a.used_pages) * 8)/1024 AS UsedSpaceMB, 
((SUM(a.total_pages) - SUM(a.used_pages)) * 8)/1024 AS UnusedSpaceMB
FROM 
    sys.tables t with (nolock)
INNER JOIN 
    sys.schemas s with (nolock) ON s.schema_id = t.schema_id
INNER JOIN      
    sys.indexes i with (nolock) ON t.OBJECT_ID …
Run Code Online (Sandbox Code Playgroud)

sql-server data-pages clustered-index metadata database-internals

11
推荐指数
2
解决办法
3870
查看次数

共享驱动器上的即时文件初始化

我之前问过类似的问题,但之前我问过关于将备份移动到共享位置的问题。这次我很好奇:如果我想在共享驱动器上恢复数据库,我需要在该服务器上启用 IFI 还是只在运行 SQL Server 的服务器上启用?

我问的原因是我正在恢复一个非常大的数据库,并且在过去几个小时内一直停留在 100% 恢复状态。等待类型sp_whoisactive是:

(28472716ms) `PREEMPTIVE_OS_WRITEFILEGATHER.
Run Code Online (Sandbox Code Playgroud)

我见过的唯一一次是当 IFI 未打开时,但我确实在 SQL Server 上启用了它,但在共享驱动器服务器上未启用它。

performance sql-server restore

8
推荐指数
1
解决办法
174
查看次数

CPU 使用率低但信号等待时间长

我有一个带有 16 个 CPU 的服务器,配置max degree of parallelism为 8,max worker threads设置为零。

在给定的小时内,我的信号等待时间为 20%,但在那段时间内我的操作系统 CPU 利用率从未超过 25%。有人可以解释为什么我的信号等待时间如此之高吗?

我的供应商拥有一流的评分系统,预计我们的信号等待时间为 10% 或更少,否则我们就会被淘汰。我该如何解决这个问题(不添加额外的 CPU)?

  • 我们每个 NUMA 节点的 CPU 不超过 8 个,因此跟踪标志 8048不适用。
  • 最大的实例等待是CXPACKET(70%),然后是PREEMPTIVE_OS_PIPEOPS(20%)
  • cost threshold for parallelism设置为 50。我应该提高它吗?要什么?
  • 这是一台物理机器(不是虚拟机),专用于 SQL Server。
  • 我正在使用监控工具来识别最常运行的查询和过程。我想查看高 CPU、高 I/O 还是高持续时间?通常我们的应用程序是 I/O 密集型的,所以我调整高 I/O。但既然问题是信号等待,我需要看高 CPU 吗?
  • 我希望避免Max Vernon建议将其降低MAXDOP到 4,因为该应用程序会执行一些需要额外线程的仓库样式查询。

performance sql-server

8
推荐指数
1
解决办法
2248
查看次数

无法通过电子邮件通知“DBA 团队”

我设置了一个测试作业来测试我的失败通知,现在我收到以下错误,指出它没有通过电子邮件通知我的操作员。奇怪的是我在其他几个实例上运行了完全相同的安装脚本,它运行得很好,但在这个实例上失败了。我检查了 SQL Server 代理和操作员本身的属性。我还从管理分支的数据库邮件中向自己发送了一封测试电子邮件,并且成功运行。

无法通过电子邮件通知“DBA 团队”。

sql-server sql-server-agent

5
推荐指数
1
解决办法
3362
查看次数

我应该用哪个日志开始备份?

我们每 15 分钟运行一次日志备份,每晚运行一次完整/差异(完整是每个数据库每周一次,但它们分布在整周以进行负载平衡)。假设对于一个特定的数据库,我有一个从晚上 10:05 开始到晚上 10:18 结束的差异,我在晚上 10:00、晚上 10:15 和晚上 10:30 有日志备份。如果我想恢复到那天晚上 10 点 24 分,我知道我需要恢复最后一个完整的和那天晚上的差异,但是我不确定在那之后我应该从哪个事务日志开始。

sql-server backup restore

4
推荐指数
1
解决办法
62
查看次数

当前 SQL Server 服务配置

我知道我可以使用 SQL Server 配置管理器来确定 1) 当前正在运行哪些服务以及 2) 哪些服务设置为自动启动。但是,我管理着几十台服务器。我想每季度进行一次检查,以确保所有服务仍设置为自动启动,并查看当前启用了哪些服务。是否有表格或程序可以提供此信息?

sql-server configuration

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