簡體   English   中英

快速查詢慢速創建表

[英]Fast to query slow to create table

樣本數據

我在使用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秒內顯示。 但是,如果我添加了create table,查詢將花費一些時間(大約25分鍾)

有什么好的方法可以縮短查詢時間?

編輯:大注冊表的大小約為350萬行

這是一個多方面的問題。

  1. 使用臨時表
  2. 不要使用Distinct-將所有列分組以使其區分(不要忘記檢查索引)
  3. 檢查SQL執行計划

您能否以以下方式嘗試查詢以實現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 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

建議在cageIDdateofEntry上建立索引

在這里,您沒有創建臨時表。 嘗試以下...

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

您是否嘗試過進行解釋,以查看該計划從一次執行到下一次執行有何不同?

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

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

查詢運行如此緩慢的原因可能是因為它基於所有350萬行創建了一個臨時表,而實際上您只需要其中的一個子集,即與您對娛樂部件的聯接相匹配的bigRegistration。 第一個單選擇語句更快b / c SQL非常聰明,足以知道它只需要計算a.type = r.cageID的bigRegistration。

我建議您不需要臨時表,您的第一個查詢非常簡單。 相反,您可能只需要一個索引。 您可以通過研究估計的執行計划或在數據庫優化顧問中運行查詢來手動確定。 我的猜測是您需要創建一個類似於下面的索引。 請注意,我首先按agerId進行索引,因為這是您加入creationParks的內容,因此這將有助於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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM