某些用户查询缓慢


11

我从C#.NET Web应用程序中调用了几个查询,这些查询对我来说总是很快的(我是SQL Server上的本地管理员),但是对于一组用户(具有所需权限的域组)而言,查询速度却非常慢它在应用程序中超时的点。

是什么导致完全相同的查询针对不同的用户运行不同?

更多信息:

  • 该查询是C#代码中的内联SQL,而不是存储过程
  • 该应用程序使用域身份验证,用户和我自己都可以通过该应用程序运行查询
  • 似乎问题出在不同的计划上,其中一个已被缓存,因此这对于不同的用户来说是不同的。某些因素正在影响缓存,因为现在通过应用程序查询对我来说很慢,而在SQL Server Management Studio中则很快。

2
检查以下问题。您可能会发现自己处于相同的情况。假设首先尝试这个另一个
玛丽安

3
慢速查询的等待类型(sys.dm_os_waiting_tasks)是什么,以及每种(您的快速,慢速)的实际执行计划是什么?
托马斯·斯金格

2
同意以前的评论。我的第一个想法就是参数嗅探。第一步是检查计划是否不同。
马丁·史密斯

4
如果参数相同(我假设这是的意思exact same query),则不应是参数嗅探(用户为错误的参数制定了错误的计划),而是用户为同一参数获得了不同的计划(s)。可能是由于诸如quoted_identifierand 的设置arithabort,您可以将它们sys.dm_exec_sessions与快速用户和慢速用户进行比较,或者可能是因为它们具有不同的默认架构,并且引用的对象没有架构前缀。仍然可能涉及参数嗅探(因此,为什么其中一个计划不好)。
亚伦·伯特兰

1
RE:您所做的编辑是否具有与其他用户相同的默认架构?您是否捕获了慢速运行和快速运行的执行计划?
马丁·史密斯,

Answers:


5

如果参数相同(我假设这是的意思exact same query),则不应是参数嗅探(用户为错误的参数制定了错误的计划),而是用户为同一参数获得了不同的计划(s)。可能是由于诸如quoted_identifierand 的设置arithabort,您可以将它们sys.dm_exec_sessions与快速用户和慢速用户进行比较,或者可能是因为它们具有不同的默认架构,并且引用的对象没有架构前缀。仍然可能涉及参数嗅探(因此,为什么其中一个计划不好)。


3

我已经看到了两个原因:1,参数嗅探2,连接设置不同。如果运行whoisactive,它将显示不同的连接属性。我实际上对此有一篇博客文章,但是我还没有从中清除公司特定的信息。(我也没有启用我的博客);)


0

尝试:在每个EXEC和表引用上指定架构。例如,EXEC dbo.MyProc

可能存在冲突(如马丁·史密斯(Martin Smith)所建议的-“相同的默认架构”?)或重新编译


0

这似乎是SQL Server中的错误。我在SQL Server 2008中遇到此错误。我尚未测试新版本。我可以以管理员身份登录并运行此查询,并在0秒内得到响应:

select ROUTINE_NAME from INFORMATION_SCHEMA.ROUTINES ORDER BY ROUTINE_NAME

然后,我以具有较少权限的用户身份登录,运行完全相同的查询,并且响应需要45秒钟。

这是一遍又一遍的。如果我在两个查询窗口之间来回跳动,一个用于管理员,一个用于非管理员,那么非管理员总是大约需要45秒,而管理员则需要0秒。


如对问题的评论中所问-两个用户是否具有相同的默认数据库,并且查询是否在同一数据库中执行?而且,您是否可以指出某种文档,指出这是一个错误,还是您的意见?并不是说您错了,只是在寻找轶事之外的东西。
RDFozz '18年

您在答案中发现的问题似乎在SQL Server 2008上无法重现。 select ROUTINE_NAME from INFORMATION_SCHEMA.ROUTINES ORDER BY ROUTINE_NAME对于根本没有明确授予权限的非SA登录,始终会立即返回数据。
Max Vernon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.