我的公司正在迁移到 SQL Server 2008 R2。我们有一个包含大量存档数据的表。大多数使用此表的查询都在 where 语句中使用 DateTime 值。例如:
Query 1
SELECT COUNT(*)
FROM TableA
WHERE
CreatedDate > '1/5/2010'
and CreatedDate < '6/20/2010'
我假设分区是在 CreatedDate 创建的,每个分区分布在多个驱动器上,我们有 8 个 CPU,数据库中有 5 亿条记录,均匀分布在 2008 年 1 月 1 日的日期上至 2011 年 2 月 24 日(38 个分区)。该数据也可以分为一年中的几个季度或其他时间段,但我们将假设保留为几个月。
在这种情况下,我认为将使用 8 个 CPU,并且只会查询 6 个分区的 2010 年 1 月 5 日到 2010 年 6 月 20 日之间的日期。
现在,如果我运行以下查询并且我的假设与上面相同会怎样。
Query 2
SELECT COUNT(*)
FROM TableA
WHERE State = 'Colorado'
问题?
1. 是否会查询所有分区?是的
2. 是否会使用所有 8 个 CPU 来执行查询?是的
3. 性能会比查询未分区的表更好吗?是的
4.我还有什么遗漏的吗?
5. 分区索引有什么帮助?
我根据我对 SQL Server 2008 分区表和并行性的有限知识回答上面的前 3 个问题。但如果我的答案不正确,您能否提供反馈以说明我不正确的原因。
资源:
- Video: 演示 SQL Server 2008 分区表并行性 http://channel9.msdn.com/Blogs/Joe+Longtin/Demo-SQL-Server-2008-Partitioned-Table-Parallelism(时长5分钟)
- MSDN: 分区表和索引 http://msdn.microsoft.com/en-us/library/ms188706.aspx
- MSDN: 设计分区来管理数据子集 http://msdn.microsoft.com/en-us/library/ms191174.aspx
- MSDN: 分区表和索引的查询处理增强 http://msdn.microsoft.com/en-us/library/ms345599.aspx
- MSDN:Word 文档:使用 SQL Server 2008 的分区表和索引策略 http://technet.microsoft.com/en-us/library/dd578580%28SQL.100%29.aspx白皮书
BarDev
分区是never提高性能的选项。您所能期望的最好的结果就是获得与非分区表相当的性能。通常,您会得到随分区数量增加而增加的回归。为了提高性能,您需要索引,而不是分区。分区用于数据管理操作:ETL、归档等。有些人声称消除分区可能会提高性能,但对于任何分区消除都可以将前导索引键放在与分区列相同的列上,从而获得更好的结果。
是否会查询所有分区?
该查询需要一个索引State
。否则就是表扫描,并且会扫描整个表。对分区表的表扫描是always比扫描相同大小的非分区表慢。索引本身可以在同一分区方案上对齐,但主键必须是State
.
是否会使用所有 8 个 CPU 来执行查询?
尽管普遍存在相反的误解,但并行性与分区无关。分区和非分区范围扫描都可以使用并行运算符,这将由查询优化器决定。
性能会比查询不存在的表更好吗
分区?
No
分区索引有何帮助?
索引会有所帮助。如果索引必须对齐,则必须对其进行分区。非分区索引比分区索引更快,但无法规避切入/切出操作的索引对齐要求。
如果您正在考虑分区,那应该是因为您需要执行快速切入切出操作来删除超过保留策略期限的旧数据或类似的操作。为了性能,您需要查看索引,而不是分区。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)