在我提供更多细节之前,我不确定是否存在一般性答案。
例如:我有一个名为vw_View
我尝试了以下两个查询来获得结果:
在主数据库 select * From [test].[dbo].[vw_View]
在测试数据库 select * From [dbo].[vw_View]
有人可以告诉我为什么查询同一个查询但来自master
数据库的速度比查询来自其他数据库慢得多,我甚至尝试了其他数据:
Use [db] --any other databases not master database
select * From [test].[dbo].[vw_View]
我已经检查了实际的执行计划,但是由于我已经在[test].[dbo].[vw_View]
master
,因此它会发生变化
出于好奇,提前谢谢。
答案 0 :(得分:2)
注意这可能不是答案,但无论如何,评论的文字太多......
我们听到的很多事情是开发人员抱怨运行缓慢的过程,当从应用程序调用时运行速度很慢但从SSMS执行时运行正常。
通常情况下,由于执行设置的不同,这取决于调用过程的位置。要检查这些设置是否存在差异,我通常使用SQL事件探查器。
在您的情况下,您可以在Master
数据库的上下文中打开SSMS中的两个不同的窗口,而在User Database
的上下文中打开另一个窗口并运行SQL事件探查器,第一个事件探查器将捕获,将是Event Class = Existing Connections
和Text Data = -- network protocol: LPC.....
。
此记录将显示执行命令的每个会话的所有默认设置。设置看起来像......
-- network protocol: LPC
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed
现在比较两个会话的设置,看看有什么不同。
探查器还有一列SIPD
,可帮助您确定哪个窗口是哪个窗口。我很确定答案就在那里的某个地方。
答案 1 :(得分:1)
存在相同的问题-从master
执行视图无限长,但是“在此服务器上的任何其他用户数据库下”执行同一视图仅需8秒钟。
我有一个环境,我们刚刚迁移到SQL Server 2017,并且“所有其他数据库”的兼容性级别= 2008(或2012)
所以我做了一些测试:
我们注意到有关查询本身的最后一件事-查询使用的是CHARINDEX
函数,如果我将其注释掉,则两个兼容级别的查询平均执行8秒钟。
所以...看来在兼容性级别= 2017的情况下,在旧数据库上执行CHARINDEX
函数存在一个混合问题。
解决方案是(如果可以这样称呼...)-在(相同)旧版执行上下文下执行旧版查询。