Sortowanie kolumny VARCHAR(2500)

Załóżmy, że mamy tabelę z kolumną typu VARCHAR(2500), a w niej sporo wierszy. Wynik zapytania z tej tabeli chcielibyśmy posortować według wspomnianej kolumny. Oczywiście będzie to bardzo czasochłonne, a tym samym słabo wydajne. Jak sobie z tym poradzić?

Zapytanie tego typu przy 100 tysiącach wierszy, na mojej wysłużonej maszynie, wykonywało się 28 sekund. Pierwsza myśl, jaka wpadła mi do głowy, to założyć na kolumnę indeks. Niestety jak już wspominałem tutaj, maksymalny dopuszczalny rozmiar indeksu to 900 bajtów. Tym samym, niemożliwe staje się stworzenie indeksu opartego o tą kolumnę i konieczne jest znalezienie innego rozwiązania. Dodałem/założyłem więc kolumnę wyliczeniową (computed column), której nadałem wartość pierwszej kolumny skróconej do 500 znaków.

ALTER TABLE t1
ADD short_value AS (SUBSTRING(value, 0, 500))

Po tej zmianie moje zapytanie sortowałem w oparciu o kolumnę ze skróconą wartością, co skutecznie poprawiło wynik, skracając go do 12 sekund.
Idąc dalej tym tropem, mogłem założyć w tym momencie indeks na kolumnę ze skróconą wartością i tak też zrobiłem.

CREATE INDEX IX_t1_short_value ON t1 (short_value)

Czas mojego zapytania to jedna sekunda.

Na koniec należy jeszcze wspomnieć o tym, iż po stworzeniu powyższego indeksu wielkość bazy danych nieco zwiększyła się, co jest rzeczą naturalną.

Promuj

2 thoughts on “Sortowanie kolumny VARCHAR(2500)

  1. Plusem jest możliwość sortowania, jednak nie wszystko będzie posortowane, jeśli znajdzie się kilka rekordów, których pierwsze 500 znaków będzie takie samo. Ciekawie zostało to rozwiązane bodaj w mysql-u, gdzie możemy indeksować kolumny typu TEXT, czy jakoś tak…

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *