小编sam*_*hop的帖子

如何在运行查询时模拟低内存状态

我试图更好地了解 SQL Server 的执行引擎在低内存状态下的行为。说到内存授予,我想知道是否有某种方法可以强制GrantedMemory等于RequiredMemory. (我的猜测是有一个未记录的跟踪标志可以做到这一点。有人知道它是什么吗?)

sql-server database-internals

13
推荐指数
1
解决办法
1194
查看次数

使用哈希匹配运算符实现的联合

我正在查看 TechNet 上列出的 SQL Server 物理运算符(不要判断,你知道你已经完成了)并读到哈希匹配物理运算符有时用于实现UNION逻辑运算符

我从未见过这样做过,并想了解更多。一个示例查询会很棒。什么时候使用它,什么时候它比替代品更好?(这些通常是相同的,但并非总是如此。)

sql-server optimization execution-plan database-internals union

5
推荐指数
3
解决办法
1532
查看次数

扩展事件 lock_escalation resource_type 字段中的 HOBT 与 OBJECT

我正在lock_escalation我们的生产服务器(运行 SQL Server 2014 企业版)上捕获事件,并试图理解输出,尤其是该resource_type字段。尽管该resource_type字段有 17 个不同的可能值,但我看到的只是OBJECTHOBT。在某些服务器上我只看到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 extended-events sql-server-2014

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

表变量有主键时对执行计划的影响

在阅读了大量有关 SQL Server 中临时表和表变量之间差异的信息后,我正在尝试从主要使用临时表切换到主要使用表变量。(它们似乎更适合我通常使用的查询类型。)

在这些查询中,表包含驱动查找过程的唯一标识符。在使用临时表时,我的习惯是包含一个PRIMARY KEY约束,以便查询优化器知道它不会看到任何重复项。但是,鉴于优化器(在大多数情况下,对于我的查询)假定表变量仅包含单行*,根据定义这是唯一的,如果存在PRIMARY KEY约束,查询优化器是否会做出任何不同的选择?

* 从技术上讲,它假定没有行,但将零替换为一。(因为零与估计过程的其余部分的交互非常差。)但这也取决于在编译查询时是否填充了表变量。这里有一些背景信息:SQL Server 中的临时表和表变量有什么区别?.

我目前正在使用 SQL Server 2014,但我很好奇新版本的行为是否发生变化。


正如已经指出的那样,PRIMARY KEY约束带有聚集索引,它为查询优化器提供了更多关于如何从表变量中获取数据的选择。我意识到了这一点,并考虑了查询计划的其余部分。但是在试图澄清我的问题之后,我决定我试图提出的问题太广泛了,可能特别针对我的极端情况。(不过是对半万亿行表的导航类型查询,期望达到亚秒级性能。)所以我将保持我的问题不变。

sql-server optimization table-variable

4
推荐指数
2
解决办法
1308
查看次数