创建索引以加速SQL Server

时间:2016-10-30 21:58:01

标签: sql-server sql-server-2008

本周我参加了一次SQL评估测试。具体而言,这个问题是我不理解的问题,因为我还不熟悉聚簇的非聚集索引。

下面的SQL服务器表用于管理公司的产品购买。该表包含1700万行。以下哪些SQL语句可用于创建索引,以计算给定数据的总购买量,将运行最短的时间

CREATE TABLE [Production].[TransactionHistory]
(
    [TransactionID][int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
    [ProductionID][int] NOT NULL,
    [TransactionType][nchar](1) NOT NULL,
    [Quantity][int] NOT NULL,
    [ActualCost][money] NOT NULL,
    [ProductionDate][dateTime] NOT NULL,
)

以下哪些查询可以在最短的处理时间内返回数​​据?这将使我很好地理解索引如何工作。此问题中可以有最多3个有效答案。在此先感谢,我感谢您的帮助。

选项1

CREATE COVERING INDEX IX_TranHistory_Covered 
  ON [Production].[TransactionHistory]
    (
        [ProductionDate] ASC,
        [ActualCost] ASC,
        [Quantity] ASC
    );

选项2

CREATE NONCLUSTERED INDEX IX_TranHistory_Covered 
   ON [Production].[TransactionHistory]
      (
        [ActualCost] ASC,
        [ProductionDate] ASC,
        [Quantity] ASC
      );

选项3

CREATE NONCLUSTERED INDEX IX_TranHistory_Covered 
   ON [Production].[TransactionHistory]
    (
        [Quantity]
    )
    INCLUDE
    (
        [ProductionDate],
        [ActualCost]
    );

选项4

CREATE NONCLUSTERED INDEX IX_TranHistory_Covered 
  ON [Production].[TransactionHistory]
    (
        [ProductionDate]
    )
    INCLUDE
    (
        [ActualCost] ASC,
        [Quantity] ASC
    );

最后一个选项

CREATE INDEX IX_TranHistory_Covered 
    ON [Production].[TransactionHistory]
    (
        [ActualCost] ASC,
        [Quantity] ASC,
        [ProductionDate] ASC
    );

1 个答案:

答案 0 :(得分:2)

你想要选项4.密钥(生产日期)将引发索引搜索,并且通过创建覆盖索引,满足查询所需的信息就在索引树中,SQL Server不必将整行检索到计算结果。你不想要' asc'在索引的包含部分。