Czasami pojawia się komunikat „Nie można kontynuować skanowania z NOLOCK
powodu przenoszenia danych” w przypadku niektórych dużych zadań, które WITH (NOLOCK)
dotyczą wybranych zapytań.
Rozumiem, że ma to coś wspólnego z próbą wybrania danych, gdy nastąpił podział strony, który spowodował, że dane nie były już tam, gdzie powinny być - Zakładam, że tak właśnie dzieje się w moim środowisku.
Jak mam to odtworzyć?
Próbuję zrobić krótkoterminowe obejście, aby złapać błąd i spróbować ponownie, gdy to się stanie, ale nie mogę go przetestować, jeśli nie mogę go odtworzyć. Czy istnieje rozsądnie niezawodny sposób na spowodowanie tego?
Kiedy tak się stanie, ponowne wykonanie zapytania zakończy się sukcesem - więc tak naprawdę nie mam obaw o trwałe uszkodzenie danych lub bazy danych. Niektóre tabele w zapytaniu (wraz z ich indeksami) są często usuwane, ponownie tworzone i ponownie wypełniane, więc zakładam, że jest to z tym związane.
Usunięcie NOLOCK
jest moim długoterminowym problemem do rozwiązania. Powodem tego NOLOCK
było przede wszystkim to, że zapytania były tak złe, że blokowały się w codziennych transakcjach, podobnie NOLOCK
jak pomoc dla zespołu, aby zatrzymać impas (który zadziałał). Potrzebuję więc opaski na opasce, dopóki nie możemy zrobić trwałego rozwiązania.
Gdybym mógł to odtworzyć w Hello World, planowałbym prawdopodobnie nakleić pomoc zespołu na pracę w niecałą godzinę. Nie można usunąć wyszukiwania i zastąpienia NOLOCK
, ponieważ zacznę ponownie dostawać się impasów aplikacji, które są dla mnie gorsze niż okazjonalne nieudane zadanie.
Dobrym rozwiązaniem jest użycie izolacji odczytu zatwierdzonych migawek - będę musiał współpracować z naszym zespołem bazy danych, aby uzyskać więcej informacji na ten temat. Częścią naszego problemu jest to, że nie mamy eksperta od SQL Servera, który poradziłby sobie z tego rodzaju sprawami i nie rozumiem poziomów izolacji wystarczająco dobrze, aby dokonać tej zmiany teraz.
źródło
NOLOCK
z tych miejsc pracy? 601 powinno być najmniejszym z twoich zmartwień, jeśli wyniki tych zapytań mają być dokładne . Paul White pokazuje szczególnie okropny przykład odczytu danych, który nie powinien być tutaj możliwy .DEADLOCK_PRIORITY
, abyLOW
w pracy, tak, że jeśli istnieje zakleszczenia, zadania zakończy się niepowodzeniem, a nie aplikacji. Następnie możesz zbadać impasy i dowiedzieć się, dlaczego tak się dzieje, i rozwiązać ten problem. Może to być bardzo prosta poprawka, na przykład zamiana kolejności dwóch instrukcji. Jakikolwiek jest problem, nieNOLOCK
jest to rozwiązanie , więc przestań próbować wymuszać, aby było tak tylko dlatego, że jest to najłatwiejsze.Odpowiedzi:
Ponieważ jedną z potencjalnych „pomocy zespołu” w kwestiach NOLOCK jest zaprzestanie używania NOLOCK i rozpoczęcie korzystania z izolacji READ_COMMITTED_SNAPSHOT, chcę skierować cię do postu na blogu na stronie http://www.brentozar.com autorstwa Kendry Little: Implementacja migawki lub przeczytanie Izolacja migawek w programie SQL Server: przewodnik .
Kendra zapewnia sporo szczegółów na temat korzyści i ryzyka związanych z użyciem poziomu izolacji READ_COMMITTED_SNAPSHOT.
Kilka lat temu wdrożyliśmy izolację READ_COMMITTED_SNAPSHOT w bazie danych, która poważnie cierpiała z powodu blokowania . Ale kiedy zmieniliśmy poziom izolacji, zaczęliśmy otrzymywać impasy w kilku krytycznych obszarach.
Dlaczego się to stało? Ponieważ poprzedni poziom izolacji powodował silne blokowanie, kod „nigdy” nie może osiągnąć punktu zakleszczenia. Jednak dzięki izolacji READ_COMMITTED_SNAPSHOT zapytania mogą iść naprzód. Jednak pewien procent nieużywanych transakcji zaczął się blokować.
Na szczęście nasza sprawa została szybko rozwiązana poprzez określenie punktów zakleszczenia i dostosowanie indeksów w kilku tabelach, aby uzyskać bardziej racjonalną kolejność kolumn. To znacznie zmniejszyło nasze problemy z blokowaniem.
źródło