I would also question the sub-select in the WHERE clause. I suspect that it
is being evaluated once for each row of rptPricingTEST. You could get a
significant performance boost if you move the results of that select into a
temp table and INNER JOIN to it. That way you calculate the MAX() date only
once for the entire table and not once per row (per row, per row,...)
CREATE TEMPORARY TABLE tmpLatestDates
SELECT commodity, MAX(PricingDt) as MaxDate
FROM rptPricingTEST
WHERE PricingDt > @date1
AND PricingDt <= @date2
GROUP BY commodity
INSERT INTO priceLast5
SELECT DISTINCT a.commodity, a.PricingDt
FROM rptPricingTEST a
INNER JOIN tmpLatestDates b
ON b.commodity = a.commodity
AND b.PricingDt = a.PricingDt
(By using the INNER JOIN, I question if the DISTINCT still needed, too.)
After reviewing your original post, I am not confident that you are
answering your question with this query. You said "I need to generate a
report of price change for all commodity for the date interval selected by
users." which to me implies a report something like:
+---------+-------------+-----------+--------------+------------+---------+---------+---------+
|commodity|starting date|ending date|starting price|ending price|max
price|min price|avg price|
+---------+-------------+-----------+--------------+------------+---------+---------+---------+
I am just not sure where you are going with the query you are building. Can
you provide a template of the results you want?
Thanks,
Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine
"Andrew
Braithwaite" To: "Victor Pendleton" <[EMAIL
PROTECTED]>, "nyem "
<[EMAIL PROTECTED] <[EMAIL PROTECTED]>, <[EMAIL
PROTECTED]>
com> cc:
Fax to:
05/26/2004 10:28 Subject: RE: slow insert into select
statement
AM
Hi,
I would start with finding out if it's the select or the insert that's
taking a long time...
Does the priceLast5 table have heavy indexes to build?
Try running the select seperately and see how long it takes...
Andrew
-----Original Message-----
From: Victor Pendleton [mailto:[EMAIL PROTECTED]
Sent: Wednesday 26 May 2004 14:13
To: 'nyem '; '[EMAIL PROTECTED] '
Subject: RE: slow insert into select statement
If you do the math a large result set will be created. You could
rewriting your query or adding more indexes to see if this speeds up the
process.
-----Original Message-----
From: nyem
To: [EMAIL PROTECTED]
Sent: 5/26/04 2:57 AM
Subject: slow insert into select statement
I have this insert statement that took a long time to execute:
INSERT INTO priceLast5
SELECT
DISTINCT a.commodity,
a.PricingDt
FROM rptPricingTEST a
WHERE
a.PricingDt = ( SELECT MAX(PricingDt)
FROM rptPricingTEST b
WHERE
b.PricingDt > @date1
AND b.PricingDt <= @date2
AND a.commodity = b.commodity
);
> Query OK, 3010 rows affected (4 min 17.37 sec)
Is there any way I can modify the sql statement to speed this up?
Here's the result of explain (splitted for easy reading):
id select_type table type possible_keys key
-- ------------------ ----- ----- ------------- ------------
1 PRIMARY a index NULL idxcommodity
2 DEPENDENT SUBQUERY b ref idxcommodity idxcommodity
id key_len ref rows Extra
-- ------- --------------------- ------ ------------------------
1 25 NULL 384155 Using where; Using index
2 22 dbsdvitmp.a.commodity 52 Using where; Using index
And here's the rest of the sql before the above insert:
SELECT @date1:=DATE_SUB( CURDATE(), INTERVAL 1 MONTH);
SELECT @date2:=CURDATE();
CREATE TEMPORARY TABLE priceLast5 (
commodity char(22) NOT NULL,
PricingDt date NOT NULL,
PRIMARY KEY (commodity),
KEY idxPricingDt (PricingDt),
);
LOCK TABLES rptPricingTEST a READ;
The source table rptPricingTEST consists of commodity id (which is a
concat of several ids), pricing date, and prices (low, hi, avg). I need
to generate a report of price change for all commodity for the date
interval selected by users. Since this will be a web-based report, to
wait for 4 minutes for a response is unacceptable. The actual table has
2 million rows which I guess can take forever to execute.
regards,
nyem
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql To unsubscribe:
http://lists.mysql.com/[EMAIL PROTECTED]
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:
http://lists.mysql.com/[EMAIL PROTECTED]
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]