【发布时间】:2021-05-14 12:40:07
【问题描述】:
我有近 150 个数据库,其中包含所有相同的表。我知道这很糟糕,但我无法控制它。我正在尝试使用一些索引来提高性能。我知道索引应该是什么,但我需要在每个数据库的相同表上构建它们。除了单独创建它们之外,还有其他方法吗?
【问题讨论】:
-
创建用于创建索引的脚本并使用 sp_msforeachdb 程序在所有数据库中运行它。
标签: sql sql-server indexing
我有近 150 个数据库,其中包含所有相同的表。我知道这很糟糕,但我无法控制它。我正在尝试使用一些索引来提高性能。我知道索引应该是什么,但我需要在每个数据库的相同表上构建它们。除了单独创建它们之外,还有其他方法吗?
【问题讨论】:
标签: sql sql-server indexing
前段时间我也遇到过类似的情况,所以我想出了这段代码。您可以使用带有sp_MSforeachdb 的动态SQL 来循环访问您的数据库。我已经排除了下面的系统数据库,但您可以在第一个 IF 中随意包含/排除数据库。
此代码将检查您的特定表的每个数据库,并检查该表上是否已存在该索引。如果没有,它会创建它。我在 SSMS 消息中添加了一个 RAISERROR 以显示数据库的进度。只需更改下面的表/索引名称并根据您的需要更新 CREATE INDEX 语句。
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
【讨论】: