重新创建索引将改善表现

时间:2016-04-21 05:50:34

标签: sql-server

我有几张表(基表),每周插入和更新两次。我很久就在这些表上创建了索引。

我在存储过程中(不带任何参数)在这些表的顶部应用逻辑并创建最终输出表。

我使用SQL Server代理作业每周安排两次此存储过程。

它现在运行缓慢(50分钟),而如果我手动运行存储过程,它运行得更快(15 - 18分钟)

在基表中发生插入或更新时是否必须删除索引,并在插入或更新后重新创建它?

如果是这样,我必须每周都这样做吗?

它对SQL Server代理作业的性能有何影响?

1 个答案:

答案 0 :(得分:0)

索引确实需要维护,但它们的执行速度完全取决于数据的更改量以及这些更改的排序方式。您可以浏览任意数量的脚本以检查索引碎片,以及如何对它们进行碎片整理。通常,即使对于较大的数据库,每周或每晚的维护也是绰绰有余。

无论如何,执行时间根据你的运行方式而有所不同,这指出了两个可能的原因:

参数化,或连接使用的SET属性。

如果您的过程使用参数但是您手动运行脚本并提供参数值,那么SQL Server确切地知道您正在使用哪些值,并且可以优化查询执行以使用正确的索引等。点。如果您的代理使用相同的参数调用该过程,则该过程会有所不同。 SQL Server可能不知道正在使用哪些值,因此它必须使用覆盖索引或更糟糕的是,甚至完全在表扫描(读取整个表中的所有数据,使索引无用)以确保它将找到所有查询的相关数据。 Google SQL Server参数化,您可以找到更多信息。

另一方面,set属性控制在通过Management Studio直接连接到数据库时自动应用的特定会话属性。但是当您使用代理作业时,情况可能并非如此。这也可能导致不同的计划,这将花费更多的时间。

这两种情况都取决于您的数据库设置和过程的工作方式。所以我们必须在这里猜测。

但通常,您需要在代理作业的脚本开头设置以下属性,以匹配常规Management Studio会话中使用的会话属性:

SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO

这里的所有条款都可以用Google搜索。我建议你这样做。这些文章可以比我的时间更好地解释这些事情,特别是考虑到 - 没有不尊重的意图 - 你对SQL Server相对较新。因此,在这里用合适的术语解释这些事情是很困难的。 :)