SQL Server - 使用GROUP BY查询大型表的性能

时间:2012-01-18 12:07:13

标签: sql sql-server group-by database-performance

我在Sql Server 2008中有表“TRANSACTION”。大约在1秒内将6条记录插入此表中。 (因为它是金融交易表)所以,在1天内,插入500.000条记录。 表每周进行一次分区。

这个表大量用于多种选择(当然是NOLOCK),插入,更新操作。

您是否认为下方的查询可能会降低同一桌面上的其他关键选择,插入,更新操作的速度?我认为,即使下面的查询持续时间太长,其他选择查询也不会减慢,因为此查询不会锁定表。但我不能确定,并问你。

请注意,选择列表中的列未在表上建立索引。

SET @END_DATE = GETDATE()

SET @START_DATE = DATEADD(HOUR, -24, @END_DATE) 

SELECT Column1, Column2, Column3, Column4, COUNT(*) FROM [TRANSACTION] WITH(NOLOCK)
WHERE TRANSACTION_DATE BETWEEN @START_DATE AND @END_DATE
GROUP BY Column1, Column2, Column3, Column4

2 个答案:

答案 0 :(得分:3)

在服务器上运行任何查询都将使用CPU /内存/ IO,因此实际上您运行的任何内容都会对正在执行的其他查询产生影响。

你肯定会从你自己的数字中读取约500k行,你可以计算行数,你甚至可以大致了解这些数据将被存储的页数。您必须对查询计划进行交叉检查,以确保它至少没有进行完整的分区扫描,否则将扫描到内存中的350万行。

这会让你超出SLA吗?我们无法告诉您,只有通过适当的负载测试才能确定。

答案 1 :(得分:0)

显然或多或少地减缓了服务器上的所有操作。

查询持续时将锁定的唯一查询是针对您的表的架构更改查询。

我个人建议您在列Column1,Column2,Column3,Column4,Transaction_date上创建索引以更快地运行分组,如下所示:

CREATE INDEX iName on [TRANSACTION](Column1, Column2, Column3, Column4, Transaction_date)