sql >> Database teknologi >  >> RDS >> Mysql

Langsom forespørgsel med HAVING-klausul - kan jeg fremskynde det?

En hurtig løsning ville være at filtrere i underforespørgslen:

SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
AND s.id IN(
    SELECT g.site_id
    FROM gstats g
    WHERE g.start_date > '2015-04-30' AND g.site_id = s.id
    GROUP BY g.site_id
    HAVING SUM(g.results) > 100
)
GROUP BY s.id
ORDER BY dcount ASC

Da du ellers laver en sådan grupperingsforespørgsel for alle mulige kandidater. Vi kan gøre dette mere elegant med EXISTS :

SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
AND EXISTS (
    SELECT 1
    FROM gstats g
    WHERE g.site_id = s.id AND g.start_date > '2015-04-30'
    HAVING SUM(g.results) > 100
)
GROUP BY s.id
ORDER BY dcount ASC

Men vi er ikke færdige endnu, nu vil vi bruge EXISTS for hver element. Det er mærkeligt, da forespørgslen kun afhænger af s.id , så det afhænger kun af gruppen , ikke de enkelte rækker. Altså et potentiale speedup, men dette afhænger af størrelserne på tabellerne osv. er at flytte betingelsen til en HAVING erklæring:

SELECT count(d.id) AS dcount, s.id, s.name
FROM sites s
LEFT JOIN deals d ON (s.id = d.site_id AND d.is_active = 1)
WHERE (s.is_active = 1)
GROUP BY s.id
ORDER BY dcount ASC
HAVING EXISTS (
    SELECT 1
    FROM gstats g
    WHERE g.site_id = s.id AND g.start_date > '2015-04-30'
    HAVING SUM(g.results) > 100
)


  1. Generering af SQL-forespørgsel baseret på URL-parametre

  2. ORACLE SQL listegg funktion

  3. SQL, Hjælpetabel over tal

  4. SQL til hierarkisk relation