从视图填充或创建表的 SQL Server 过程 - 性能问题
Posted
技术标签:
【中文标题】从视图填充或创建表的 SQL Server 过程 - 性能问题【英文标题】:SQL Server procedure to populate or create tables from views - performance issues 【发布时间】:2016-11-22 16:30:57 【问题描述】:我编写了以下代码来从我的数据库中的所有相应视图 (v_
) 填充/创建表 (t_
)。我将以前的脚本从使用光标转换为提高运行速度。我还能做些什么来让它表现得更好吗?
感谢任何帮助。
请看我的代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[P_populate_tables_from_views]
@dropTables BIT
AS
DECLARE @viewName NVARCHAR(100);
DECLARE @formattedTableName NVARCHAR(100);
DECLARE @dropTableSql NVARCHAR(MAX);
DECLARE @viewId int
SET @viewId = (SELECT MIN(object_id) FROM sys.views)
WHILE @viewId IS NOT NULL
BEGIN
SET @viewName = (SELECT name FROM sys.views WHERE object_id = @viewId)
PRINT 'Time: ' + CONVERT(varchar, SYSDATETIME(), 121)
PRINT('Processing ' + @viewName)
SET @formattedTableName = REPLACE(@viewName,'v_','t_');
IF @dropTables = 1
BEGIN
SET @dropTableSql = 'IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '''+@formattedTableName+''')) DROP TABLE '+@formattedTableName
EXEC (@dropTableSql);
END
IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @formattedTableName))
BEGIN
EXEC('TRUNCATE TABLE '+@formattedTableName)
EXEC('INSERT INTO '+@formattedTableName +' SELECT * FROM '+ @viewName)
END
ELSE
BEGIN
EXEC ('SELECT * INTO '+@formattedTableName+' FROM '+@viewName);
END
SET @viewId = (SELECT MIN(object_id)
FROM sys.views
WHERE object_id > @viewId)
END
【问题讨论】:
可能想在 codereview.stackexchange.com 上发布这个 @scsimon 会感谢您的建议 只是好奇,你研究过物化视图吗? 我会质疑你为什么要这样做?如果它是为了执行使用视图的正在进行的查询(通过将它们指向表而不是),您可能需要查看索引视图。这些是物化的(即保存到磁盘),因此可能会给您带来相同的好处和更多好处,即无需进行此快照,并且它们将不断更新而不是快照。但我不知道你的原因,这可能不合适。 您应该按照@scsimon 的说明将其移至 codereview.stachexchange.com。 【参考方案1】:-
将@sql 声明为 nvarchar(max)=''
选择 @sql = @sql + '
如果存在(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = [' + REPLACE(name,'v_','t_') + '])
开始
截断表 [' + REPLACE(name,'v_','t_') + ']
INSERT INTO ' + REPLACE(name,'v_','t_') + ' SELECT * FROM ' + name + '
结束
否则
SELECT * INTO ' + REPLACE(name,'v_','t_') + ' FROM ' + name + char(10)
来自 sys.views
打印@sql
exec(@sql)
【讨论】:
以上是关于从视图填充或创建表的 SQL Server 过程 - 性能问题的主要内容,如果未能解决你的问题,请参考以下文章