在master数据库下查询视图比在特定数据库下直接查询要慢得多

时间:2017-01-09 17:12:42

标签: sql sql-server database sql-server-2014

在我提供更多细节之前,我不确定是否存在一般性答案。

例如:我有一个名为vw_View

的视图

我尝试了以下两个查询来获得结果:

  1. 在主数据库 select * From [test].[dbo].[vw_View]

  2. 在测试数据库 select * From [dbo].[vw_View]

  3. 有人可以告诉我为什么查询同一个查询但来自master数据库的速度比查询来自其他数据库慢得多,我甚至尝试了其他数据:

    Use [db]    --any other databases not master database
    select * From [test].[dbo].[vw_View]
    

    我已经检查了实际的执行计划,但是由于我已经在[test].[dbo].[vw_View]

    下指定了master,因此它会发生变化

    出于好奇,提前谢谢。

2 个答案:

答案 0 :(得分:2)

注意这可能不是答案,但无论如何,评论的文字太多......

我们听到的很多事情是开发人员抱怨运行缓慢的过程,当从应用程序调用时运行速度很慢但从SSMS执行时运行正常。

通常情况下,由于执行设置的不同,这取决于调用过程的位置。要检查这些设置是否存在差异,我通常使用SQL事件探查器。

在您的情况下,您可以在Master数据库的上下文中打开SSMS中的两个不同的窗口,而在User Database的上下文中打开另一个窗口并运行SQL事件探查器,第一个事件探查器将捕获,将是Event Class = Existing ConnectionsText 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)

所以我做了一些测试:

  1. 如果我创建一个默认兼容级别= 2017的新数据库并运行查询,它将无限长地执行
  2. 如果我将“兼容级别”更改为2008,然后重新连接-8秒
  3. 如果我将“兼容级别”更改回2017年-再次长期运行

我们注意到有关查询本身的最后一件事-查询使用的是CHARINDEX函数,如果我将其注释掉,则两个兼容级别的查询平均执行8秒钟。

所以...看来在兼容性级别= 2017的情况下,在旧数据库上执行CHARINDEX函数存在一个混合问题。

解决方案是(如果可以这样称呼...)-在(相同)旧版执行上下文下执行旧版查询。