【发布时间】:2013-07-18 15:38:34
【问题描述】:
我有一个非常大的表,大约有 5000 万行和 15 列。每当我阅读时,我总是需要所有的列,所以我不能拆分它们。我在表上有一个带有 4 个键的聚集索引,我总是使用这些键读取数据。
但性能仍然很慢,我的查询很简单
select
CountryId, RetailerID, FY,
sum(col1), sum(col2),.....sum(col15)
from mytable a
join product p on a.productid = p.id
join ......
join .....
join ......
join .....
Where .......
group by CountryId, RetailerID, FY
我没有在任何内联函数上使用任何IN 运算符或任何子查询...我知道这显然会使其变慢。我看过分区但不确定,我可以通过分区来提高性能吗?
或者还有什么我可以做的吗?
我使用的是 SQL Server 2012 企业版
请帮忙!
【问题讨论】:
-
是所有约 5000 万行都定期更新还是有些历史记录不会更新?
-
您是否尝试过查看查询计划?
-
同意,请先看执行计划。
-
是的,它们确实每天更新一次,但我们无法控制这一点,因为只要有数据要导入,SSIS 包就会这样做。该系统与 SAP 集成,所以我说的是大量数据。我们有 4 个这种大小的表,每个表大约有 5000 万行,当我们进行报告时,我们使用 UNION ALL 将它们全部合并。我检查了查询计划,它们似乎是我的索引,它没有向我显示“尝试使用...创建索引”的任何帮助,所以计划很好,但这只是数据的问题,要扫描的内容太多。
-
如果查询计划报告大部分时间花在聚集索引查找上,那么它几乎是一个 IO 瓶颈。 SET STATISTICS IO ON,让我们知道这些数字是什么。此外,运行您的查询两次。看看在没有物理读取的情况下,第二次运行是否不会显着加快。
标签: sql database tsql sql-server-2012 database-partitioning