从视图填充或创建表的 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 过程 - 性能问题的主要内容,如果未能解决你的问题,请参考以下文章

创建返回具有复杂 SQL 的表的 Oracle 视图或过程,是不是可能以及如何?

用ASP调用SQL Server的视图和存储过程

用于截断和重新填充表的 PLSQL 过程

sql server 删除表及表的相关视图存储过程方法

从脚本文件夹创建或调整 SQL Server 数据库

创建一个组合两个表的视图 ms sql server 2014