日期:2014-05-16  浏览次数:20537 次

SQL中视图刷新的机制
大家好。视图是SQL中常用的一个功能。假定现在通过表a ,表b,建立了一个双表关联查询的视图v.
现在有以下几个问题请高手解惑:
视图V是在什么时候更新呢?表a或表b更新的时候还是当视图v被调用时?
假定视图v时在被调用时才被更新,那么,它是只在第一次调用后更新还是每次调用都更新?
因为视图v会经常被调用,但表a和表b并发生更新,也就是说多次调用视图v时,SQL会不会采用什么机制监测视图v不会被频繁更新?

------解决方案--------------------
按我目前的使用情况,需要手动更新,可以看我的文章:
http://blog.csdn.net/dba_huangzj/article/details/8426684
------解决方案--------------------
IF OBJECT_ID('TEST') IS NOT NULL DROP TABLE TEST
GO
CREATE TABLE TEST(ID INT,VAL VARCHAR(50))
GO
INSERT INTO TEST
SELECT 1,'A'
GO
IF OBJECT_ID('V_TEST') IS NOT NULL DROP VIEW V_TEST
GO
CREATE VIEW V_TEST
AS
SELECT *
FROM TEST
GO
SELECT *
FROM V_TEST
GO
INSERT INTO TEST
SELECT 2,'B'
GO
SELECT *
FROM V_TEST
GO
ALTER TABLE TEST ADD VAL2 VARCHAR(50)
GO
SELECT *
FROM V_TEST
GO
INSERT INTO TEST
SELECT 3,'C','D'
GO
SELECT *
FROM V_TEST
GO
SELECT *
FROM SYS.COLUMNS
WHERE OBJECT_ID=OBJECT_ID('V_TEST')
GO
EXEC sp_refreshview V_TEST  
GO
SELECT *
FROM SYS.COLUMNS
WHERE OBJECT_ID=OBJECT_ID('V_TEST')

可以看到,DML操作都是实时处理的,但DDL操作却不会实时反映到查询上,就是因为MSSQL把视图的列缓存到了系统表里,只有当运行sp_refreshview时才会根据视图语句重新更新视图列。