Sql-Server

如何優化和加快查詢

  • May 25, 2020

以下查詢永遠不會完成並執行超過 14 小時:

SELECT 
U.Age, U.CreationDate, U.DisplayName, 
P.AcceptedAnswerId, P.ClosedDate, p .Title, P.ViewCount,
C.CreationDate,C.Score ,C.UserId
FROM dbo.Users As U
LEFT JOIN dbo.Posts As P on U.id = P.id
LEFT JOIN dbo.Comments As C on U.id =C.id
WHERE
(
U.Location = 'India'
OR U.Location ='United Kingdom'
)
AND U.LastAccessDate>= '04/02/2018'
AND U.LastAccessDate< '06/02/2018'
AND P.LastActivityDate>= '04/02/2018'
AND P.LastActivityDate< '06/02/2018'
AND U.LastAccessDate>= '04/02/2018'
AND U.LastAccessDate< '06/02/2018'
AND U.Age>10
AND U.Age is NOT NULL

我怎樣才能改進和加快它?

我看到的最大問題是你的加入。您正在將使用者的“id”加入文章和評論的“id”。這基本上是說,獲取使用者中的每條記錄並將其加入文章中的每條記錄,然後將其加入評論中的每條記錄。

假設 UserID 作為 Posts 和 Comments 中的外鍵存在,下面的程式碼應該可以工作。如果沒有,您需要確定JOIN語句的正確外鍵。

SELECT 
   U.Age, 
   U.CreationDate, 
   U.DisplayName,
   P.AcceptedAnswerId, 
   P.ClosedDate, 
   P.Title, 
   P.ViewCount,
   C.CreationDate,
   C.Score,
   C.UserId
FROM 
   dbo.Users AS U
   LEFT OUTER JOIN dbo.Posts AS P 
       ON U.UserID = P.UserID
   LEFT OUTER JOIN dbo.Comments AS C 
       ON U.UserID = C.UserID
WHERE
   U.Location IN ('India','United Kingdom')
   AND U.LastAccessDate>= '04/02/2018'
   AND U.LastAccessDate< '06/02/2018'
   AND P.LastActivityDate>= '04/02/2018'
   AND P.LastActivityDate< '06/02/2018'
   AND U.Age>10

ORIN.

我刪除了重複的U.LastAccessDate條件。

我刪除了不必要的U.Age IS NOT NULL條件。

如果此查詢仍然執行緩慢。我的下一個最佳猜測是 Users.LastAccessDate 和/或 Posts.LastActivityDate 上缺少索引。

引用自:https://dba.stackexchange.com/questions/267662