我正在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分钟。
答案 0 :(得分: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)
中的索引。
答案 1 :(得分:0)
您可能缺少列EmpId
和submitted_dt
上的索引。
CONVERT(date, submitted_dt) = '2015-07-15'
会使此列上的任何索引无效,将“2015-07-15”转换为列的类型(日期)以使比较更有效。
查看查询计划,看看你还缺少什么。
答案 2 :(得分: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
答案 3 :(得分: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'