gpt4 book ai didi

indexing - 覆盖索引或单个索引

转载 作者:行者123 更新时间:2023-12-04 07:05:33 25 4
gpt4 key购买 nike

我们有一个 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

任何建议,将不胜感激…

最佳答案

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

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

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

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

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

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

马克

关于indexing - 覆盖索引或单个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1159994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com