sqlserver的查询性能

sqlserver的查询性能,sql,sql-server,database-administration,Sql,Sql Server,Database Administration,我试图知道提高客户给我的查询性能的最佳方法。它包含几个连接的表,其中一个表名为dwh.fac_sale_detail,包含15亿行 此表dwh.fac_sale_detail根据其名为TradingDateKey的一列进行分区。它实际上以yyyymmdd格式存储数据,但它是INT数据类型 这是从2005年到2015年的交易日期。但这些分区只会创建到2014年 另一个团队中的一位成员提出了以下建议,我正试图听从他的建议,但我对创建或更改分区还不熟悉,不知道这是否会对提高查询性能产生任何影响: 他用

我试图知道提高客户给我的查询性能的最佳方法。它包含几个连接的表,其中一个表名为dwh.fac_sale_detail,包含15亿行

此表dwh.fac_sale_detail根据其名为TradingDateKey的一列进行分区。它实际上以yyyymmdd格式存储数据,但它是INT数据类型

这是从2005年到2015年的交易日期。但这些分区只会创建到2014年

另一个团队中的一位成员提出了以下建议,我正试图听从他的建议,但我对创建或更改分区还不熟悉,不知道这是否会对提高查询性能产生任何影响:

他用自己的话说的是

FactSalesDetail表目前约有15亿行,目前在TradingDate上按年度划分为10个分区,每个分区约有1.5亿行。最好将最近一年进一步划分为每月分区,并在所有分区上应用columnstore索引。在每个分区上应用索引将是一次性的,您应该只需要继续维护当前分区的索引

请查找我可以提供的附加屏幕截图,以便更好地理解:


我创建了一个示例表,并使用了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]
创建分区后,插入的数据将放置在正确的分区文件中

您可以在web上参考以下示例和更多内容 但最好将旧的几乎是历史数据的数据保存在一个分区中,而其他分区则经常以较小的数量将最近的数据读入不同的分区中。 如果你检查我的分区函数,我定义了12个月分区,2014年为去年定义了一个,前几年定义了一个

在您对这个答案的评论之后,我添加了以下代码

首先,您需要使用为其他分区添加新的文件组

ALTER PARTITION SCHEME DatePartitionScheme NEXT USED [fileN]  
请参阅

然后,对于添加新分区,您可以按如下方式使用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'
我希望这能引导你找到解决方案,
在应用于生产环境之前,请先进行测试

您的问题是什么?如果您想知道分区是否能提供更好的性能,那么必须查看查询和查询计划。可能您缺少索引、类型不匹配,或者在参数嗅探等方面存在问题。您好,谢谢您的回复。我想提高查询性能,如果我向您提供实际的执行计划,您是否可以为我提供提高性能的建议?分区真的对性能有影响吗?如果您将分区放在不同的物理硬盘上,那么在选择多个分区时,您可能会获得更好的IO。但是你真的希望你的数据库分布在20个物理驱动器上吗?嗨,Adrian,我不知道我是否必须在那个大表fac_sale_Detail上创建分区来提高性能。但是查询只花费了1:39:09,它返回643271行数据。你知道我怎样才能给你实际的执行计划吗?@Deepak只有在你提供查询和执行计划的情况下,我们才能说一些可能发生的事情。谢谢你的回答,非常感谢你的回答,我的表已经从2005年到2014年6月30日进行了分区,而且它在tradingdatekey上也已经有了聚集索引。如何将分区扩展到2015年,我希望每月都这样做,如您所示。thanksThanks Eraper,我将在开发环境中尝试,并将看到结果。顺便问一下,我如何与您共享实际的执行计划?我只想补充一点,在这种情况下,拆分非空分区将是一个非常昂贵的操作。考虑用创建索引进行重建…