繁体   English   中英

500+ 万行表的主键列的选择查询没有响应

[英]Select query on primary key column of 500+ million rows table is not responding

我在 SQL Server 中有一个表,它有 500 多万行,在表的主键上定义了默认聚集索引。 我正在运行这个需要 30 多分钟的简单查询。

Select count(ledgeridXXX) from Ledger.dbo.tblXXXX 

这是聚集索引定义的块

CONSTRAINT [PK__tblDepar__AE70E0AFF9BAF7B9] PRIMARY KEY CLUSTERED 
(
    [LedgerIDXXX] ASC
) 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
      ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]

我不知道哪里可能出错,为什么要花这么多时间。 请建议我一些解决方法或技术,因为这是一个关键表,主要报告严重依赖于该表。

如果你只是计算行数,你可以试试这个:

SELECT SUM(p.rows) as [cnt]
FROM sys.partitions AS p
INNER JOIN sys.tables AS t ON p.[object_id] = t.[object_id]
INNER JOIN sys.schemas AS s ON t.[schema_id] = s.[schema_id]
WHERE p.index_id = 1 /* clustered index */
AND t.name = N'tblXXXX'AND s.name = N'dbo';

当您有密集的工作量时, COUNT(clusteredkey)可能会有一些开销。 这可能需要数小时才能扫描整个 5 亿行。

如果您运行的是更高版本的 SQL Server,则可以使用列存储索引来加速COUNT

参考:

  1. 坏习惯 - 计算困难的方式
  2. 快速计数 - Stackoverflow
  3. 列存储索引快速计数

当您在没有where子句的情况下执行COUNT(Column)COUNT(1)COUNT(*)时会发生什么:

SQL Server 查找将完成这项工作的最小(包含最少的列数,单个 AK 页中的最多行)索引。

如果您只有一个聚集索引,这意味着它将使用聚集索引。 (聚集索引包含表的所有列)

你可以做些什么来加快速度:

  1. 创建一个只有 1 列的单独索引,最好是小数据类型。 (创建索引可能需要很多时间)。
  2. 为您的查询创建索引视图。 由于您不分组,因此我不建议这样做。
  3. 指定表提示WITH(TABLOCK)WITH(TABLOCKX)以强制表锁或排他表锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM