必须在表上重建索引两次

时间:2009-08-11 17:25:36

标签: sql-server-2005 indexing

我在SQL 2005数据库中有一个全新的表。作为我们的应用程序部署的一部分,我们加载了大约2.6M行的表。完成后,表中的索引都将重建。然后,用户进入系统并查询该表超时。然后我可以重建索引(使用导入后使用的完全相同的脚本),查询速度很快。

我检查了索引重建后表中没有其他主要数据更改。关于还有什么可能导致这种行为的任何想法?

以下是索引重建脚本的示例:

DROP INDEX dbo.My_Table.Index1
DROP INDEX dbo.My_Table.Index2

ALTER INDEX PK_My_Table ON dbo.My_Table REBUILD

CREATE NONCLUSTERED INDEX Index1 ON dbo.My_Table (column_1 ASC)
CREATE NONCLUSTERED INDEX Index2 ON dbo.My_Table (column_2 ASC)

6 个答案:

答案 0 :(得分:1)

我怀疑只是第一次添加索引不会重建统计信息。加载后尝试在表上执行DBCC DBREINDEX。您可能还想确保您拥有聚集索引。

答案 1 :(得分:1)

可能是统计数据,但不是指数

优化器将获取第一个查询的已更改行数/无统计信息。它决定重建/创建统计数据。

但是:可能存在与索引无关的列级统计信息。

第二次重建与统计目的无关,因为列统计信息已经存在,但它会强制执行计划被丢弃并重新评估

编辑:

SQLServerPedia

  

...不会触及列统计信息   索引重建过程...

答案 2 :(得分:1)

可能只需要很长时间才能完成索引。在第一次索引重建后你等了多久?

更新:我觉得它真的是一个周末的事情,这意味着索引在第一次就行不通。在那种情况下,除了到目前为止所说的内容之外,我没有任何建议。

答案 3 :(得分:1)

删除之前的索引,即可批量插入数据。这将允许更快地插入数据。在加载数据之前,还要禁用相关表上的任何触发器。

然后,添加索引。这可以避免您当前正在进行的不必要的冗余索引重建。

另外,正如一位用户已经指出的那样,使用DBCC DBREINDEX比使用DBCC DBREINDEX更有意义。重新添加索引。当然,您也可以update statistics

更新:由于不推荐使用DBCC DBREINDEX(命令,而不是概念),请使用ALTER INDEX和REBUILD选项。

答案 4 :(得分:0)

我认为导入过程中的某些内容会导致索引数据分布在许多数据页中。重建它们可以解决这个问题。

答案 5 :(得分:0)

我记得在某处读取SQL Server在创建索引时使用当前统计信息。如果统计信息已过期,则可以针对错误的案例优化正在创建的索引,并使结果效果不佳。

在创建索引之前,请尝试更新桌面上的统计信息。

BOL中的UPDATE STATISTICS条目表明可能发生这种情况:

  

数据库引擎保存有关每个索引中键值分布的统计信息,并使用这些统计信息来确定要在查询处理中使用的索引。用户可以使用CREATE STATISTICS语句在非索引列上创建统计信息。查询优化取决于分发步骤的准确性:

     
      
  • 如果索引中的键值发生重大变化,请在该索引上重新运行UPDATE STATISTICS。
  •   
  • 如果已添加,更改或删除索引列中的大量数据(即,如果键值的分布已更改),或者已使用TRUNCATE TABLE语句截断该表,然后重新填充,请使用更新统计数据。
  •   

由于您已将数百万行导入空表,我会说您已经遇到上述情况之一。