我似乎无法从BOL那里找到任何明确的答案。我有一个场景,数据库调优顾问建议我创建统计信息。这是其中几个例子:
CREATE STATISTICS [_dta_stat_1045578763_1_4] ON [dbo].[BillableTimeEntries]([Id], [Phase_Id]) WITH FULLSCAN
go
CREATE STATISTICS [_dta_stat_1045578763_1_11_4] ON [dbo].[BillableTimeEntries]([Id], [LineItem_Id], [Phase_Id]) WITH FULLSCAN
go
我已经完成了所有建议的创建并删除了重复的统计信息,因为this post表示订单无关紧要(列a,b,c的统计信息与列b,c,a上的统计信息相同)。
我的问题是,由于第二个CREATE STATISTICS
块包含Phase_Id
和Id
,第二个会覆盖第一个,还是它们都会创建会以不同方式影响查询的单独统计信息?< / p>
答案 0 :(得分:1)
您可以创建统计信息并使用DBCC SHOW_STATISTICS命令查看它们之间的差异。 在这里http://msdn.microsoft.com/en-us/library/ms190397.aspx,您可以阅读这项工作的方式:
查询谓词包含多个相关列 当查询谓词包含多个具有跨列关系和依赖关系的列时,多列上的统计信息可能会改进查询计划。多列的统计信息包含跨列关联统计信息(称为密度),这些统计信息在单列统计信息中不可用。当查询结果取决于多列之间的数据关系时,密度可以改善基数估计。 如果列已在同一索引中,则多列统计信息对象已存在,并且无需手动创建它。如果列不在同一索引中,则可以通过在列上创建索引或使用CREATE STATISTICS语句来创建多列统计信息。它需要更多的系统资源来维护索引而不是统计对象。如果应用程序不需要多列索引,则可以通过创建统计对象而不创建索引来节省系统资源。 创建多列统计信息时,统计信息对象定义中列的顺序会影响用于进行基数估计的密度的有效性。 statistics对象存储统计对象定义中每个键列前缀的密度。有关密度的更多信息,请参阅DBCC SHOW_STATISTICS(Transact-SQL)。