Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 增加由“返回的行”;选择top";突然使查询速度慢得令人难以置信_Sql_Sql Server_Performance - Fatal编程技术网

Sql 增加由“返回的行”;选择top";突然使查询速度慢得令人难以置信

Sql 增加由“返回的行”;选择top";突然使查询速度慢得令人难以置信,sql,sql-server,performance,Sql,Sql Server,Performance,在手动取消之前,已运行约2分钟的负载突然变为90分钟的运行 这是一个简单的阴影查询: select fields into shadow_table from table where date = '8/23/2011' date上有一个非聚集索引 如果我将查询更改为select Top300000只需2秒钟即可完成 Top400000只需3分钟即可运行 Top500000我等得很无聊,所以取消了 我们的服务器团队在运行时显示了大量的自阻塞 有人能提出可能的瓶颈问题吗?遵循经验证的方法来识

在手动取消之前,已运行约2分钟的负载突然变为90分钟的运行

这是一个简单的阴影查询:

select fields
into shadow_table
from table
where date = '8/23/2011'
date
上有一个非聚集索引

如果我将查询更改为select

  • Top300000
    只需2秒钟即可完成
  • Top400000
    只需3分钟即可运行
  • Top500000
    我等得很无聊,所以取消了
我们的服务器团队在运行时显示了大量的自阻塞

有人能提出可能的瓶颈问题吗?

遵循经验证的方法来识别瓶颈

当请求运行并行查询时,分析阻塞的正确方法是深入子任务级别,查看是什么阻塞了每个子任务。永远不要在等待类型的
CXPACKET
处停止,也不要用“自阻塞”作为解释

select w.last_wait_type, 
    wt.wait_type, 
    wt.resource_description, 
    wt.blocking_session_id, 
    t.pending_io_count, 
    r.* 
from sys.dm_os_tasks t
left join sys.dm_os_waiting_tasks wt on wt.waiting_task_address = t.task_address
join sys.dm_os_workers w on t.worker_address = w.worker_address
join sys.dm_exec_requests r on t.session_id = r.session_id
where r.session_id = <queryspid>;
选择w.last\u wait\u类型,
wt.wait_类型,
wt.resource_说明,
wt.blocking_session_id,
t、 待统计,
r、 *
从sys.dm_os_tasks t
左连接sys.dm_os_waiting_tasks wt on wt.waiting_task_address=t.task_address
加入sys.dm_os_workers w on t.worker_address=w.worker_address
在t.session\u id=r.session\u id上加入sys.dm\u exec\u请求r
其中r.session_id=;

过时的统计数据。

自阻塞只在并行时发生,超长并行运行(与标准相比)通常意味着过时的统计数据。这也可能是数据基数的变化


第1步应该在源表上运行一个带有FULLSCAN的
更新统计信息

如果它看起来是一个存档查询,那么在运行时不会更新记录,您可以完全关闭阻塞。其他需要完整性但使用您的记录的查询不会受到影响-它们管理自己的锁定。

还要确保您的字段是非聚集索引include的一部分。如果不这样做,则必须使用RID查找返回表以获取该数据

create nonclustered index ix_whatever on YourTable (date) 
include (field1, field2, ...)

你能解释一下“自阻塞”是什么意思吗?它以spid 51的形式运行,并报告被spid 51阻塞。它是等待型的数据包吗?这不是一个块,您需要按照槽,看看子任务,看看他们在做什么。请参阅我更新的帖子。我们避免在大多数表上覆盖索引,因为性能是可以接受的。当它正常运行时,2分钟的加载时间就可以了。@JNK你是个救生员。