【问题标题】:Composite index and locking复合索引和锁定
【发布时间】:2015-12-09 20:33:33
【问题描述】:

我正在尝试最小化在可序列化事务期间锁定的行数。

似乎有问题的查询是:

UPDATE CLIENTS 
SET SOMEVALUE = 'A' 
WHERE CLIENT_ID = 'aaaa' AND YEAR = 2015

目前没有索引,除了主键。

使用CLIENT_IDYEAR 创建复合索引(非唯一)是否有助于键范围锁定?

【问题讨论】:

  • 什么主键??
  • 主键是 ID int,实际上在这个特定查询中不可用

标签: sql sql-server transactions locking


【解决方案1】:

编辑:在范围键示例之后添加了一个额外的资源链接。

添加索引不一定有帮助。在走这条路之前,我会首先为您的查询捕获您的实际执行计划并保存它。接下来,为您的 2 个谓词 CLIENT_ID 和 YEAR 创建统计信息。再次运行查询捕获新的查询计划并比较 2。

以下示例说明了如何创建统计信息、查看新统计信息以及查看统计信息的密度(唯一性)和直方图(关键列的频率)。

拥有正确的统计数据确实可以减少返回的记录数。

AdventureWorks2014 使用示例:

--Create statistics for the 2 predicates
CREATE STATISTICS PersonType_EmailPromotion ON Person.Person (PersonType, EmailPromotion)

--View your newly created statistic
exec sp_helpstats 'Person.Person', 'ALL'

--See the density and histogram for you statistic
dbcc show_statistics('Person.Person', PersonType_EmailPromotion)

结果 dbcc show_statistics

--Notice the uniqueness of PersonType and EmailPromotion compared to PersonType alone.
All density Average Length  Columns
0.1666667   4               PersonType
0.05555556  8               PersonType, EmailPromotion

/*
  This shows the number of rows between PersonType range keys. 
  Notice in, 18329 rows between GC and IN, this is where having 
  2 column statistics really helps narrow down the ranges.
*/
RANGE_HI_KEY    RANGE_ROWS  EQ_ROWS     DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
EM              0           297.2556    0                   1
GC              0           395.5958    0                   1
IN              0           18329.27    0                   1
SC              0           688.3814    0                   1
SP              0           37.99508    0                   1
VC              0           223.5004    0                   1

有关dbcc show_statisticsmulti-column statistics 的信息。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    如果最终在查询中使用索引,它将有助于键范围锁定。然后,它可以帮助减少 SQL Server 需要接触和锁定的数据量。

    添加索引,对比前后实际执行计划。大多数情况下,您应该在这种情况下进行正常的索引调整。

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多