2013-09-27 95 views
0

我們不能讓這種簡單的查詢工作:查詢永遠掛在與分組

SELECT * FROM 
(SELECT h.*, h.NewValue AS STATUS, 
     (SELECT h2.CreatedDate 
      FROM siebel_service_request_history h2 
      WHERE h2.Field = 'Status' AND h2.CreatedDate > h.CreatedDate AND 
       h2.SiebelID = h.SiebelID 
      ORDER BY h2.CreatedDate 
      LIMIT 1 
     ) AS nextCreatedDate 
    FROM siebel_service_request_history h WHERE h.Field ='Status') h 

    GROUP BY h.SiebelID, h.Status 

它正常工作與分組由SiebelID(但慢)和它掛像永遠如果再加上由Status分組。但是,爲了獲得我們想要的數據,我們需要包含在分組中的兩個字段。

我們擁有和salesforce_case_history表一樣的查詢(它運行速度非常快,而且確切地說,我們在兩個表中都有大致相同的記錄數(salesforce_case_history - - 1159870記錄VS siebel_service_request_history - 1202865記錄)) :

SELECT * FROM (SELECT h.*, h.NewValue AS STATUS, 
     (SELECT h2.CreatedDate 
      FROM salesforce_case_history h2 
      WHERE h2.Field = 'Status' AND h2.CreatedDate > h.CreatedDate AND 
       h2.CaseId = h.CaseId 
      ORDER BY h2.CreatedDate 
      LIMIT 1 
     ) AS nextCreatedDate 
    FROM salesforce_case_history h WHERE h.Field ='Status' 
) h 
GROUP BY h.CaseId, h.Status 

我們還創建了siebel_service_request_history同一綜合指數爲內子選擇搜索包括三個字段(SiebelIDCreatedDateField)正如我們在salesforce_case_history創建的表。我們嘗試了幾乎所有我們知道的事情,但不幸的是沒有提出這個問題的根本問題。

+0

因爲您正在從'h'中選擇,這是一個您即時創建的「表格」,因此它沒有索引。由於您每次查詢時都重新創建了分組,因此您無法從該分組獲得任何速度。 – Nanne

+0

爲什麼downvote ??據我認爲這個問題是好的 – Dhaval

+0

這可能是因爲你只是轉儲一個很慢的查詢。沒有「這是我的目標」,沒有解釋問題,只是「這個查詢很慢」。根據我的評論(我認爲),這是合乎邏輯的,但速度很慢,但我實際上無法回答你的問題,因爲我不知道你想要什麼。您可能需要重新編寫查詢結構。這意味着目前形式的問題並不清楚。 – Nanne

回答

0

嘗試:

SELECT h.*, h.NewValue AS STATUS, 
     (SELECT h2.CreatedDate 
      FROM siebel_service_request_history h2 
      WHERE h2.Field = 'Status' AND h2.CreatedDate > h.CreatedDate AND 
       h2.SiebelID = h.SiebelID 
      ORDER BY h2.CreatedDate 
      LIMIT 1 
     ) AS nextCreatedDate 
    FROM siebel_service_request_history h WHERE h.Field ='Status' 

    GROUP BY h.SiebelID, h.Status 

你有一個額外的不必要的子查詢的步驟。

另請嘗試從子查詢中創建一個表,在您分組的內容上添加索引,然後將select * from表分組。將會大大加快,我在所有的例程中都使用帶有索引的臨時表。

+0

AdrianBR:你搖滾!這是一個問題!現在我們將爲我們的目的使用傳遞表,thanx – Andrew

+0

我們還在分組中包含了(SiebelID,NewValue)的複合索引,但它仍然是一個神祕的原因,它爲什麼對一個表起作用,但對另一個表不起作用。 – Andrew

+0

這是關於mysql如何選擇訂購。如果你看看解釋(解釋select ...),那麼在較慢的查詢中可能會發生排序。另一個竅門是按計算列進行分組,例如按組ID + 0或按組左移(狀態255)。這通常會減慢速度,但有時會避免不必要的排序。 – AdrianBR