是否有类似指令可以在脚本中使用以强制 SSMS 启用/禁用 SQLCMD 模式?
我一直在与 DBA 和几个硬件人员争论我们 SQL 服务器上的性能问题。通常一切都很好,但是在过去的几周里,我们在 sql server 中遇到了巨大的滞后峰值。很明显,SQL Server 正在等待磁盘 I/O。但是我一直被告知这是因为 SQL Server 要求异常高的 I/O。事实并非如此。从运行中可以看出没有任何异常,所有DBA关心的只是导致阻塞的原因等等,这是无用的。例如,我们看到备份的主要内容是对 ASPState 数据库的操作,我们使用它来管理 Web 服务器上的 ASP 会话状态。这些操作通常不会出现在 Sp_who2 活动结果上,因为它们发生得如此之快。数据库处于简单恢复模式,日志记录很少。然而,在这些延迟高峰期间,我们可以看到数据库上的大量选择和更新操作被阻塞或等待。我确信正在发生的事情是某人或某项工作正在运行导致用于该数据库日志和数据文件的 RAID 阵列上大量磁盘使用的东西。问题是要证明这一点,因为没有人愿意承认他们正在做一些正在扼杀我们网站的事情。
我的问题是什么性能计数器或我可以记录的任何内容将有助于显示 SQL Server 正在等待 I/O,但不是因为它要求比正常情况更多,而是因为磁盘忙于响应来自 sql server 的请求像往常一样快吗?
create table T(ID int identity primary key)
insert into T default values
insert into T default values
go
select cast(ID as varchar(10)) as ID
from T
where ID = 1
Run Code Online (Sandbox Code Playgroud)
上面的查询在查询计划中有一个警告。
<Warnings>
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT(varchar(10),[xx].[dbo].[T].[ID],0)" />
</Warnings>
Run Code Online (Sandbox Code Playgroud)
为什么它有警告?
字段列表中的强制转换如何影响基数估计?
sql-server execution-plan type-conversion sql-server-2012 cardinality-estimates
我一直在运行一些索引使用报告,我正在尝试获得Leaf和Non-leaf的定义。似乎有叶和非叶插入、更新、删除、页面合并和页面分配。我真的不知道这意味着什么,或者一个是否比另一个更好。
如果有人可以给出每个的简单定义,并解释为什么叶子或非叶子很重要,将不胜感激!
我有一个运行一些命令的存储过程。我不希望这些命令被包装在存储过程的事务中。如果第 4 个命令失败,我希望第 1、第 2 和第 3 个命令保持不变,而不是回滚。
是否有可能以这样一种方式编写存储过程,使其不全部作为一个大事务执行?
我在哪里可以找到有关如何更好地转向 24x7 运营的资源?拥有大数据库的大公司是如何做到这一点的?我们的夜间工作,例如
所有这些似乎都会对我们的系统造成严重影响(即在线用户和实时数据馈送)。我已经在亚马逊上查找了与此主题相关的任何书籍,但到目前为止还没有找到任何内容。
我有一个相当大的表,其中一列是 XML 数据,XML 条目的平均大小约为 15 KB。所有其他列都是常规整数、大整数、GUID 等。为了获得一些具体数字,假设该表有一百万行,大小约为 15 GB。
我注意到的是,如果我想选择所有列,这个表选择数据的速度真的很慢。当我做
SELECT TOP 1000 * FROM TABLE
Run Code Online (Sandbox Code Playgroud)
从磁盘读取数据大约需要 20-25 秒 - 即使我没有对结果强加任何排序。我使用冷缓存(即 after DBCC DROPCLEANBUFFERS)运行查询。IO统计结果如下:
扫描计数 1,逻辑读 364,物理读 24,预读 7191,lob 逻辑读 7924,lob 物理读 1690,lob 预读 3968。
它抓取了大约 15 MB 的数据。执行计划如我所料显示聚集索引扫描。
除了我的查询外,磁盘上没有任何 IO;我还检查了聚集索引碎片是否接近 0%。这是一个消费级 SATA 驱动器,但我仍然认为 SQL Server 能够以比 ~100-150 MB/min 更快的速度扫描表。
XML 字段的存在导致大部分表数据位于 LOB_DATA 页上(实际上约 90% 的表页是 LOB_DATA)。
我想我的问题是 - 我认为 LOB_DATA 页面会导致扫描缓慢不仅是因为它们的大小,还因为当表中有很多 LOB_DATA 页面时,SQL Server 无法有效扫描聚集索引,我是否正确?
更广泛地说 - 拥有这样的表结构/数据模式是否合理?使用 Filestream 的建议通常说明更大的字段大小,所以我真的不想走那条路。我还没有真正找到关于这个特定场景的任何好的信息。
我一直在考虑 XML 压缩,但它需要在客户端或使用 SQLCLR 完成,并且需要在系统中实现相当多的工作。
我尝试了压缩,因为 XML 是高度冗余的,所以我可以(在 …
运行包含实际执行计划的查询时,根运算符 ( SELECT) 告诉我缓存计划大小为 32KB。
该连接的查询sys.dm_exec_cached_plans和sys.dm_os_memory_objects,看问题的计划,称该值pages_in_bytes和max_pages_in_bytes为32768(32KB),它匹配缓存计划的大小。
我不明白的是 中的值sys.dm_exec_cached_plans.size_in_bytes,即 49152 (48KB) 代表什么。我已经阅读了所有这些专栏的 BOL,特别是size_in_bytes其中说:
"缓存对象消耗的字节数。 "
我无法解决最后一点难题,无法理解它的真正含义。
我知道所有操作符(不是谈论用于排序和散列的额外内存授予)都需要一定数量的固定内存,以存储状态、进行计算等,这些内存与缓存中的优化计划一起存储,但在哪里?
所以,我的问题是:
size_in_bytes意思我知道它们是具有不同功能的不同 DMV,但它们是相关的。在编译(缓存)计划sys.dm_exec_cached_plans加入sys.dm_os_memory_objects在memory_object_address列。我在这里发布问题的原因是我在寻求帮助,了解如何解释 DMV 及其专栏。
如果size_in_bytes是缓存计划大小,为什么SQL Server在实际执行计划中说另一个值?
新查询,新号码:
sys.dm_exec_cached_plans.size_in_bytes 24KBsys.dm_os_memory_objects.pages_in_bytes, .max_pages_in_bytes 16KB。另请注意,此查询不需要为排序和散列操作分配任何额外的内存。
Microsoft SQL Server 2012 - 11.0.5343.0 (X64)
这是我的第一篇 DBA.SE 帖子,所以请告诉我任何错误,谢谢!
我是一名新的 DBA(不是 IT 专业人员,只是公司中没有其他人可以这样做),所以解释越基本越好。我一直在阅读有关数据库备份策略(或者,我已经学会将其称为“恢复策略”)的文章。我了解完整、差异和事务日志备份的作用,但我想知道为什么差异备份只能基于最近的完整备份。
如果差异备份是自上次完整备份以来发生变化的所有内容,那么为什么差异不能基于我选择的任何备份?更清楚地说,我问的是在进行备份时指定基础,而不是在恢复时。我假设在恢复时您会选择正确的基数和相应的差异来执行恢复(不使用由基数 B 制成的差异从基数 A 恢复)。
阻止此功能实现的原因是什么?我想一定是有原因的,我只是不知道它是什么。
注意:我知道不能指定基数,但我的问题是为什么不指定?(我也对“你为什么要?”的讨论不感兴趣)
这是我如何理解差异备份的类比:
我有一个 Excel 文件,单元格中有一些数据。
在第 1 天,我制作了该文件的副本并将其存储在其他地方(“完整备份”)。
在第 2 天,我查看该文件并将其与我在第 1 天制作的备份副本进行比较,并记下所有已更改的单元格及其新值(“差异备份”)。我没有注意到对单元格所做的每一个更改,只注意到它的最终值是什么。如果单元格 A1 以“Alfred”开头,改为“Betty”、“Charlie”,然后是“Dave”,我只会注意到“A1 现在是 Dave”。
在第 3 天,我再次将当前文件与备份文件进行比较并注意更改(另一个“差异备份”与第 2 天具有相同的基础)。同样,只注意观察时每个单元格的最终值,而不是单元格一整天的所有值。
在第 4 天,我再次比较并再次注意变化。继续使用单元格 A1,现在它显示“Sarah”,即使它全天有 10 个其他名字,我只注意到“现在 A1 是 Sarah”。
第 5 天,我的文件搞砸了;因此,我查看了我在第 1 天制作的备份副本,然后查看了第 4 天记录的最终状态,然后将记录的更改应用于备份副本,现在我将文件“恢复”到第 4 天的状态因此,我查看了第 1 天所做的备份,看到第 4 天单元格 A1 以“Sarah”结尾,并将备份单元格 A1 更改为“Sarah”。
如果我在第 2 天制作了文件的另一个备份副本(“完整”),为什么会如此重要?为什么仍然不能将第 3 天或第 4 天的文件与第 1 天制作的副本进行比较(阅读,“对其进行差异备份”)?据我了解,SQL Server …
这个问题类似于优化 IP 范围搜索?但那个仅限于 SQL Server 2000。
假设我有 1000 万个范围临时存储在一个表中,结构和填充如下。
CREATE TABLE MyTable
(
Id INT IDENTITY PRIMARY KEY,
RangeFrom INT NOT NULL,
RangeTo INT NOT NULL,
CHECK (RangeTo > RangeFrom),
INDEX IX1 (RangeFrom,RangeTo),
INDEX IX2 (RangeTo,RangeFrom)
);
WITH RandomNumbers
AS (SELECT TOP 10000000 ABS(CRYPT_GEN_RANDOM(4)%100000000) AS Num
FROM sys.all_objects o1,
sys.all_objects o2,
sys.all_objects o3,
sys.all_objects o4)
INSERT INTO MyTable
(RangeFrom,
RangeTo)
SELECT Num,
Num + 1 + CRYPT_GEN_RANDOM(1)
FROM RandomNumbers
Run Code Online (Sandbox Code Playgroud)
我需要知道包含值的所有范围50,000,000。我尝试以下查询
SELECT *
FROM MyTable
WHERE 50000000 …Run Code Online (Sandbox Code Playgroud) sql-server ×10
backup ×1
blob ×1
dmv ×1
index ×1
memory ×1
optimization ×1
perfmon ×1
performance ×1
plan-cache ×1
sqlcmd ×1
xml ×1