Symptomy
Załóżmy, że dodano kolumnę do tabeli w programie Microsoft SQL Server 2012 lub SQL Server 2014. Jeśli rozmiar wiersza jest bliski dopuszczalnego rozmiaru 8 060 bajtów, operacja dodawania może trwać długo.
Przyczyna
Ten problem występuje, ponieważ jeśli całkowity rozmiar wiersza jest bliski dopuszczalnego rozmiaru wiersza, program SQL Server przeprowadza pełne skanowanie tabeli w celu upewnienia się, że dodanie nowej kolumny nie narusza integralności danych. Wersje przed wykonaniem programu SQL Server 2012 nie wykonują tego sprawdzenia, co sprawia, że język definicji danych (DDL) działa szybciej. Jednak to zachowanie powoduje niepowodzenie kolejnych operacji, takich jak aktualizacja wierszy lub zmniejszenie, jeśli rozmiar wiersza przekracza dozwolony rozmiar.
Rozwiązanie
Aktualizacja zbiorcza wprowadza nową flagę śledzenia 647 w celu zachowania zgodności z poprzednimi wersjami. Ten problem został po raz pierwszy rozwiązany w poniższej zbiorczej aktualizacji programu SQL Server.
Zbiorcza aktualizacja 5 dla programu SQL Server 2014 /en-us/help/3011055
Zbiorcza aktualizacja 12 dla programu SQL Server 2012 z dodatkiem SP1 /en-us/help/2991533
Zbiorcza aktualizacja 2 dla programu SQL Server 2012 z dodatkiem SP2 /en-us/help/2983175
Każda nowa Zbiorcza aktualizacja programu SQL Server zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji zbiorczej. Zapoznaj się z najnowszymi aktualizacjami zbiorczymi dla programu SQL Server:
Więcej informacji
-
Flagę śledzenia 647 można włączyć przy użyciu parametru uruchamiania. Aby uzyskać informacje, zobacz Opcje uruchamiania usług aparatu bazy danych.
-
Aby przetestować określoną tabelę przed operacją w systemie produkcyjnym i zaplanować jej wpływ, możesz uruchomić następującą kwerendę (Zastąp <nazwy tabeli> nazwą bieżącej tabeli). Jeśli wynik jest większy niż 8 060, tabela podlega temu problemowi. Ponadto, jeśli kolumny zostały opuszczone, należy zmienić tabelę za pomocą opcji Odbuduj. Odbudowanie tabeli może sprawić, że zapytanie zwróci odpowiednie wyniki.
select 1+1+2 + 2 + (case when sum (case when leaf_offset < 0 then 1 else 0 end) > 0 then 2 else 0 end) + ( (count (*) + 7)/8 ) + count (case when leaf_offset < 0 then 1 else null end) * 2 + sum( case when max_length=-1 then 24 else max_length end) from sys.system_internals_partition_columns col join sys.partitions par on col.partition_id = par.partition_id where object_id = object_id ('<table name>') and index_id in (0,1) and partition_number =1
-
Jeśli aplikacja często dodaje nowe kolumny do tabeli, możesz dodać kolumny lub kolumny rozrzedzone o zmiennej długości. Jest to operacja tylko z metadanymi, nawet jeśli całkowity rozmiar wszystkich kolumn przekracza 8 060 bajtów.
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".