【问题标题】:Covering Index or individual indexes覆盖指数或个别指数
【发布时间】:2009-07-21 15:36:08
【问题描述】:

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

我们的大多数查询将针对特定媒体项目的日期范围选择收入中心。我们几乎从不使用 SaleTypeID。

在 RevenueCentreID、DateOfSale、MediaItemID 上创建索引还是在这三列上创建覆盖索引会更好吗?

RevenueCentreID 和 RevenueCentreID 分别是 RevenueCentres 表和 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

任何建议将不胜感激......

【问题讨论】:

    标签: indexing


    【解决方案1】:

    假设 SQL Server(您没有具体说明您使用的是什么系统):

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

    顺序必须使得字段的选择是全部三个,或者左边的两个,或者左边的一个:

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

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

    维护一个大部分时间都会使用的索引比拥有三个独立的索引要好 - 只是开销更大。

    马克

    【讨论】:

    • 抱歉,是的,它是 SQL Server 2005。如果出于争论的原因,我在 RevenueCentreID 和 DateOfSale 上有一个单独的索引,是否有可能知道 SQL Server 会做什么。我运行一个仅使用 RevenueCentreID 和 DateOfSale 的查询。它会选择一个索引,比如RevenueCentreID,找到RevenueCentres,然后移动到主键以获取日期,反之亦然。或者,它是否会使用第一个索引来获取 RevenueCentres,然后使用第二个索引来获取日期,然后移动到主键。或者我猜它甚至可以只使用主键。
    • 当您打开“查询/包括实际执行计划”选项并运行有问题的查询时,您可以在 SQL Server Mgmt Studio 中看到 SQL Server 正在做什么。它会准确显示正在使用(或忽略)的索引
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      • 1970-01-01
      相关资源
      最近更新 更多