我有两个完全相同的数据库,一个在sql server 2014上,另一个在2017上。在使用smo查询所有表和列时,我得到的性能差别很大。在profiler运行时查看它,我注意到在2017年,它向sys.periods添加了一个额外的连接,这可以从下面两个版本生成的sql中看到:
sql server 2017:
exec sp_executesql N'SELECT
clmns.column_id AS [ID],
clmns.name AS [Name]
FROM
sys.tables AS tbl
LEFT OUTER JOIN
sys.periods as periods ON periods.object_id = tbl.object_id
LEFT OUTER JOIN
sys.tables as historyTable ON historyTable.object_id = tbl.history_table_id
INNER JOIN
sys.all_columns AS clmns ON clmns.object_id=tbl.object_id
WHERE
(tbl.name = @_msparam_0
AND SCHEMA_NAME(tbl.schema_id) = @_msparam_1)
ORDER BY
[ID] ASC',
N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000)',
@_msparam_0=N'ExampleTable',@_msparam_1=N'ExampleSchema'
sql server 2014:
EXEC sp_executesql N'SELECT
clmns.column_id AS [ID],
clmns.name AS [Name]
FROM
sys.tables AS tbl
INNER JOIN sys.all_columns AS clmns ON clmns.object_id=tbl.object_id
WHERE
(tbl.name=@_msparam_0 and SCHEMA_NAME(tbl.schema_id)=@_msparam_1)
ORDER BY
[ID] ASC',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000)',@_msparam_0=N'ExampleTable',@_msparam_1=N'ExampleSchema'
我的理解是2016增加了时态表,这就是为什么它加入到 sys.periods
. 但是,每个查询的持续时间都从0毫秒跳到80毫秒,这大大增加了总体运行时间。
我的问题是,有没有一种方法可以对抗这种巨大的性能冲击,或者有效地告诉smo不要关心时态表,而是像2014年那样生成sql?时态表不是我正在使用的东西,所以如果可以的话,我不介意关闭它。
凯文
暂无答案!
目前还没有任何答案,快来回答吧!