我有SQL Server 2016。我有两张结构相同的表,一张包含历史数据,另一张包含当前数据。
我有一个程序使用的视图,它返回两个表的内容。
CREATE TABLE A (int Id IDENTITY(1,1) NOT NULL, othercolumns, primary key, ect.)
CREATE TABLE B (int Id NOT NULL, othercolumns, primary key, ect.)
CREATE VIEW MyView AS SELECT * FROM A UNION ALL SELECT * FROM B
CREATE TRIGGER TR_INSTEADOFINSERT_ON_MyView on MyView
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO A (columns)
SELECT data
FROM inserted
END
我想知道每次在视图中完成插入时是否会重新创建视图。因为如果我检查 sys.dm_exec_sessions 和 sys.db_exec_requests,我总是会在查询文本中看到“CREATE TRIGGER TR_INSTEADOFINSERT”被执行。
现在我知道这需要很长时间,因为它是一张大桌子,而且我在服务器上有很多活动。但我只是想知道为什么我一直在正在执行的查询的 sql_text 中看到“CREATE TRIGGER”?是否重新创建?最有效的方法是什么?我应该修改程序以在插入时直接引用表格吗?
不会重新创建触发器。sys.db_exec_requests 中的 sql_text 处于批处理级别,而不是查询级别。参见例如
https://blogs.msdn.microsoft.com/dbrowne/2013/01/18/my-favorite-query-for-investigating-sql-server-performance/
有关如何从较大的批处理中解析出当前运行的查询的示例。
等待是获取该行写入的页面,在聚集索引或某些非聚集索引上。所以我会查看表的索引设计,看看是否应该针对插入进行更好的优化。