什么可以加速 SQL 计数查询?

Mac*_*ver 9 performance sql-server count netezza query-performance

在进行计数(聚合)SQL 查询时,在这 3 个数据库系统中,什么可以加快执行时间?我相信很多事情都可以加快速度(硬件之一),但我只是一个新手 DBA,所以我相信我会在这里得到一些答案。我将大约 1.57 亿行迁移到 SQL Server 数据库,并且这个查询需要永远执行。但是在我的源 Netezza 数据库中,它需要几秒钟。

例如:

网易6:

SELECT COUNT(*) FROM DATABASENAME..MYTABLE
Run Code Online (Sandbox Code Playgroud)

甲骨文 11g:

SELECT COUNT(*) FROM MYTABLE
Run Code Online (Sandbox Code Playgroud)

SQL Server 2012:

SELECT COUNT(*) FROM DATABASENAME.[dbo].[MYTABLE]
Run Code Online (Sandbox Code Playgroud)

Pat*_*ler 10

Netezza 是一种设计用于在大型表扫描方面表现出色的设备,这就是您在该系统上获得如此快速结果的原因。

对于您的 SQL Server,您可以通过从 sys.dm_db_partition_stats DMV 查询来大大加快行计数。

SELECT s.name AS [Schema], o.name AS [Table], SUM(p.row_count) AS [RowCount]
FROM sys.dm_db_partition_stats p JOIN sys.objects o
ON p.object_id = o.object_id JOIN sys.schemas s
ON o.schema_id = s.schema_id
WHERE p.index_id < 2
AND o.object_id = object_id('MyTable')
GROUP BY o.name, s.name;
Run Code Online (Sandbox Code Playgroud)

在高交易环境中,此 DMV 不能保证 100% 准确。但是从您的问题来看,听起来您只是在进行行计数以在迁移后验证每个表,因此此查询应该适合您。

  • @菲尔为什么?如果您遍历表格并从每个表格中执行昂贵的 SELECT COUNT(*) - 一旦到达最后一个表格,第一个结果的准确度如何? (4认同)

Jon*_*gel 5

这是COUNT_BIG在索引视图中使用的 SQL Server 解决方案。这将为您提供事务一致的计数,而无需大表或索引扫描的开销,也无需后者所需的存储:

CREATE TABLE [dbo].[MyTable](id int);
GO

CREATE VIEW [dbo].[MyTableRowCount]
    WITH SCHEMABINDING
AS

    SELECT
        COUNT_BIG(*) AS TableRowCount
        FROM [dbo].[MyTable];
GO

CREATE UNIQUE CLUSTERED INDEX IX_MyTableRowCount
    ON [dbo].[MyTableRowCount](TableRowCount);
GO

SELECT
    TableRowCount
    FROM [dbo].[MyTableRowCount] WITH(NOEXPAND);
Run Code Online (Sandbox Code Playgroud)

这将需要一次初始扫描(无法避免),并为增量表数据操作增加了一些开销。如果您正在使用大量数据进行大型操作(而不是许多小操作),我认为更改的开销应该可以忽略不计。