Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 必须在一个表上重建两次索引_Sql Server 2005_Indexing - Fatal编程技术网

Sql server 2005 必须在一个表上重建两次索引

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

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

我已经检查过,在索引重建之后,表中没有其他主要的数据更改。你知道还有什么可能导致这种行为吗

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

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中