我在使用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万行
答案 0 :(得分:1)
这是一个多部分问题。
答案 1 :(得分: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
答案 2 :(得分:0)
您是否尝试过解释以了解该计划与执行计划的不同之处?
另外,我发现在使用select执行insert(select)和表创建时,某些DB中可能存在锁定问题。我在MySQL中运行它,它解决了我遇到的一些死锁问题。
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
答案 3 :(得分:0)
查询运行速度如此之慢的原因可能是因为它正在创建基于所有350万行的临时表,而实际上您只需要其中的一部分,即与您的joinPart连接匹配的bigRegistration。第一个单选select语句更快b / c SQL足够聪明,知道它只需要计算a.type = r.cageID所在的bigRegistrations。
我建议您不需要临时表,您的第一个查询非常简单。相反,您可能只需要一个索引。您可以通过研究估计的执行计划或在数据库优化顾问中运行查询来手动确定。我的猜测是你需要创建一个类似于下面的索引。请注意我首先通过cageId索引,因为这是你加入到amusementParks的东西,这样可以帮助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)