覆盖索引或个别索引

时间:2009-07-21 15:36:09

标签: indexing

我们有一个Transactional Media表,其中包含4列的聚簇主键。 RevenueCentreID,DateOfSale,MediaItemID和SaleTypeID。它还包含数量列和数量列。

我们的大多数查询都会选择某个媒体项的日期范围的“收入中心”。我们几乎没有使用SaleTypeID。

在RevenueCentreID,DateOfSale,MediaItemID或这三列上的覆盖索引上创建索引会更好吗?

RevenueCentreID和RevenueCentreID分别是RevenueCentres Table和MediaItems表的外键。它们几乎总是在运行查询时加入。

典型的查询类似于下面的查询:

Select 
    RevenueCentreID,
    MediaItemID,
    DateOfSale,
    SUM(Quantity)Quantity,
    SUM(Amount)Amount 
From 
    Media m 
    Inner Join RevenueCentres rc on m.RevenueCentreID = rc.RevenueCentreID
    Inner Join MediaItems mi    on m.MediaItemID = mi.MediaItemID
    Inner Join MediaCategories mc on mi.MediaCategoryID = mc.MediaCategoryID
Where
    rc.ProfitCentreID = 1
    And mc.MediaCategoryID = 1
    And (DateOfSale Between '20090713' and '20090719')
Group By
    DateOfSale,
    RevenueCentreID,
    MediaItemID

任何建议都会受到赞赏......

2 个答案:

答案 0 :(得分:3)

假设SQL Server(您没有准确指定您正在使用的系统):

如果您为几乎每个查询指定这三个项目(RevenueCentreID,DateOfSale,MediaItemID),那么这三个项目上的单个索引(如果您始终指定所有三个,或三个中相同的两个)将比三个更好单一指数。

顺序必须是这样,字段的选择全部为三,或左边的两个,或左边的单个:

(RevenueCentreID, DateOfSale, MediaItemID)
(RevenueCentreID, DateOfSale)
(RevenueCentreID)

如果按此顺序创建索引(RevenueCentreID,DateOfSale,MediaItemID),如果您经常查询(RevenueCentreID,MediaItemID),则不会使用它(当您指定时,中间不能删除列中的列一个WHERE子句)。

维护一个将在大多数时间使用的单个索引比拥有三个单独的索引更好 - 它只是更多的开销。

马克

答案 1 :(得分:0)

一个好的经验法则是索引您执行连接的每一列,以及您执行查询的每一列。