Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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 在多个数据库中为同一表编制索引_Sql_Sql Server_Indexing - Fatal编程技术网

Sql 在多个数据库中为同一表编制索引

Sql 在多个数据库中为同一表编制索引,sql,sql-server,indexing,Sql,Sql Server,Indexing,我有将近150个数据库和所有相同的表。我知道这很糟糕,但我无法控制。我试图通过一些索引来提高性能。我知道索引应该是什么,但我需要在每个数据库的相同表上构建它们。有没有办法做到这一点呢?我之前也遇到过类似的情况,所以我想出了这段代码。您可以将动态SQL与spmsforeachdb一起使用,在数据库中循环。我已经排除了下面的系统数据库,但是您可以在第一个IF中根据需要包括/排除数据库 这段代码将检查每个数据库中的特定表,并检查该表上是否已经存在该索引。如果不是,它就会创建它。我包含了一个RAISER

我有将近150个数据库和所有相同的表。我知道这很糟糕,但我无法控制。我试图通过一些索引来提高性能。我知道索引应该是什么,但我需要在每个数据库的相同表上构建它们。有没有办法做到这一点呢?

我之前也遇到过类似的情况,所以我想出了这段代码。您可以将动态SQL与spmsforeachdb一起使用,在数据库中循环。我已经排除了下面的系统数据库,但是您可以在第一个
IF
中根据需要包括/排除数据库

这段代码将检查每个数据库中的特定表,并检查该表上是否已经存在该索引。如果不是,它就会创建它。我包含了一个
RAISERROR
,以在SSMS消息中显示数据库的进度。只需更改下面的表/索引名称,并根据需要更新
createindex
语句

DECLARE @command varchar(1000) 
SELECT @command = 'IF ''?'' NOT IN(''master'', ''model'', ''msdb'', ''tempdb'') 

    BEGIN USE ? 
       EXEC(''
   
           DECLARE @DB VARCHAR(200)
           SET @DB = DB_NAME()
           RAISERROR (@DB, 10, 1) WITH NOWAIT

           IF OBJECT_ID(''''dbo.TableName'''', ''''U'''') IS NOT NULL
           BEGIN
               IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name=''''IX_TableName'''' AND object_id = OBJECT_ID(''''TableName''''))
               BEGIN
                    CREATE INDEX [IX_TableName] ON TableName (indexColumn)
               END
           END

       '') END' 

EXEC sp_MSforeachdb @command 

创建用于创建索引的脚本,并使用类似于sp_msforeachdb的过程在所有数据库中运行它。这是否回答了您的问题?