代码之家  ›  专栏  ›  技术社区  ›  StepUp

为什么使用比较运算符时索引扫描而不是查找

  •  0
  • StepUp  · 技术社区  · 6 年前

    有一张桌子 Sales.SalesOrderDetail 在数据库中 AdventureWorks2014 .

    我有两个问题:

    --Query 1 uses index IX_SalesOrderDetail_ProductID
    SELECT
    sod.SalesOrderID
    FROM Sales.SalesOrderDetail sod
    WHERE sod.SalesOrderID = 1
    

    以及:

    --Query 2 uses index PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID
    SELECT
    sod.SalesOrderID
    FROM Sales.SalesOrderDetail sod
    WHERE sod.SalesOrderID > 1
    

    enter image description here

    The query plan at Brentozar.com can be seen here.

    CREATE NONCLUSTERED INDEX [IX_SalesOrderDetail_ProductID] ON [Sales]. 
    [SalesOrderDetail]
    (
        [ProductID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
        DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
        ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    

    ALTER TABLE [Sales].[SalesOrderDetail] ADD  CONSTRAINT 
    [PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID] PRIMARY KEY CLUSTERED 
    (
        [SalesOrderID] ASC,
        [SalesOrderDetailID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, 
    IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, 
        ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    

    我的问题是为什么查询优化器更喜欢另一个索引 PK_SalesOrderDetail_SalesOrderID_SalesOrderDetailID 而不是 IX_SalesOrderDetail_ProductID

    1 回复  |  直到 6 年前
        1
  •  3
  •   Aaron Bertrand    6 年前

    嗯,我是说,你在选择 全部的 排成一排(除了一排)。这里的搜索和扫描没有什么区别。SQLServer选择对最瘦的索引执行一次扫描,而不是执行80000次搜索(或者不管表中有多少个订单)。

    希望