Sql server 2005 必须在一个表上重建两次索引
我在一个全新的SQL 2005数据库中有一个表。作为应用程序部署的一部分,我们加载了大约260万行的表。完成后,表上的索引都将重建。然后让用户进入系统并查询该表超时。然后我可以重建索引(使用导入后使用的相同脚本),查询速度非常快 我已经检查过,在索引重建之后,表中没有其他主要的数据更改。你知道还有什么可能导致这种行为吗 以下是索引重建脚本的示例:Sql server 2005 必须在一个表上重建两次索引,sql-server-2005,indexing,Sql Server 2005,Indexing,我在一个全新的SQL 2005数据库中有一个表。作为应用程序部署的一部分,我们加载了大约260万行的表。完成后,表上的索引都将重建。然后让用户进入系统并查询该表超时。然后我可以重建索引(使用导入后使用的相同脚本),查询速度非常快 我已经检查过,在索引重建之后,表中没有其他主要的数据更改。你知道还有什么可能导致这种行为吗 以下是索引重建脚本的示例: DROP INDEX dbo.My_Table.Index1 DROP INDEX dbo.My_Table.Index2 ALTER INDEX
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)
我假设导入过程中的某些内容导致索引数据跨多个数据页分发。重建它们可以解决这一问题。我假设导入过程中的某些情况会导致索引数据跨多个数据页分发。重建它们就解决了这个问题。我怀疑第一次简单地添加索引并不是重建统计数据。加载表后,尝试在表上执行DBCC DBREINDEX。您可能还希望确保您有一个聚集索引。我怀疑第一次添加索引并不能重建统计数据。加载表后,尝试在表上执行DBCC DBREINDEX。您可能还想确保您有一个聚集索引。可能是统计信息,但不是索引上的统计信息 优化程序将为第一次查询获取已更改行数/无统计数据。它决定重建/创建统计信息 但是:可能存在与索引不关联的列级统计信息 第二次重建与统计目的无关,因为列stats已经存在,但它会强制放弃并重新计算执行计划 编辑: : …列统计信息不受 索引重建过程
可能是统计数据,但不是索引 优化程序将为第一次查询获取已更改行数/无统计数据。它决定重建/创建统计信息 但是:可能存在与索引不关联的列级统计信息 第二次重建与统计目的无关,因为列stats已经存在,但它会强制放弃并重新计算执行计划 编辑: : …列统计信息不受 索引重建过程
也许只是需要很长时间才能完成索引。在第一次索引重建之后,您等待了多长时间
更新:我看这真的是周末的事情,这意味着索引在第一次就不能正常工作。在这种情况下,除了目前所说的之外,我没有任何建议。也许完成索引需要很长时间。在第一次索引重建之后,您等待了多长时间
更新:我看这真的是周末的事情,这意味着索引在第一次就不能正常工作。在这种情况下,除了到目前为止所说的之外,我没有任何建议。在大量插入数据之前删除索引。这样可以更快地插入数据。在加载数据之前,还要禁用相关表上的任何触发器 然后,添加索引。这避免了当前正在进行的不必要的冗余索引重建 另外,正如一位用户已经指出的,在删除和重新添加索引的基础上使用DBCC DBREINDEX更有意义。当然,你也可以
更新:由于DBCC DBREINDEX已被弃用(命令,而不是概念),请将ALTER INDEX与REBUILD选项一起使用。在批量插入数据之前,请先删除索引。这样可以更快地插入数据。在加载数据之前,还要禁用相关表上的任何触发器 然后,添加索引。这避免了当前正在进行的不必要的冗余索引重建 另外,正如一位用户已经指出的,在删除和重新添加索引的基础上使用DBCC DBREINDEX更有意义。当然,你也可以
更新:由于DBCC DBREINDEX已被弃用(命令,而不是概念),请将ALTER INDEX与REBUILD选项一起使用。我记得在某个地方读到,SQL Server在创建索引时使用了当前统计信息。如果统计数据已过时,则可以针对错误的情况对正在创建的索引进行优化,并给出性能较差的结果 在创建索引之前,请尝试更新表上的统计信息 BOL中的条目表示可能发生这种情况: 数据库引擎保存有关每个索引中键值分布的统计信息,并使用这些统计信息确定在查询处理中使用哪个或多个索引。用户可以使用CREATESTATISTICS语句在非索引列上创建统计信息。查询优化取决于分发步骤的准确性:
- 如果索引中的键值有重大更改,请重新运行该索引的更新统计信息
- 如果已添加、更改或删除索引列中的大量数据(即,如果键值的分布已更改),或者已使用TRUNCATE table语句截断表,然后重新填充,请使用UPDATE STATISTICS
由于您已将数百万行导入到一个空表中,因此我认为您遇到了上述情况之一。我记得在某个地方读到,SQL Server在创建索引时使用了当前统计信息。如果统计数据已过时,则可以针对错误的情况对正在创建的索引进行优化,并给出性能较差的结果 在创建索引之前,请尝试更新表上的统计信息 BOL中的条目表示可能发生这种情况: 数据库引擎将统计信息保存在abo中