我正在尝试了解提高客户端查询性能的最佳方法。它包含一些已连接的表,其中一个表称为dwh.fac_sale_detail
,其中包含15亿行。
此表dwh.fac_sale_detail
根据名为TradingDateKey
的列之一进行分区。它实际上以yyyymmdd
格式存储数据,但它是INT
数据类型。
从2005年到2015年,这个数字为TradingDateKeys
。但分区仅在2014年之前创建。
另一个团队中的一个人提出以下建议并且我正在尝试遵循他的建议,但我不熟悉创建或更改分区,并且不知道这是否真的对提高查询性能有任何影响:
他用自己的话说的是
FactSalesDetail表目前约为15亿行,目前在TradingDate上按年划分为10个分区,每个分区约1.5亿行。将最新年份进一步划分为每月分区并在所有分区上应用列存储索引是一个好主意。在每个分区上应用索引将是一次性的,您只需要保持当前分区的索引。
请找到我可以提供的附加截图,以便更好地理解:
答案 0 :(得分:0)
我创建了一个示例表,并使用了创建分区向导,该向导位于SQL数据库表的上下文菜单中
我将以下脚本作为输出
CREATE PARTITION FUNCTION [TradingDatePartitionFunction](int) AS RANGE LEFT FOR VALUES (N'20151201', N'20151101', N'20151001', N'20150901', N'20150801', N'20150701', N'20150601', N'20150501', N'20150401', N'20150301', N'20150201', N'20150101', N'20140101')
CREATE PARTITION SCHEME [DatePartitionScheme] AS PARTITION [TradingDatePartitionFunction] TO (
[file1], [file2], [..], [..], [..], [..], [..],
[..], [..], [..], [..], [..], [..], [..]
)
CREATE CLUSTERED INDEX [ClusteredIndex_on_DatePartitionScheme_635780868545743751] ON [dbo].[sale_detail]
(
[TradingDateKey]
) ON [DatePartitionScheme]([TradingDateKey])
DROP INDEX [ClusteredIndex_on_DatePartitionScheme_635780868545743751] ON [dbo].[sale_detail]
创建分区后,插入的数据将被放入正确的分区文件
您可以在网络上参考以下table partition示例等 但是,将旧的近乎历史数据保存在一个分区中是一个好主意,而其他分区经常以较少的数量将最近的数据读入不同的分区。 如果你检查我的分区功能,我定义了12个月分区,1个用于去年(2014年)和1个用于前几年
我在您对此答案Deepak的评论后添加以下代码
首先,您需要使用
为其他分区添加新文件组ALTER PARTITION SCHEME DatePartitionScheme NEXT USED [fileN]
请参阅https://technet.microsoft.com/en-us/library/ms190347%28v=sql.105%29.aspx
然后,为了添加新分区,您可以按如下方式使用SPLIT
ALTER PARTITION FUNCTION [TradingDatePartitionFunction]()
SPLIT RANGE ('20151201')
您需要为分区函数的每个区分值运行以上。 Split将使用下一个未使用的文件用于新创建的分区
如果要将两个分区合并或组合在一起,可以使用
ALTER PARTITION FUNCTION [TradingDatePartitionFunction]()
MERGE RANGE ('20140101')
您可以使用以下代码检查语句的结果
select r.*
from sys.partition_range_values r
inner join sys.partition_functions f
on f.function_id = r.function_id
where f.name = 'TradingDatePartitionFunction'
我希望这能指导您寻求解决方案, 请在申请高效环境之前进行测试