2015-08-21 90 views
0

我執行SQL Server中下面的查詢:如何調試慢速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分鐘。

+1

什麼是查詢的等待事件? 首先您可以嘗試刪除以下條件: CONVERT(date,submitted_dt)='2015-07-15' 表/索引中每一行的轉換操作都非常昂貴 – Giova

+0

哪個查詢花費時間?第一還是第二呢? –

+0

爲什麼標記mysql? – lad2025

回答

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

如果您可以將提交日期的數據類型更改爲有用的日期。如果它被存儲爲日期時間,則可以考慮使用submitted_dt> ='2015-07-15'和submitted_dt <'2015-07-16',而不是轉換所有日期。 – HLGEM

+1

@HLGEM。 。 。我試圖記住SQL Server *不會使用索引來轉換從datetime到date的轉換。我通常會推薦你在評論中使用的表單(因爲這對更多的數據庫來說是可靠的),但是在這種情況下,我實際上是故意保留它的。 –

+0

@GordonLinoff - 我對這個功能很感興趣,你有鏈接嗎?我正在設法找到的唯一東西是關於功能的較老的一般建議。 –

0

你可能會丟失在列EmpIdsubmitted_dt一個指標。

CONVERT(date, submitted_dt) = '2015-07-15'將使此列上的任何索引無用,將'2015-07-15'轉換爲列(日期)的類型以使比較更有效。

看看查詢計劃,看看你還缺少什麼。

0

什麼數據類型submit_dt?如果是日期,則不需要轉換。如果不是約會,那爲什麼不呢?

,現在是這樣的,字符串「2015年7月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

如果是長時間在第二個查詢,而你只是在尋找ID的未在MAX(ID),您可以使用一個存在排除這些值,而不是都不在了,這通常可以減慢查詢速度:

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'