[英]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萬行
這是一個多方面的問題。
您能否以以下方式嘗試查詢以實現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
建議在cageID
和dateofEntry
上建立索引
在這里,您沒有創建臨時表。 嘗試以下...
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.