【问题标题】:Select into taking lot of time in SQL server选择在 SQL server 中花费大量时间
【发布时间】:2017-02-06 07:26:13
【问题描述】:

我正在尝试在 SQL Server 中运行以下查询,但运行大约需要 1 小时。表“dbo.AccessControl”有大约 300 万条记录,“dbo.username”表有 3.5k 条记录。有什么方法可以优化这个查询,因为我认为一个左连接不应该花费这么多时间来处理 300 万条记录。

select isd.*,ac.username1+','+ac.Username2+','+ac.Username3 as UserName 
into dbo.username
from dbo.details isd
left outer join dbo.AccessControl ac
on isd.LocationId=ac.LocationId
and isd.DepartmentId=ac.DepartmentId
and isd.productId=ac.productId;

【问题讨论】:

  • 尝试与(一个或多个(即三个))反连接联合的内部连接。我见过很多例子,内连接立即完成,而左连接需要 ~forever。
  • 请发布执行计划。您在连接列上有索引吗?它们被使用了吗?计划中的估计行数是多少?毕竟,您的查询可能会导致 3M * 3.5 行。 为什么您要尝试使用所有这些数据创建一个新表?
  • 您是否在查询执行时检查了活动监视器?这将显示是否有任何锁定或 IO 问题,甚至显示查询的执行计划
  • 请发布执行计划。这是唯一会显示的内容,例如,如果使用索引或使用 tempdb,因为没有足够的索引

标签: sql-server


【解决方案1】:

有什么办法可以优化这个查询,因为我认为一个左连接不应该花费这么多时间来处理 300 万条记录。

在您的情况下,我认为可能存在某种锁定、阻塞导致此查询运行这么长时间,或者您可能不得不遇到某种瓶颈..

要找出为什么您的查询运行这么长时间...在单独的窗口中运行下面的查询(您也可以使用活动监视器来显示相同​​)

select   status,command,blocking_session_id,wait_type,last_Wait_type
from sys.dm_exec_requests where session_id=<<select into sessionid>>

这应该会给你一个关于正在发生的事情的线索..

如果你在一个版本> SQL2014,你可以通过以下步骤了解查询的实时状态

    Set statistics profile on
   your query

然后在单独的窗口中运行下面的查询

select * from sys.dm_exec_query_profiles
 where session_id=your session id

【讨论】:

  • SSMS 的活动监视器可以显示所有 SQL Server 版本的此信息。由于缺少索引,可能是锁定、IO 或 tempdb 溢出
猜你喜欢
  • 1970-01-01
  • 2017-04-09
  • 1970-01-01
  • 2018-01-10
  • 2019-03-02
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多