2009-08-31 16 views
5

czytałem artykuły, takie jak: http://www.codinghorror.com/blog/archives/001166.html http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005-Snapshots.htmJak zmienić strategię blokowania w SQL Server?

A z tego co rozumiem, SQL Server ma bardzo pesymistyczny strategię blokowania. Aby poprawić wydajność, powinienem zmienić blokadę Read Committed Snapshot.

Ale nie mogę znaleźć, gdzie to zrobić. Gdzie mogę zmienić strategię blokowania?

Odpowiedz

5

Możesz przeczytać na Using Row Versioning-based Isolation Levels z przykładami, jak ustawić je za pomocą polecenia ALTER.

To jest ustawiona na poziomie bazy danych w następujący sposób:

ALTER DATABASE YourDatabaseName SET READ_COMMITTED_SNAPSHOT ON; 

Lepszym punktem wyjścia jest rodzicem powyższej dokumentacji, która obejmuje tematy związane z: Row Versioning-based Isolation Levels in the Database Engine.

EDYCJA: dodano linki wymienione w moich komentarzach poniżej.

+0

OK, ale jak sprawdzić, jaki jest obecny poziom izolacji? Czy ten poziom izolacji ma zastosowanie tylko do zapytań działających w transakcjach lub wszystkich zapytań? – Allrameest

+1

Można uruchomić DBCC USEROPTIONS, a jedną z zwróconych pozycji będzie bieżące ustawienie "poziomu izolacji". Oto link MSDN: http://msdn.microsoft.com/en-us/library/ms180065.aspx –

+0

Jeśli chodzi o drugą część twojego pytania, aby użyć poziomu izolacji w transakcji, musisz go ustawić za pomocą "USTAWIENIE POZIOMU ​​IZOLACJI USTAWIENIA TRANSAKCJI" przed instrukcją "BEGIN TRAN". Tak więc rozumiem, że ma ona wpływ tylko na zapytania transakcyjne, za które wyraźnie je zadeklarowano. Przykładem tego są powyższe linki. Przyjemny artykuł wyjaśniający to można również przeczytać tutaj: http://www.databasejournal.com/features/mssql/article.php/3566746/Controlling-Transactions-and-Locks-Part-5-SQL-2005-Sapshots.htm –

1

Użycie poziomu izolacji SNAPSHOT doda dużo obciążenia do tempdb w miarę wzrostu obciążenia bazy danych.

Zmiana metod blokowania najlepiej wykonywać za pomocą podpowiedzi blokujących w zapytaniach lub zmieniając POZIOM ISOLACJI ogólnie dla procedury składowanej lub połączenia. Dokonuje się tego za pomocą polecenia SET ISOLATION LEVEL lub zmieniając poziom izolacji na obiekcie połączenia w .NET.

Jeśli chcesz, aby program SQL Server obsługiwał blokowanie na poziomie innym niż domyślny poziom strony (np. Blokowanie na poziomie wiersza), który musi być obsługiwany na poziomie instrukcji za pomocą instrukcji WITH (ROWLOCK) w sprawozdania.

UPDATE YourTable (WITH ROWLOCK) 
    SET Col2 = 3 
WHERE Col1 = 'test' 

Nie istnieje ustawienie globalne zmiany tego poziomu blokady, a jeśli dulka jest stosowany w połączeniu z operacjami poziom izolacji migawka nadal będzie odbywać się na poziomie strony jako cała strona ma zostać skopiowany od do Baza danych tempdb jest następnie aktualizowana, a następnie stara wersja musi zostać usunięta z bazy danych tempdb.

+0

-1 Nie można wybrać "READ_COMMITTED_SNAPSHOT" przez SET ISOLATION LEVEL, lub przez obiekt połączenia .NET. Musisz ZMIENIAĆ BAZY DANYCH, jak w odpowiedzi Ahmada Mageeda. – Andomar

+0

@Andomar Tak, jeśli zamierzasz używać SNAPSHOT, musisz go włączyć na poziomie bazy danych. Aby transakcje tego używały, musisz nadal używać parametru SZYBKOŚĆ POZIOMU ​​USTAWIENIA TRANSAKCJI, aby poziom izolacji tej transakcji używał SNAPSHOT zamiast polecenia READ COMMITTED, który jest zawsze domyślny. – mrdenny

0

Można ustawić poziom izolacji blokada po skonfigurowaniu połączenia z bazą danych, wywołując

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

gdzie pracuję robimy to dla każdego połączenia Założyliśmy, wszystkie są ustawione w to samo miejsce, w którym korzystamy ze wspólnej puli połączeń w celu uzyskania dostępu do bazy danych. Opcja READ UNCOMMITTED dotyczy wszystkich instrukcji wydanych przez to połączenie.

+0

Hmm Nie polecam ustawiania 'CZYTAJ NIEZMIENIONO' na całej płycie - to naprawdę zależy od korzystania z bazy danych. SQL Server 2005+ wspiera izolację migawek, która zasadniczo wiersza wersje wierszy w podobny sposób jak działa Oracle. – pjp

+0

Dezorientujesz "Read Committed Snapshot" z "Read Uncommitted". To pierwsze jest stosunkowo nieznanym ustawieniem, którego nie można wybrać przy "ustawionym poziomie izolacji transakcji", patrz post Ahmada Mageeda. – Andomar

Powiązane problemy