Priorytety zapytań.

0

Witam.

Czy w MSSQL istnieje coś takiego jak priorytety zapytań?

Mam dość rozbudowane zapytanie które po odpaleniu skutecznie blokuje bazę co skutkuje tym że programy magazynowy innych końcówkach przestaje odpowiadać.
Przychodzą mi do głowy trzy rozwiązania:

  1. Obniżenie priorytetu mojego zapytania (o ile coś takiego jest możliwe) - niech wykonuje się dłużej ale nie blokuje pracy innym
  2. Uruchomienie mojego zapytania w oddzielnym "wątku" na serwerze - pytanie czy jest to możliwe ("ręczne" stworzenie takiego wątku czy SQL SERVER sam sobie tym zarządza0
  3. Stworzenie drugiej bazy ala hurtownia danych gdzie dane podczas wrzucania były by odpowiednio agregowane

Pewnie są inne lepsze opcje i tutaj prośba do Was - podpowiedzcie co najlepiej zrobić w takiej sytuacji.

0

a with(nolock) nie spełni Twoich porzeb?

0

Na pierwszy rzut oka nolock nie pomoże.
O ile dobrze rozumiem działanie to pomógł by gdybym wykonywał odczyt danych (rekordów) na których program aktualnie pracuje.
Natomiast w moim przypadku odczyt dotyczy rekordów "archiwalnych" na których nie powinny być aktualnie przeprowadzanie żadne operacje.
Np. Dziś odczytuję zawartość dokumentów z maja 2015 roku.

0

O wątki na serwerze bazodanowym to się nie martw, one sobie same z tym radzą. O ile dobrze pamiętam, to każde zapytanie idzie w oddzielnym.
Problemy może powodować brak indeksów - masz jakieś?
Możesz też zmniejszyć poziom izolacji transakcji, jeśli to tylko odczyt niemodyfikowanych danych, to najniższy wystarczy.

0

ja bardziej obstawiam po prostu zjadanie zasobów serwera przez to zapytanie i dlatego cała reszta stoi i czeka - problem znany na słabych maszynach (a i na mocnych potrafi się przydarzyć). Obstawiam, że grzebiesz w dużej ilości danych i najsłabszym ogniwem jest HDD. Co do priorytetu to jak masz MSSQL 2008 enterprise wzwyż to mozesz spróbować tego http://sqlmag.com/blog/alteri[...]ority-using-resource-governor

0

@somekid indeksów pod to konkretne zapytanie nie tworzyłem (w bazie jest ileś tam stworzonych przez producenta) - sprawdzę plan zapytania
@abrakadaber maszyna najgorsza nie jest
FUJITSU Server PRIMERGY RX1330 M1 procesor: Intel Xeon E3-1271v3 4C/8T 3.60 GHz 8 MB pamięć: 8GB (1x8GB) 2Rx8 L DDR3-1600 U ECC x 4 = 32 GB dyski: HD SATA 6G 500GB 7.2K HOT PL 2.5'' BC x 2 w RAID 1 - system SSD SATA 6G 120GB ReadIntensive 2.5' H-P x 4 w RAID 10 - baza danych Windows serwer 2012 + SQL 2014

Dzięki za link - Poczytam o tym Resource Governor.


Pierwsze testy z WITH (NOLOCK) przynoszą pozytywne rezultaty :]

0

no to jeśli jednym zapytaniem (nawet i z całego roku) potrafisz skutecznie zabić taki serwer to pogratulować zapytania i/lub struktury bazy. O ile z tego co piszesz baza nie jest twoja to może jednak trzeba zapytanie podrasować

1

Jeszcze nie spotkałem się z zapytaniem, które w jednej instancji byłoby tak zasobożerne, żeby zablokować cały serwer, ale teoretycznie jest to możliwe. Zobacz na planie zapytania jak dużo pamięci zżera Twój sql (zużycie masz na strzałkach pomiędzy klockami), tylko pamiętaj, że ilość użytej pamięci zależy od ilości danych, więc jeśli będziesz to testować na swojej lokalnej bazie, to cały plan zapytania może nie mieć nic wspólnego z produkcją.
Zapytania wykonują się wielowątkowo, czyli (w zależności od konfiguracji mssql) naraz może iść tyle zapytań, ile masz rdzeni. Jedno - nawet długie - dobrze napisane zapytanie zwykle nie blokuje innych, chyba że robi transakcje albo samo nadzieje się na cudzą transakcję (dlatego nolock dla każdej tabeli nie jest złym pomysłem, albo w ogóle na całe zapytanie transakcja read uncommited). Przy czym blokowane tabele są czasem bardzo nieintuicyjne, bo np. czasem robione są locki na tabelach, do których są klucze obce, mimo że te tabele same w sobie nie są dotykane.
Spójrz na plan zapytania, pozbądź się index scanów (w tym i table scanów) -> utwórz brakujące indeksy, zoptymalizuj indeksy istniejące (kolejność kolumn jest krytyczna! od najbardziej selektywnego do najmniej; usuń key lookup'y przez dołączenie do indeksu kolumn nie mających wpływu na sortowanie, a używanych w select; poczytaj i zastanów się nad użyciem indeksów z filtrami (where)), sprawdź że kolejność warunków w zapytaniu jest taka sama jak kolejność kolumn w indeksach itp. Temat rzeka.

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