【问题标题】:sql server procedure optimizationsql server 过程优化
【发布时间】:2010-04-04 23:48:30
【问题描述】:

SQL Server 2005:

选项:1

    CREATE TABLE #test
      (customerid, orderdate, field1 INT, field2 INT, field3 INT)

    CREATE UNIQUE CLUSTERED INDEX Idx1 ON #test(customerid)
    CREATE INDEX Idx2 ON #test(field1 DESC)
    CREATE INDEX Idx3 ON #test(field2 DESC)
    CREATE INDEX Idx4 ON #test(field3 DESC)

    INSERT INTO #test
      (customerid, orderdate, field1 INT, field2 INT, field3 INT)
    SELECT
      customerid, orderdate, field1, field2, field3 FROM 
    ATABLERETURNING4000000ROWS

compared to

选项:2

    CREATE TABLE #test
      (customerid, orderdate, field1 INT, field2 INT, field3 INT)

    INSERT INTO #test
      (customerid, orderdate, field1 INT, field2 INT, field3 INT)
    SELECT
      customerid, orderdate, field1, field2, field3 FROM 
    ATABLERETURNING4000000ROWS

    CREATE UNIQUE CLUSTERED INDEX Idx1 ON #test(customerid)
    CREATE INDEX Idx2 ON #test(field1 DESC)
    CREATE INDEX Idx3 ON #test(field2 DESC)
    CREATE INDEX Idx4 ON #test(field3 DESC)

当我们使用第二个选项时,它的运行速度快了近 50%。这是为什么呢?

【问题讨论】:

    标签: sql sql-server-2005 query-optimization


    【解决方案1】:

    来自SQL Server Query Processing Team:

    为了构建索引的 b 树,我们必须首先对源中的数据进行排序。流程是扫描源,对其进行排序(如果可能 - 在内存中*),然后根据排序构建 b-tree。
    为什么我们需要在构建 b-tree 之前先进行排序?理论上我们不必排序,我们可以使用常规 DML 并直接将数据插入到内置索引中(无需排序),但在这种情况下,我们将进行随机插入,随机插入 b-树需要首先在 b 树中搜索正确的叶节点,然后插入数据。虽然搜索 b-tree 相当快,但在每次插入之前这样做远非最佳。

    Your indexes are B+ trees.

    第一个查询需要在 B+ 树中查找每条记录,然后修改 B+ 树。

    第二个查询将根据特定索引依次对每个索引所需的数据进行排序,B+树为constructed very efficiently。

    【讨论】:

      【解决方案2】:

      因为您是在添加索引之前插入行。唯一索引要求系统对新添加的行执行唯一性检查,并且在插入时,系统必须更新各种索引条目。不必进行唯一性检查工作会更快,但如果存在重复的 customerId 值,您的索引创建将在第二个选项中失败。

      【讨论】:

      • 谢谢。实际上,我们在 ATABLERETURNING4000000ROWS 表上有一个按 customerid 分组的组,这将确保唯一性。
      • @stackoverflow:即使您删除唯一约束,第二个选项也会更快。我已经添加了一个关于原因的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-31
      相关资源
      最近更新 更多