2010-06-09 9 views
6

Mam tabelę T1 z 60 rzędami i 5 kolumnami: ID1, ID2, info1, info2, info3.Przyspiesz zapytanie, proste sprzężenie wewnętrzne z jednym dużym stołem i jednym małym stołem

Mam tabelę T2 z 1,2 miliona wierszy i kolejne 5 kolumn: ID3, ID2, info4, info5, info6.

Chcę uzyskać (ID1, ID2, info4, info5, info6) ze wszystkich wierszy, w których ID2 pasują. Obecnie moje zapytanie wygląda następująco:

SELECT T1.ID1, T2.ID2, 
     T2.info4, T2.info5, T2.info6 
    FROM T1, T2 
WHERE T1.ID2 = T2.ID2; 

Trwa to około 15 sekund. Moje pytanie brzmi: czy powinno to zająć tyle czasu, a jeśli nie, jak mogę to przyspieszyć? Myślę, że nie powinno, ponieważ T1 jest tak mały.

Poprosiłem PostgreSQL, aby WYJAŚNIŁO zapytanie, i mówi, że hashe T2, a następnie hash dołącza do skrótu z T1. Wydaje się, że T2 zajmuje tyle czasu. Czy istnieje sposób zapisania zapytania, aby nie musiał mieszać T2? Czy istnieje sposób, aby go buforować mieszania T2, więc nie ponownie go zrobić? Tabele będą aktualizowane co kilka dni.

Jeśli robi różnicę, T1 jest tabelą tymczasową utworzoną wcześniej w sesji.

Odpowiedz

13

To nie powinno trwać tak długo :)

Tworzenie indeksu na T2(ID2) powinno poprawić wydajność zapytanie:

CREATE INDEX idx_t2_id2 ON t2 (id2); 
+1

fajnie, teraz płonie szybko =). – Claudiu

+0

Dodałem również indeksy do reszty bazy danych, a teraz mogę dodawać do niej nowe elementy 50 razy/sekundę zamiast .. raz na 2 sekundy. Sweeet! – Claudiu

+0

@PeterLang, jeśli mógłbyś napisać pełne zapytanie, zrozumienie tego byłoby o wiele łatwiejsze dla nowicjuszy. – 3kstc

0

mogą używać JOIN zwiększyć szybkość zapytania:

SELECT T1.ID1, T2.ID2, 
    T2.info4, T2.info5, T2.info6 
FROM T1 
JOIN T2 ON T2.ID2 = T1.ID2; 

Nie wiem dokładnie, ale może to być twoje zapytanie, po pierwsze dołącz do wszystkich wierszy w obu tabelach, a następnie zastosuj warunki WHERE i problem.

Oczywiście, jak zauważył Peter Lang, powinieneś stworzyć indeks.

+0

Myślałem o tym już, ale to nie miało znaczenia. Myślę, że moją drogą jest cukier składniowy w ten sposób. – Claudiu

+0

Więc nie miałem racji :) Ale zawsze, gdy chcę dołączyć do tabel, używam JOIN zamiast twojego vaiant;) –

+0

Składnia JOIN została zestandaryzowana znacznie później niż tradycyjne użycie warunków klauzuli join-in-the-where. Pamiętam, że byli nowoutworzeni w Oracle 8. IMHO to przypadek nowego standardu, który faktycznie poprawia sytuację (szczególnie zewnętrzne sprzężenia). – araqnid

0

Najpierw zrób połączenie.

SELECT T1.ID1, T2.ID2, 
     T2.info4, T2.info5, T2.info6 
    FROM T1 
    JOIN T2 ON T1.ID2 = T2.ID2; 

Następnie spróbuj utworzyć i zindeksuj na T2.d2.

Jeśli nie, możesz dodać kolumnę ID1 do T2. Aktualizuj go co kilka dni, jak twierdzisz. To proste zapytanie na T2 bez połączeń.

SELECT T2.ID1, T2.ID2, 
     T2.info4, T2.info5, T2.info6 
    FROM T2 
    WHERE T2.ID2 = A_VALUE; 

Ponownie, zalecany będzie indeks na T2.ID2.

Powiązane problemy