Co może przyśpieszyć liczenie (agregowanie) zapytania SQL w tych 3 systemach baz danych? Jestem pewien, że wiele rzeczy może to przyspieszyć (sprzęt dla jednego), ale jestem tylko początkującym DBA, więc jestem pewien, że otrzymam kilka odpowiedzi tutaj. Przeprowadziłem migrację około 157 milionów wierszy do bazy danych SQL Server, a to zapytanie trwa wiecznie. Ale w mojej źródłowej bazie danych Netezza zajmuje to kilka sekund.
Na przykład:
Netezza 6:
SELECT COUNT(*) FROM DATABASENAME..MYTABLE
Oracle 11g:
SELECT COUNT(*) FROM MYTABLE
SQL Server 2012:
SELECT COUNT(*) FROM DATABASENAME.[dbo].[MYTABLE]
sql-server
query-performance
count
netezza
MacGyver
źródło
źródło
Odpowiedzi:
Netezza to urządzenie zaprojektowane z myślą o doskonałych wynikach podczas skanowania dużych tabel, dlatego otrzymujesz tak szybkie wyniki w tym systemie.
W przypadku serwera SQL Server można znacznie przyspieszyć liczenie wierszy, wysyłając zapytanie z DMV sys.dm_db_partition_stats.
W środowisku o wysokich transakcjach nie ma gwarancji, że ten DMV będzie w 100% dokładny. Ale z twojego pytania wynika, że po prostu wykonujesz liczenie wierszy, aby zweryfikować każdą tabelę po migracji, więc to zapytanie powinno działać dla Ciebie.
źródło
Oto rozwiązanie programu SQL Server, które wykorzystuje
COUNT_BIG
widok indeksowany. Dzięki temu uzyskasz spójną transakcyjnie liczbę bez narzutów związanych z dużymi skanami tabel lub indeksów i bez potrzeby przechowywania pamięci wymaganej dla tych ostatnich:Będzie to wymagało jednego początkowego skanowania (bez uciekania się od tego) i doda trochę narzutu do przyrostowych manipulacji danymi w tabeli. Jeśli wykonujesz duże operacje z dużą ilością danych (w przeciwieństwie do wielu małych operacji), myślę, że narzut na zmiany powinien być znikomy.
źródło
W Oracle można użyć indeksu drzewa binarnego w kolumnie NOT NULL, aby odpowiedzieć na COUNT (*). W większości przypadków będzie on szybszy niż SKANOWANIE PEŁNEJ TABELI, ponieważ indeksy są zwykle mniejsze niż ich tabela bazowa.
Jednak regularny indeks drzewa binarnego nadal będzie ogromny z 157 Mrowami. Jeśli twoja tabela nie jest aktualizowana jednocześnie (tzn. Tylko proces ładowania wsadowego), możesz zamiast tego użyć indeksu bitmap.
Najmniejszy indeks bitmapowy wyglądałby mniej więcej tak:
Wpisy zerowe są uwzględniane przez indeks bitmapowy. Wynikowy indeks będzie niewielki (20-30 8 tys. Bloków na milion wierszy) w porównaniu do zwykłego indeksu drzewa binarnego lub tabeli podstawowej.
Wynikowy plan powinien pokazywać następujące operacje:
Jeśli twoja tabela jest aktualizowana jednocześnie, indeks bitmapowy z unikalną wartością będzie punktem spornym i nie powinien być używany.
źródło
W Oracle proste zapytanie zliczające jest często wykonywane przez skanowanie indeksu zamiast całej tabeli. Indeks musi być indeksem bitmapowym lub być zdefiniowany w kolumnie z ograniczeniem NOT NULL. W przypadku bardziej złożonych zapytań wymagających pełnego skanowania tabeli można użyć zapytania równoległego.
Aby włączyć kwerendę równoległą (wymagana wersja Enterprise), możesz użyć wskazówki optymalizatora:
Lub włącz równoległe zapytanie dla wszystkich zapytań w tabeli:
źródło