我试图更好地了解 SQL Server 的执行引擎在低内存状态下的行为。说到内存授予,我想知道是否有某种方法可以强制GrantedMemory
等于RequiredMemory
. (我的猜测是有一个未记录的跟踪标志可以做到这一点。有人知道它是什么吗?)
我正在查看 TechNet 上列出的 SQL Server 物理运算符(不要判断,你知道你已经完成了)并读到哈希匹配物理运算符有时用于实现UNION
逻辑运算符。
我从未见过这样做过,并想了解更多。一个示例查询会很棒。什么时候使用它,什么时候它比替代品更好?(这些通常是相同的,但并非总是如此。)
sql-server optimization execution-plan database-internals union
我正在lock_escalation
我们的生产服务器(运行 SQL Server 2014 企业版)上捕获事件,并试图理解输出,尤其是该resource_type
字段。尽管该resource_type
字段有 17 个不同的可能值,但我看到的只是OBJECT
和HOBT
。在某些服务器上我只看到OBJECT
,但在一个服务器上我看到HOBT
了很多。
SQL Server 试图通过该字段告诉我什么?我们所有服务器上的所有表当前都配置了LOCK_ESCALATION = TABLE
,我们正在考虑更改。我HOBT
经常看到的服务器比我们的其他服务器有更多的分区表,但是,根据我的理解和我们的配置,SQL Server 应该只升级到表级别而不是分区级别。
我很确定我们所有的表都配置了LOCK_ESCALATION = TABLE
. 我在数据库中运行了这个查询,在那里我看到了很多HOBT
结果:
SELECT lock_escalation_desc, total = COUNT(*)
FROM sys.tables
GROUP BY lock_escalation_desc
Run Code Online (Sandbox Code Playgroud)
我得到了一行:
lock_escalation_desc total
TABLE 143
Run Code Online (Sandbox Code Playgroud)
(那个特定的数据库非常庞大,它基本上拥有自己的服务器。)
编辑:我现在很确定这OBJECT
表示表锁定并HOBT
表示分区级锁定。但是我很惊讶地看到分区级锁定,因为所涉及的表没有配置为以这种方式锁定,而且我读到的所有内容都表明 SQL Server 应该在表级锁定。
以下是其中一个事件的完整 XML:
<event name="lock_escalation" package="sqlserver" timestamp="2017-06-08T18:00:23.590Z">
<data name="resource_type">
<type name="lock_resource_type" package="sqlserver"></type>
<value>12</value>
<text><![CDATA[HOBT]]></text>
</data> …
Run Code Online (Sandbox Code Playgroud) 在阅读了大量有关 SQL Server 中临时表和表变量之间差异的信息后,我正在尝试从主要使用临时表切换到主要使用表变量。(它们似乎更适合我通常使用的查询类型。)
在这些查询中,表包含驱动查找过程的唯一标识符。在使用临时表时,我的习惯是包含一个PRIMARY KEY
约束,以便查询优化器知道它不会看到任何重复项。但是,鉴于优化器(在大多数情况下,对于我的查询)假定表变量仅包含单行*,根据定义这是唯一的,如果存在PRIMARY KEY
约束,查询优化器是否会做出任何不同的选择?
* 从技术上讲,它假定没有行,但将零替换为一。(因为零与估计过程的其余部分的交互非常差。)但这也取决于在编译查询时是否填充了表变量。这里有一些背景信息:SQL Server 中的临时表和表变量有什么区别?.
我目前正在使用 SQL Server 2014,但我很好奇新版本的行为是否发生变化。
正如已经指出的那样,PRIMARY KEY
约束带有聚集索引,它为查询优化器提供了更多关于如何从表变量中获取数据的选择。我意识到了这一点,并考虑了查询计划的其余部分。但是在试图澄清我的问题之后,我决定我试图提出的问题太广泛了,可能特别针对我的极端情况。(不过是对半万亿行表的导航类型查询,期望达到亚秒级性能。)所以我将保持我的问题不变。