@JonathanFite在评论中提到了索引和统计之间的区别:
Indexes will help sql find the data faster by creating lookups that are sorted differently than the table itself. Statistics help sql determine how much memory/effort is going to be required to satisfy the query.
这是很好的信息,主要是因为它帮助我澄清了我的问题:
如何知道这一点(或与STATISTICS的行为和性质相关的任何其他技术信息)有助于确定何时选择CREATE STATISTICS而不是CREATE INDEX,特别是在创建索引时将创建相关的STATISTICS对象?只有STATISTICS信息而没有索引会更好地服务于什么情况?
如果可能的话,如果有一个STATISTICS对象比INDEX更适合的场景的工作示例,那将是超级有用的.
由于我是一名视觉学习者/思想家,我认为将STATISTICS和INDEX之间的差异并排看作可能有助于确定何时STATISTICS是更好的选择.
Thingy PROs CONs ------- ---------- ------------------- INDEX * Can help sorts. * Takes up space. * Contains data (can * Needs to be maintained (extra I/O). "cover" a query). * More chances for blocking / dead-locks. STATISTICS * Takes up very little space. * Cannot help sorts. * Lighter maintenance / won't * Cannot "cover" queries. slow down DML operations. * Does not increase chances of blocking / dead-locks.
以下是我在寻找这个时发现的一些资源,即使是同一个问题,也没有回答:
SQL Server Statistics Questions We Were Too Shy to Ask
Statistics. Are multicolumn histograms possible?
**为了清楚起见,我没有这方面的答案,我实际上希望得到一些人的反馈意见,以提供似乎奇怪的错误信息在这里的互联网.
解决方法
从我的sql server内部注释(sqlSkills类 – IE1和IE2)和SQL Server internals book,下面是我有限的理解:
sql Server统计信息只是包含有关索引键值和常规列值的重要信息的系统对象.
sql Server使用基于成本的模型来尽快选择“足够好”的执行计划.忠诚度估计(估计要在每个步骤上处理的行数
查询执行是查询优化中最重要的因素,它会影响连接策略,内存授予要求,工作线程选择
以及访问数据时的索引选择.
sql Server在估计大数量时不会使用非聚簇索引.将需要KEY或RID循环操作,因此它维护索引(和列)的统计信息
将有助于这种估计.
统计数据有两个重要的事项:
>直方图仅存储最左侧统计(索引)列的数据分布信息.它还存储有关键值的多列密度的信息.基本上,
直方图仅存储最左侧统计列的数据分布.
>无论表大小如何,sql Server将在直方图中保留最多200个步骤.每个直方图步骤所覆盖的间隔随着表的增长而增加,这导致大表的“不太准确”的统计数据.
请记住,指数选择性是一个与密度成反比的指标,即色谱柱具有的唯一值越多,其选择性越高.
当特定查询不经常运行时,您可以选择创建列级统计信息而不是索引.列级统计信息有帮助
查询优化器找到更好的执行计划,即使这些执行计划由于索引而不是最理想的
扫描涉及.同时,统计数据不会在数据修改操作期间增加额外开销
帮助避免索引维护.此方法仅适用于很少执行的查询.
参考:
> Column Statistics Give the Optimizer an Edge by Kalen Delaney
> Statistics,Damned Lies,and Statistics – What is Statman?由康纳坎宁安
注意:像Paul White或Aaron Bertrand这样的人可以为your good question提供更多颜色.