我在SQL Server 2005上的一个非常小的表(< 10行,5列)上运行一个非常简单的查询,通常它会立即返回结果,但有时需要很长时间才能完成(比如5-10s)。我知道,我们的服务器负载很重,这可能是原因(因为我认为它不会因锁而发生 - 没有人写入该表) - 但我需要以某种方式找到瓶颈。
有关如何找到确切的服务器资源的任何建议,这使得如此简单的查询运行这么久?
答案 0 :(得分:6)
在SSMS中右键单击对象资源管理器中的连接服务器,然后选择“活动监视器”。
在那里,您可以看到最近的昂贵查询和其他性能数据。
答案 1 :(得分:4)
除了运行探查器以及同时检查page life expectancy
和buffer cache hit ratio
之外,请参阅:Use sys.dm_os_performance_counters to get your Buffer cache hit ratio and Page life expectancy counters
它也可能(但你必须测试)发生的是你正在寻找的数据被缓存在RAM中的缓存中,现在它必须从磁盘中获取它并且这将花费更长的时间,当你稍后再次运行它会再次快速
您可以通过在
上运行统计信息来检查SET STATISTICS IO ON
select * ..your query
你应该看到类似的东西
表'TableNAme'。扫描计数1,逻辑读取4,物理读取2
如果您看到physical reads
高于0,则会从磁盘中抓取它
你可以验证这一点(不在生产中)
从RAM中删除数据
DBCC freeproccache
DBCC DROPcleanbuffers
现在当你运行两次查询时,你会看到类似的东西,第一次运行将来自磁盘,第二次运行来自RAM
表'TableNAme'。扫描计数1,逻辑读取4,物理读取2
表'TableNAme'。扫描计数1,逻辑读取4,物理读取0
答案 2 :(得分:2)
您唯一需要的是分析。您需要了解内存,输入/输出和处理器。您需要知道这3个中的哪个导致服务器速度变慢。有很多产品可以做到这一点(甚至还有一个安装了Windows的性能监视器。)
不要“思考”它,你需要查看数据才能理解根本问题。
答案 3 :(得分:1)
您无需写入表格即可锁定它。您可以尝试修改其中一个SELECT语句以使用WITH (NOLOCK)
另一个语句(插入/更新/删除)非常慢并且连接到此表可能会锁定它。