Staramy się mieć tabelę transakcyjną, która pobiera tylko nowe rekordy wstawiane regularnie.Dlaczego SQL Server 2008 blokuje SELECT przy długich transakcjach INSERT?
Ta prosta tabela wymaga od nas ciągłego dodawania nowych rekordów w miarę upływu czasu. Oczekuje się, że wielkość transakcji w tej tabeli będzie dość wysoka, a także może wystąpić okresowy import transakcji (> 1000), który może potrwać kilka sekund.
Na podstawie tych danych wykonujemy zestaw instrukcji select grupujących różne kolumny, aby zwrócić wymagane wartości.
Z naszych wstępnych testów znaleźliśmy wąskie gardło, które należy powiązać z SQL Server, który blokuje nasze SELECT, gdy jest w trakcie transakcji INSERTS.
Poniżej znajduje się prosty przykład, który można uruchomić w celu zilustrowania problemu.
- prosty DB Tabela
create table LOCK_TEST (
LOCK_TEST_ID int identity ,
AMOUNT int);
- Uruchamia się w oknie 1 zapytania
begin tran
insert into LOCK_TEST (AMOUNT) values (1);
WAITFOR DELAY '00:00:15' ---- 15 Second Delay
insert into LOCK_TEST (AMOUNT) values (1);
commit
- Zapytania 2. przebieg ten równolegle
select SUM(AMOUNT)
from LOCK_TEST;
by się spodziewać Zapytanie 2 zwraca od razu, z 0, dopóki nie zakończy się zapytanie 1, a następnie pokaże 2. Nigdy nie chcemy widzieć 1 zwróconego z drugiego zapytania.
Odpowiedź, którą przyjrzeliśmy, odnosi się do WITH (NOLOCK) w instrukcji select. Ale to narusza granice transakcji, a zwrócone informacje mogą mieć charakter finansowy i nie chcemy widzieć żadnych niepowiązanych szczegółów w naszych zapytaniach.
Mój problem wydaje się być po stronie INSERT ...
Dlaczego INSERT zablokować SELECT mimo to nie modyfikujące istniejące dane?
Pytanie dodatkowe: Czy jest to "funkcja" programu SQL Server, czy też znajdziemy to w innych smakach bazy danych?
UPDATE Mam teraz czas, aby znaleźć lokalną bazę danych oracle i uruchomić ten sam prosty test. Ta karta testowa jest taka, jak się spodziewałam.
Ie mogę uruchomić kwerendę tak często, jak chcę, i to zwróci null aż 1st transakcja zobowiązuje, a następnie zwraca 2.
Czy istnieje sposób, aby SQL Server pracy takiego? czy musimy przenieść się do Oracle?
jakie indeksy posiadasz na tych stołach? masz regularną konserwację indeksu? –
Brak obecnie indeksów. Zobacz prosty przykład wymieniony w tym poście, do odtworzenia tego problemu służą tylko prosta tabela 2 kolumn, podstawowa wstawka i wybierz. – stevemac