2017-01-20 127 views
0

sample data快速查詢慢創建表

我有使用SELECT關鍵字(它運行很慢)創建表的問題。該查詢僅採用具有最新進入日期的動物的細節。該查詢將用於內部連接另一個查詢。

SELECT * 
FROM amusementPart a 
INNER JOIN (
    SELECT DISTINCT name, type, cageID, dateOfEntry 
    FROM bigRegistrations 
    GROUP BY cageID 
) r ON a.type = r.cageID 

但由於性能下降,有人建議我採取措施來提高性能。 1)使用臨時表,2)存儲結果並使用它並加入其他語句。

use myzoo 
    CREATE TABLE animalRegistrations AS 
    SELECT DISTINCT name, type, cageID, MAX(dateOfEntry) as entryDate 
    FROM bigRegistrations 
    GROUP BY cageID 

不幸的是,它仍然很慢。如果我只使用select語句,結果將在1-2秒內顯示。但如果我添加創建表,查詢將花費時間(大約25分鐘)

任何改善查詢時間的好方法?

編輯:大報名表的大小是約350萬行

+1

你想使用'DISTINCT'和'GROUP BY'一起檢索哪些數據集。爲了清晰起見,您可以發佈樣本數據和預期輸出。 – Susang

+0

已更新爲清晰 – Led

回答

1

能不能請你通過以下方式查詢實現The query is to take only the details of the animal with the latest entry date. that query will be used to inner join another query,你正在使用的查詢不獲取記錄按您的要求,它會更快:

SELECT a.*, b.name, b.type, b.cageID, b.dateOfEntry 
FROM amusementPart a 
INNER JOIN bigRegistrations b ON a.type = b.cageID 
INNER JOIN (SELECT c.cageID, max(c.dateOfEntry) dateofEntry 
       FROM bigRegistrations c 
      GROUP BY c.cageID) t ON t.cageID = b.cageID AND t.dateofEntry = b.dateofEntry 

cageID建議索引和dateofEntry

0

在這裏你是不是創建臨時表。請嘗試以下...

CREATE TEMPORARY TABLE IF NOT EXISTS animalRegistrations AS 
SELECT name, type, cageID, MAX(dateOfEntry) as entryDate 
FROM bigRegistrations 
GROUP BY cageID 
+0

我的問題是,它查詢如此之慢。 – Led

0

您是否嘗試過進行解釋以瞭解計劃與一次執行有何不同?

此外,我發現在使用select進行插入(選擇)和表創建時,某些數據庫中可能存在鎖定問題。我在MySQL中運行它,它解決了我遇到的一些死鎖問題。

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
+0

它比回答更適合評論。閱讀更多詳情,瞭解如何/回答什麼。 – Susang

+0

聽起來不錯。如果我的聲望<50,我不認爲我可以評論...... –

1

這是一個多部分問題。

  1. 使用臨時表
  2. 不要用鮮明的 - 組中的所有列,使不同的(不要忘記檢查索引)
  3. 檢查SQL執行計劃
0

原因查詢運行速度如此之慢可能是因爲它基於所有350萬行創建臨時表,而實際上您只需要這些行的子集,即與您的連接匹配amusementPart的bigRegistrations。第一個單一select語句是更快的b/c SQL足夠聰明,知道它只需要計算bigRegistrations,其中a.type = r.cageID。

我建議你不需要臨時表,你的第一個查詢很簡單。相反,你可能只需要一個索引。您可以通過研究估計的執行計劃或在數據庫調整顧問中運行查詢來手動確定。我的猜測是你需要創建一個類似於下面的索引。注意,我首先通過cageId進行索引,因爲這是您加入遊樂園的內容,所以這將有助於SQL將結果縮小到最快。但我猜測 - 查看查詢計劃或調整顧問是肯定的。

CREATE NONCLUSTERED INDEX IX_bigRegistrations ON bigRegistrations 
(cageId, name, type, dateOfEntry) 

另外,如果你想與最新的入境日期的動物,我想你想這個查詢,而不是你正在使用的一個。我假設PK是全部4列。

SELECT name, type, cageID, dateOfEntry 
FROM bigRegistrations BR 
WHERE BR.dateOfEntry = 
    (SELECT MAX(BR1.dateOfEntry) 
    FROM bigRegistrations BR1 
    WHERE BR1.name = BR.name 
    AND BR1.type = BR.type 
    AND BR1.cageID = BR.cageID)