如何调试慢速SQL Server查询?

问题描述 投票:0回答:4

我正在SQL Server中执行一个查询,如下所示:

select MAX(id) as id  FROM Employee where  CONVERT(date,submitted_dt)='2015-07-15' group by EmpId

这里Id是不同的列和Empid是不同的列,Id是具有身份的主键

结果如下:

1720152
1719253
1719676
1719890
1718425
1719440
1718431
1719408
1719461
1717679
..
..
1719532
1719583
1719386
1720200
1720160
1720182
1718967
1720232
1720113

它大约有185行,我在结果查询中执行NOT IN语句

    select  EmpId,submitted_dt  
FROM Employee 
where id NOT IN 
(select MAX(id) as id  FROM Employee where     
CONVERT(date,submitted_dt)='2015-07-15' 
group by EmpId) and CONVERT(date,submitted_dt)='2015-07-15'

运行速度非常慢,需要2分钟。

sql sql-server
4个回答
1
投票

您似乎希望在特定提交日期找到具有多个ID的员工。这是另一种方法

select e.EmpId, e.submitted_dt  
from (select e.EmpId, e.submitted_dt,
             max(id) over (partition by EmpId) as maxid
      from Employee e
      where CONVERT(date, submitted_dt) = '2015-07-15'
     ) e
where id <> maxid;

为了表现,建议在Employee(submitted_dt, EmpId, id)的索引中。


0
投票

如果它是第二个查询需要很长时间,并且您只是在寻找不是MAX(id)的id,那么您可以使用exists来排除这些值,而不是NOT IN,这通常会减慢您的查询速度:

select  EmpId,submitted_dt  
FROM Employee E1
where EXISTS
(select 1 FROM Employee E2 where     
CONVERT(date,submitted_dt)='2015-07-15' 
and E2.id > E1.id ) 
and CONVERT(date,submitted_dt)='2015-07-15'

0
投票

submit_dt的数据类型是什么?如果是日期,则无需转换。如果不是约会,为什么不呢?

现在的方式是,字符串'2015-07-15'必须转换为Employee表中每一行的日期。首先将其推入变量。这应该是一个好的开始。如果它仍然很慢,那么尝试获取解释计划,看看哪个部分最贵。如果你可以分享它,它将有助于解决更多问题。

declare @submitted_dt datetime = '2015-07-15';
select
  EmpId
 ,submitted_dt  
FROM
  Employee 
where id NOT IN (
  select MAX(id) as id
  FROM Employee
  where submitted_dt = @yesterday
  group by EmpId
  )
  and submitted_dt = @yesterday

0
投票

你可能错过了EmpIdsubmitted_dt列的索引。

CONVERT(date, submitted_dt) = '2015-07-15'将使该列上的任何索引无效,将“2015-07-15”转换为列的类型(日期)以使比较更有效。

查看查询计划,看看你还缺少什么。

© www.soinside.com 2019 - 2024. All rights reserved.