当我运行以下代码时,它需要 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) 我的印象是,如果我要对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
我之前问过类似的问题,但之前我问过关于将备份移动到共享位置的问题。这次我很好奇:如果我想在共享驱动器上恢复数据库,我需要在该服务器上启用 IFI 还是只在运行 SQL Server 的服务器上启用?
我问的原因是我正在恢复一个非常大的数据库,并且在过去几个小时内一直停留在 100% 恢复状态。等待类型sp_whoisactive是:
(28472716ms) `PREEMPTIVE_OS_WRITEFILEGATHER.
Run Code Online (Sandbox Code Playgroud)
我见过的唯一一次是当 IFI 未打开时,但我确实在 SQL Server 上启用了它,但在共享驱动器服务器上未启用它。
我有一个带有 16 个 CPU 的服务器,配置max degree of parallelism为 8,max worker threads设置为零。
在给定的小时内,我的信号等待时间为 20%,但在那段时间内我的操作系统 CPU 利用率从未超过 25%。有人可以解释为什么我的信号等待时间如此之高吗?
我的供应商拥有一流的评分系统,预计我们的信号等待时间为 10% 或更少,否则我们就会被淘汰。我该如何解决这个问题(不添加额外的 CPU)?
CXPACKET(70%),然后是PREEMPTIVE_OS_PIPEOPS(20%)cost threshold for parallelism设置为 50。我应该提高它吗?要什么?MAXDOP到 4,因为该应用程序会执行一些需要额外线程的仓库样式查询。我设置了一个测试作业来测试我的失败通知,现在我收到以下错误,指出它没有通过电子邮件通知我的操作员。奇怪的是我在其他几个实例上运行了完全相同的安装脚本,它运行得很好,但在这个实例上失败了。我检查了 SQL Server 代理和操作员本身的属性。我还从管理分支的数据库邮件中向自己发送了一封测试电子邮件,并且成功运行。
无法通过电子邮件通知“DBA 团队”。
我们每 15 分钟运行一次日志备份,每晚运行一次完整/差异(完整是每个数据库每周一次,但它们分布在整周以进行负载平衡)。假设对于一个特定的数据库,我有一个从晚上 10:05 开始到晚上 10:18 结束的差异,我在晚上 10:00、晚上 10:15 和晚上 10:30 有日志备份。如果我想恢复到那天晚上 10 点 24 分,我知道我需要恢复最后一个完整的和那天晚上的差异,但是我不确定在那之后我应该从哪个事务日志开始。
我知道我可以使用 SQL Server 配置管理器来确定 1) 当前正在运行哪些服务以及 2) 哪些服务设置为自动启动。但是,我管理着几十台服务器。我想每季度进行一次检查,以确保所有服务仍设置为自动启动,并查看当前启用了哪些服务。是否有表格或程序可以提供此信息?