Krzysztof Raczkowski

Krzysztof Raczkowski Stała współpraca,
Logifact-Systems Sp.
z o.o.

Temat: MS SQL (lub PostgreSQL) i wyszukiwanie po polu...

Witam Szanowne Audytorium :)

Wyobraźmy sobie tabelę z kilkudziesięcioma milionami rekordów (tak naprawdę ilość nie jest istotna... zakładamy, że jest po co optymalizować :) ) zawierającą pole przeznaczone na flagi bitowe (2,4,8.... itd...).

Zakładanie indeksu na takim polu nie ma sensu bo zapytania będą typu:

select pk_id, pole1, pole2 from tabela_dane where flaga & 12 = 12

Jeżeli dołożymy tabelę asocjacyjną po to aby połączyć pk_id z rozpisanymi flagami na rekordzie - zysku nie będzie... bo lookup do danych aby dociągnąć pole1, pole2... też kosztuje...

Jeżeli mam tego typu dane... jak właściwie powinien być skonstruowany schemat aby wyszukiwanie danych po flagach było efektywne ?

Jedyną 'optymalizację' jaką udało mi się osiągnąć można uzyskać w taki sposób
1) Zakładamy indeks na flaga
2) Zapytanie robimy tak: (..) where (flaga >= 12) and (flaga & 12 = 12)

Logicznie jest to samo... a jest szansa że część danych wytnie się...

--
Pozdrawiam
K.
Wojciech Muszyński

Wojciech Muszyński Tworzenie aplikacji
bazodanowych
(Oracle, APEX,
Access)

Temat: MS SQL (lub PostgreSQL) i wyszukiwanie po polu...

W Oracle sprawę można rozwiązać za pomocą indeksów bitmapowych.
Zakładając 8 flag - otrzymujemy co najwyżej 256 kombinacji.

W takim przypadku indeks bitmapowy będzie dobrym rozwiązaniem:
http://www.dba-oracle.com/oracle_tips_bitmapped_indexe...

Nie wiem jak wygląda to w MS SQL - szybkie googlanie wykazało, że chyba nie ma tam tego typu indeks.
Łukasz Grala

Łukasz Grala Microsoft MVP Data
Platform| MCT | MCSE
- Architekt Platf...

Temat: MS SQL (lub PostgreSQL) i wyszukiwanie po polu...

W MS SQL Server można zastosować tzw indeks filtrujący (lub zestaw indeksów).
Wówczas tworzysz indeks filtrujące na fladze lub flagach.
Bardzo wydajne rozwiązanie.
Krzysztof Raczkowski

Krzysztof Raczkowski Stała współpraca,
Logifact-Systems Sp.
z o.o.

Temat: MS SQL (lub PostgreSQL) i wyszukiwanie po polu...

Łukasz Grala:
W MS SQL Server można zastosować tzw indeks filtrujący (lub zestaw indeksów).
Wówczas tworzysz indeks filtrujące na fladze lub flagach.
Bardzo wydajne rozwiązanie.

http://www.goldenline.pl/forum/3123318/ms-sql-lub-post...

Można ... ale nie z takim warunkeim WHERE (flaga & 4) =4 .... a taki pewnie by pasował :)

Lub coś przeoczyłem..., jaki filtr byś zaproponował do tego pola ? :)

Taki cross-post mi wyszedł, z tym zagadnieniem, z góry przepraszam :)

Następna dyskusja:

Sprytne SQL-ki




Wyślij zaproszenie do