2010-11-25 10 views
0

Ich habe viele Anfragen bekommen, die wie geschrieben werden:Wie optimieren verschachtelte Abfrage

 select thread_id as topic_id,title as topic    
    ,    
    isnull((select count(*) from tblmessages b where thread_id=a.thread_id and is_approved='Y' and sort_level>1    
    group by b.thread_id    
    ),0) as replies,    
    isnull((select count(*) from tblmessages b where thread_id=a.thread_id and isnull(new_post,'Y')='Y' and sort_level>1    
    group by b.thread_id    
    ),0) as NewPost,    
    isnull((select count(*) from tblmessages b where thread_id=a.thread_id and isnull(is_approved,'N')='N' and sort_level>1    
    group by b.thread_id    
    ),0) as NotClear,    

    sort_level,sort_index, from tblMessages a    
    where sort_level=1 and [email protected] 
    order by topic_id desc 

Bitte sagen Sie mir, wie zu optimieren und eine bessere Art und Weise solche Abfragen zu schreiben. weil ich Tabellen mit Aufzeichnungen 5,00,000 habe. Es braucht also viel Zeit und manchmal kommt eine Auszeit.

Dank

+0

Sind das fünf Millionen oder 50 Millionen Datensätze? –

+0

@Marcele: seine 5,00,000 –

Antwort

1

Sie sollten die variuos Unterabfrage in einem einzelnen mit unterschiedlicher Zählungsgruppe und verwenden eine um die Daten zu setzen zusammenschließen

die Unterabfrage sein sollte:

select thread_id 
    count(when isnull(is_approved,'N')='N' then 1 end) as replies, 
    count(when isnull(new_post,'Y')='Y' then 1 end) as NewPost, 
    count(when isnull(is_approved,'N')='N' then 1 end) as NotClear 
    from tblmessages 
    where sort_level>1 
    group by thread_id 

Während die finalquery ist das folgende

select thread_id as topic_id,title as topic, 
    sort_level,sort_index , B.replies, B.NewPost, B.NotClear 
    from tblMessages a    
    join 
    (select thread_id 
    count(when isnull(is_approved,'N')='N' then 1 end) as replies, 
    count(when isnull(new_post,'Y')='Y' then 1 end) as NewPost, 
    count(when isnull(is_approved,'N')='N' then 1 end) as NotClear 
    from tblmessages 
    where sort_level>1 
    group by thread_id) as B 
    on a.thread_id = B.thread_id 
    where sort_level=1 and [email protected] 
    order by topic_id desc 
+0

@il_guru_ji: gr8 .. danke das verbesserte meine Abfrage Leistung. –

0

Sie können De-Normaliz versuchen ing ein wenig:

  1. erstellen replies, NewPost und NotClear Felder
  2. eine Routine schreiben, die diese Felder aktualisiert, cron es (Zeitraum ist abhängig von 3.)
  3. Rewrite die meisten/alle Abfragen, die diese Felder auswirken auf aktualisiere sie. Wenn Sie alle neu schreiben, führen Sie 2. ein paar Mal pro Tag. Andernfalls, abhängig von der Datenintegrität, benötigen Sie einige Male pro Stunde.

Dies wird eindeutig mit Ihrer Abfrage helfen. Es ist jedoch mehr Wartung als jede kleine Abfrage benötigt, so gut wie nie verwendet wird, kann Konsistenz brechen (man denke an einigen moderierende Tools für BBs wie Split Thema ...)

0
SELECT a.* 
FROM 
    (SELECT 
     thread_id AS topic_id, 
     title AS topic , 
     SUM(CASE WHEN is_approved='Y' AND sort_level > 1 THEN 1 ELSE 0 END) as replies, 
     SUM(CASE WHEN isnull(new_post,'Y')='Y' AND sort_level > 1 THEN 1 ELSE 0) END as NewPost, 
     SUM(CASE WHEN isnull(is_approved,'N')='N' AND sort_level > 1 THEN 1 ELSE 0 END) as NotClear, 
     sort_level , 
     sort_index, 
     category , 
     topic_id 
    FROM 
     tblMessages 
    ) a 
WHERE 
    a.sort_level=1 AND [email protected] 
ORDER BY 
     a.topic_id DESC 

Ich habe dies nicht in der Lage zu testen, so einige Syntaxfehler können existieren, aber Sie bekommen die Drift?

+0

Sie benötigen eine Gruppe nach der verschachtelten Abfrage für Ihre SUMs – RLT