【发布时间】:2020-12-22 07:41:48
【问题描述】:
我在 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]
我不知道哪里可能出错,为什么要花这么多时间。请就如何修复它向我提出一些方法或技术,因为这是一个关键表,主要报告严重依赖此表。
【问题讨论】:
-
你试过
count(*)吗?该列可以为空吗? -
不,它是表的主键。我不想要 * 因为这会增加更多时间。
-
使用粘贴计划向我们展示估计的执行计划。
-
如果它不为空,那为什么会增加什么?
-
count(not_null_column)比count(*)快是一个从未有过的神话——两者的性能完全相同。所以count(*)不会改变任何东西,我很确定 SQL Server 对两者使用完全相同的执行计划。我想您无能为力,除了在问题上投入更快的硬件,或者让 SQL Server 使用并行线程进行计数。但最后它必须遍历表中的所有行才能进行计数
标签: sql-server indexing query-performance large-data