Oracle - odczyt posortowanego zbioru z indeksu

Odpowiedz Nowy wątek
2020-05-11 23:08

Rejestracja: 3 lata temu

Ostatnio: 9 godzin temu

0

Cześć. Mam zapytanie do bazy oracle(wersja 11.2), które ma zwrócić posortowany zbiór danych.
Tabela:

CREATE TABLE tabela1 
(
kolumna1   DATE NOT NULL,
kolumna2   VARCHAR2(50 CHAR) NOT NULL,
kolumna3   VARCHAR2(50 CHAR) NOT NULL,
kolumna4   VARCHAR2(50 CHAR) NOT NULL,
....
kolumna10  VARCHAR2(50 CHAR)
)

tabela jest partycjonowana po 'kolumna1' oraz subpartycjonowana po 'kolumna2', posiada indeks lokalny na zestawie kolumn 'kolumna1, kolumna2, kolumna3, kolumna4'

Zapytanie:

SELECT kolumna1, kolumna2, kolumna3, kolumna4
FROM    tabela1
WHERE kolumna1 = &data1
              AND kolumna2 = &wartosc1
ORDER BY kolumna1, kolumna2, kolumna3

Plan zapytania jaki proponuje optymalizator:

screenshot-20200511225200.png

Kwestia której nie rozumiem to co robi w planie zapytania 'sort order by'. Spodziewałem że wystarczy tu odczyt danych z bloków indeksu, bez dodatkowego sortowania. Nie udało mi się też wymusić tego na optymalizatorze.
Będę wdzięczny jeśli ktoś mi to rozjaśni.

Pozostało 580 znaków

2020-05-12 09:20

Rejestracja: 1 rok temu

Ostatnio: 15 minut temu

0

No ale indeks masz na 'kolumna1, kolumna2, kolumna3, kolumna4' a grupujesz po 'kolumna1, kolumna2, kolumna3' to jak on ma używać indeksu?

Pozostało 580 znaków

2020-05-12 14:57

Rejestracja: 3 lata temu

Ostatnio: 9 godzin temu

0
Tomek Pycia napisał(a):

No ale indeks masz na 'kolumna1, kolumna2, kolumna3, kolumna4' a grupujesz po 'kolumna1, kolumna2, kolumna3' to jak on ma używać indeksu?\

Jeśli byłaby możliwość użycia indeksu do posortowania po kolumnach 'kolumna1, kolumna2, kolumna3, kolumna4' to myślę że tym bardziej można by go użyć do sortowania po 'kolumna1, kolumna2, kolumna3' gdzie kolejność w jakiej zostanie zwrócona 'kolumna4' jest dowolna czyli może zostać zwrócona również jako posortowana.
Rozszerzając zbiór po, którym sortuję do 'kolumna1, kolumna2, kolumna3, kolumna4' plan jest taki sam jak dla 'kolumna1, kolumna2, kolumna3', nic się nie zmieniło

Pozostało 580 znaków

2020-05-12 15:02

Rejestracja: 1 rok temu

Ostatnio: 15 minut temu

1

Optymalizator w Oracle to jest optymalizator kosztowy oparty o statystyki itp i możliwe ze załadowanie indeks było droższe niz posortowanie. Plan wykonania może się zmieniać względem ilości danych i innych rzeczy i może wydawać się nieracjonalny dla człowieka.

Pozostało 580 znaków

2020-05-12 17:42

Rejestracja: 1 rok temu

Ostatnio: 1 dzień temu

Lokalizacja: Warszawa

0

Sortowanie występuje ponieważ masz RANGE SCAN. Nie wiem czemu ale przy RANGE SCAN Oracle zawsze sortuje wynik. Przy full scanie już nie potrzebuje dodatkowego sortowania


Zapraszam do mojego kursu programowania na bazie Oracle
Dla średniozaawansowanych + optymalizacja: KURS Oracle SQL
Dla początkujących bazy danych + SQL: KURS SQL

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0