Korzystam z MS SQL i muszę uruchomić kilka zapytań w tej samej tabeli według różnych kryteriów. Najpierw uruchomiłem każde zapytanie w oryginalnej tabeli, chociaż wszystkie mają wspólne filtrowanie (tj. Data, status). Zajęło to dużo czasu (około 2 minut).
W wierszach danych znajdują się duplikaty, a wszystkie indeksy NIE są klastrowane. Interesują mnie tylko 4 kolumny dla moich kryteriów, a wynik powinien wypisać tylko liczbę dla wszystkich zapytań.
kolumny potrzebne: TABLE
, FIELD
, AFTER
, DATE
, i nie ma indeks na każdej z DATE
i TABLE
.
Po utworzeniu tabeli tymczasowej zawierającej tylko pola, których potrzebuję, spadła do 1:40 minut, co nadal jest bardzo złe.
CREATE TABLE #TEMP
(
TABLE VARCHAR(30) NULL,
FIELD VARCHAR(30) NULL,
AFTER VARCHAR(1000) NULL,
DATE DATETIME,
SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)
INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
SELECT TABLE, FIELD, AFTER, DATE
FROM mytbl WITH (NOLOCK)
WHERE TABLE = 'OTB' AND
FIELD = 'STATUS'
Uruchom to -> (dotyczy 216598 wierszy)
Ponieważ nie wszystkie zapytania opierają się na zakresie dat, nie uwzględniłem go w zapytaniu. Problem polega na tym, że wkładanie zajmuje znacznie ponad 1 minutę . Powyższa wkładka zajęła 1:19 minut
Chcę uruchomić coś takiego dla kilku zapytań:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
Problem z wstawką jest większy niż w przypadku zaznaczenia, ale temp ma o wiele mniej wierszy niż oryginalna tabela, co może być lepsze niż wielokrotne przeglądanie tabeli.
Jak mogę to zoptymalizować?
EDYTOWAĆ
Usunąłem identyfikator sortowania, myślałem, że problem dotyczy głównie wyboru, a nie wstawiania. To było zgadywanie.
Nie mogę utworzyć unikalnego dla żadnego indeksu, ponieważ nie ma unikalnego pola ani wierszy.
Korzystam z programu SQL Server 2012.
Informacje o tabeli : Jest stertą i ma następujące użycie miejsca:
name rows reserved data index_size unused
mytbl 24869658 9204568 KB 3017952 KB 5816232 KB 370384 KB
SELECT COUNT(*) AS COUNT FROM original_table WHERE AFTER = 'R' AND DATE >= '2014-01-01' AND DATE < '2015-01-01'
, dlaczego nie spróbujesz zoptymalizować każdego (zapytania) osobno? Czy nie możesz dodawać indeksów do tabeli?
TABLE
i FIELD
z #temp
tabeli (w końcu wszystkie wiersze mają TABLE = 'OTB' AND FIELD = 'STATUS'
określoną tabelę temp.)
CREATE TABLE
instrukcja). Głosowanie w dół było spowodowane tym, że pytanie nie było jasne.