Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to optimize huge query with repeated subqueries
    primarykey
    data
    text
    <p>I have the following huge query that contains repeated subqueries , It looks really inefficient to me. How can i optimize it ?</p> <pre><code>SELECT T2.date1, T2.date2, T2.period, T1.market, T1.ticker, 0 AS scenario FROM (SELECT DISTINCT Q.market AS market, Q.ticker AS ticker FROM portfolio.scenario S RIGHT JOIN portfolio.quote Q ON S.series = (SELECT S.series FROM scenario S WHERE S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01' AND S.period = 'QUARTER' ORDER BY S.date2 LIMIT 1) AND Q.market = S.market AND Q.ticker = S.ticker WHERE Q.date = '2010-07-01' AND S.date1 IS NULL) AS T1 JOIN (SELECT DISTINCT S.date1, S.date2, S.period FROM scenario S WHERE S.series = (SELECT S.series FROM scenario S WHERE S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01' AND S.period = 'QUARTER' ORDER BY S.date2 LIMIT 1) AND S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01') AS T2 UNION SELECT S.date1 AS date1, S.date2 AS date2, S.period AS period, Q.market AS market, Q.ticker AS ticker, Q.close * EXP(S.ratio) AS scenario FROM portfolio.scenario S , portfolio.quote Q WHERE S.series = (SELECT S.series FROM scenario S WHERE S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01' AND S.period = 'QUARTER' ORDER BY S.date2 LIMIT 1) AND S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01' AND Q.date = '2010-07-01' AND Q.market = S.market AND Q.ticker = S.ticker UNION SELECT T2.date1, T2.date2, T2.period, T1.market, T1.ticker, 0 AS scenario FROM (SELECT DISTINCT Q.market AS market, Q.ticker AS ticker FROM portfolio.scenario S , portfolio.quote Q WHERE Q.date = '2010-07-01' AND Q.market = S.market AND Q.ticker = S.ticker AND S.series = (SELECT S.series FROM scenario S WHERE S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01' AND S.period = 'QUARTER' ORDER BY S.date2 LIMIT 1) AND S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01' ) AS T1 JOIN (SELECT DISTINCT S.date1, S.date2, S.period FROM scenario S WHERE S.series = (SELECT S.series FROM scenario S WHERE S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01' AND S.period = 'QUARTER' ORDER BY S.date2 LIMIT 1) AND S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01') AS T2 WHERE (T2.date1, T2.date2, T2.period, T1.market, T1.ticker) NOT IN (SELECT S.date1 AS date1, S.date2 AS date2, S.period AS period, Q.market AS market, Q.ticker AS ticker FROM portfolio.scenario S , portfolio.quote Q WHERE Q.date = '2010-07-01' AND Q.market = S.market AND Q.ticker = S.ticker AND S.series = (SELECT S.series FROM scenario S WHERE S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01' AND S.period = 'QUARTER' ORDER BY S.date2 LIMIT 1) AND S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01' ) ORDER BY date1,date2,period,market,ticker </code></pre> <p>After @<a href="https://stackoverflow.com/users/99003/bruce-alderson">Bruce</a> 's comment and some logic to reduce a subquery my query now is:</p> <pre><code>(SELECT S.date1, S.date2, S.period, Q.market, Q.ticker, Q.close * EXP(S.ratio) AS scenario FROM portfolio.scenario S , portfolio.quote Q WHERE S.date1 &gt;= (@date1 := '2009-09-01') AND S.date2 &lt;= (@date2 := '2010-07-01') AND Q.date = (@qdate := '2010-07-01') AND S.series = (@series := (SELECT S.series FROM scenario S WHERE S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01' AND S.period = 'QUARTER' ORDER BY S.date2 LIMIT 1)) AND Q.market = S.market AND Q.ticker = S.ticker) UNION (SELECT T2.date1, T2.date2, T2.period, T1.market, T1.ticker, 0 AS scenario FROM (SELECT Q.market, Q.ticker FROM quote Q WHERE Q.date = @qdate) AS T1 JOIN (SELECT DISTINCT S.date1, S.date2, S.period FROM scenario S WHERE S.series = @series AND S.date1 &gt;= @date1 AND S.date2 &lt;= @date2) AS T2 WHERE (T2.date1, T2.date2, T2.period, T1.market, T1.ticker) NOT IN (SELECT S.date1, S.date2, S.period, Q.market, Q.ticker FROM portfolio.scenario S , portfolio.quote Q WHERE Q.date = @qdate AND Q.market = S.market AND Q.ticker = S.ticker AND S.series = @series AND S.date1 &gt;= @date1 AND S.date2 &lt;= @date2 )) </code></pre> <p>However, If i changed </p> <pre><code> (@series := (SELECT S.series FROM scenario S WHERE S.date1 &gt;= '2009-09-01' AND S.date2 &lt;= '2010-07-01' AND S.period = 'QUARTER' ORDER BY S.date2 LIMIT 1)) </code></pre> <p>to be</p> <pre><code> (@series := (SELECT S.series FROM scenario S WHERE S.date1 &gt;= @date1 AND S.date2 &lt;= @date2 AND S.period = 'QUARTER' ORDER BY S.date2 LIMIT 1)) </code></pre> <p>It takes too much time to process it (i have executed the query 10 mins ago and still did not get the result) while the query normally returns in 5 seconds.</p> <p>Also when i reset the variables , execute the result is not correct (probably use the variable's value from the previous execution). How can i change that without adding SET statements (I would like it to be a single query)</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload