两列的分组索引

时间:2011-07-18 15:25:00

标签: sql sql-server sql-server-2008 indexing group-by

我有一个大的临时表(约1.6亿行)#itemsTemp

itemId  | style    | styleWeight
--------------------------------
int     | smallint | float(53)

以及以下查询:

select 
    itemId,
    style,
    SUM(styleWeight) itemCount 
from 
    #itemsTemp 
group by itemId,style

目前#itemsTemp没有索引。我对这里最好的东西感到有点困惑:

  1. itemIdstyle(可能include styleWeight)的综合索引
  2. itemIdstyle
  3. 上的单独索引

    我应该走哪条路?为什么?还有其他选择吗?

3 个答案:

答案 0 :(得分:4)

包含itemId的{​​{1}}和style上的综合索引将是最佳选择。

这将允许styleWeight无需排序和/或群集搜索/ RID查找开销。

答案 1 :(得分:3)

SQL Server 2008实际上是suggests missing indexes if you include the actual execution plandatabase tuning advisor tool也为您建议索引。

然而最佳索引取决于针对此表运行的其他查询

  • 您添加到表中的外推索引在写入时会产生存储损失和性能损失,因此如果您写入此表,则希望保持索引数量合理地低,以保持写入性能可接受。
  • 如果许多其他查询使用相同的2列,那么您可能希望使用复合索引,只要这些查询都可以利用该索引(请记住复合索引的顺序很重要)。
  • 相反,如果其他查询无法利用复合索引,最好使用两个单独的索引 - 此查询的性能可能更低但是如果索引重用减少了索引的数量,这可能是值得的在这张桌子上。

实际上,索引建议功能往往效果很好 - 我只是按照它的建议(经过快速思考/健全性检查)然后只运行一些简单的测试以确保查询实际上是使用新的指数(ES)。

答案 2 :(得分:1)

除了双向评估性能(手动)之外,您还可以使用查询优化提示 - 例如:http://msdn.microsoft.com/en-us/library/ms181714.aspx

另外 - 如果你的临时表太大了,我想知道解决问题的方法是否比使用临时表更好。

另外 - 你多久写一次与阅读?会议有多长?您是否可以将其用于其他程序?

相关问题