代码之家  ›  专栏  ›  技术社区  ›  Timothy Khouri

SQL索引问题:为什么SQL Server更喜欢非聚集索引而不是聚集索引?

  •  3
  • Timothy Khouri  · 技术社区  · 16 年前

    我有以下问题:

    SELECT
        COUNT(*)
    FROM
        FirstTable ft
            INNER JOIN SecondTable st ON ft.STID = st.STID
    

    你可以猜到,“stid”是“secondtable”上的主键…“FirstTable”将有一个指向第二个表的指针。以下是我的索引:

    第一个表:“stid”列上的非聚集索引

    SecondTable: CLUSTERED PRIMARY KEY “STID”索引

    上面的查询给出了 19.90秒 .

    在为该查询运行数据库优化顾问之后,他们建议 和第二张桌子上的索引一样…但不是聚集的。 所以我用这些结果来尝试。

    第一个表:“stid”列上的非聚集索引

    SecondTable: NONCLUSTERED “STID”索引

    现在,上面的查询给出了 10.97秒 !

    这100%粉碎了我的大脑…在这种情况下,为什么非聚集索引的执行速度要比聚集索引快?

    1 回复  |  直到 16 年前
        1
  •  7
  •   Quassnoi    16 年前

    因为查询不从表中检索任何实际记录,所以它只是计数。

    对于非聚集索引,它只使用 MERGE JOIN .

    对于聚集索引,它必须联接表和非聚集索引。桌子比较大,横穿桌子需要更多的时间。

    如果发出这样的查询:

    SELECT  SUM(first_table_field + second_table_field)
    FROM    FirstTable ft
    INNER JOIN
            SecondTable st
    ON      ft.STID = st.STID
    

    它检索实际值,您将看到集群的好处。