sql
  • oracle
  • performance
  • 2011-11-21 12 views 5 likes 
    5

    Nie mam "wyjaśnić planu" pod ręką. Czy możesz pomóc ci określić, który z poniższych jest bardziej wydajny?Strojenie wydajności SQL dla Oracle Many OR vs IN()

    Wariant 1:

    select ... 
        from VIEW_ABC 
        where STRING_COL = 'AA' 
         OR STRING_COL = 'BB' 
         OR STRING_COL = 'BB' 
         OR ... 
         OR STRING_COL = 'ZZ' 
    

    Opcja 2:

    select ... 
        from VIEW_ABC 
        where STRING_COL IN ('AA','BB',...,'ZZ') 
    
    +0

    To pytanie jest otwarte dla każdej bazy danych, a różne optymalizatory będą miały różne implementacje. Przyjęta odpowiedź na to pytanie dotyczy MySQL. Kolejna z głosujących z dużą liczbą głosów mówi o Oracle. – givanse

    Odpowiedz

    2

    Przypuszczam, że optymalizator będzie traktować obie wersje tego samego. IN jest tak naprawdę skrótem syntaktycznym dla wielu instrukcji OR.

    6

    Jest to podobne pytanie: IN vs OR of Oracle, which faster?

    Spójrz na odpowiedź udzieloną przez OMG Ponies, sugeruje, że jest bardziej zoptymalizowany IN niż OR.

    Jest też to pytanie: IN vs OR in the SQL WHERE Clause

    Chociaż to nie jest specyficzne dla bazy danych, ma kilka dobrych odpowiedzi z punktu widzenia Oracle.

    O ile warto, korzystanie z IN byłoby dużo łatwiejsze do odczytania, a zatem łatwiejsze do obsługi w dłuższej perspektywie. Już samo to może wpłynąć na twój wybór, szczególnie jeśli (jak podejrzewam) optymalizator Oracle traktuje je w taki sam sposób.

    Jeśli jednak lista wartości jest bardzo duża, prawdopodobnie powinieneś zajrzeć do zupełnie innej metody pobierania wyników.

    0

    Optymalizator nadal będzie używać i indeksować, jeśli taki istnieje w kolumnie String_Col. W celu zachowania przyzwoitego rozmiaru SQL, aby pomóc w analizie, więc zamiast przeszukiwać Oracle ciąg znaków o długości 250-500, lepiej jest, umieszczając wszystkie możliwe wartości w tabeli tymczasowej lub tabeli pl/sql, a następnie dołączając tak -

    wyboru/* + uporządkowane use_nl (x) */* z pl/sql_table, view_abc x gdzie x.string_col = en/sql_table.value

    +0

    Ale wskazówki i tabela tymczasowa mogą dodać wiele innych potencjalnych problemów. Teraz optymalizator musi zrozumieć inną tabelę. Obciążenie tej dodatkowej tabeli może być większe niż zmniejszenie czasu analizy z mniejszego ciągu zapytania. A jeśli optymalizator oszacuje niepoprawnie tabelę tymczasową, może to prowadzić do problemów, takich jak niewykorzystywanie przycinania partycji. Jeśli wydajność jest głównym celem, wtedy powinieneś podać optymalizatorowi jak najwięcej informacji, takich jak twarde kodowanie dużych literałów. –

    1

    optymalizator Oracle przekształceniu w wykazach do łańcuchów OR. Pozwala to wykonać numer OR-expansion transformation, który może dodatkowo zoptymalizować zapytanie. Ponadto może być w stanie wygenerować przechodnie predykaty, które mogą przyspieszyć zapytanie.

    Posiadanie wszystkiego, co jest równe w dwóch zapytaniach, konstruktach lub transformacjach, nie będzie różnicy między używaniem IN lub OR. IN zostanie przekształcone w łańcuchy OR.

    Powiązane problemy