Udostępnij za pośrednictwem


Troubleshooting DBCC Errors on Indexed Views

Za pomocą CHECKDB DBCC i CHECKTABLE DBCC czy widok indeksowany znajduje się ten sam wiersze, które znajdują się przez przetwarzania danych w widoku z tabel podstawowych.Jeśli DBCC zwraca błędy 8907 lub 8908, które wskazują, że przechowywane widoku nie jest taka sama, jak obliczana widoku, należy wziąć pod uwagę następujące rozwiązania problemu.

W definicji widoku zawiera wskazówki dotyczące serwerów?

W SQL Server 2000, można utworzyć widoki indeksowane, które zawierają wskazówki dotyczące tabela, takich jak NOLOCK. Czasami może to prowadzić do uszkodzenia widok indeksowany.Jeśli widok zawiera wskazówki dotyczące tabela, upuść w widoku, edytowanie jego definicję, aby usunąć te wskazówki i utworzyć go ponownie.Następnie należy ponownie utworzyć indeks w widoku.

Czy widok indeksowany, obliczyć łączna agregacja wartości typu float lub rzeczywistym za pośrednictwem?

W takim przypadku są tylko różnice między widok indeksowany i obliczane widoku kolumna zagregowane i są różnice mały dla odpowiadających im wierszy przechowywane i obliczane?Jeśli są one nie istotne, biorąc pod uwagę danych i aplikacji, wymagane jest podejmowana żadna akcja.

W przypadku istotnych różnic upuść indeksu w widoku i utworzyć go ponownie.Uszkodzenie w takim przypadek prawdopodobnie ze względu na charakter przybliżony arytmetyczne zmiennoprzecinkowych.Kolejność, w której liczby są dodawane podczas obsługi widok indeksowany, czasami może mieć wpływ na ogół mały na wynik końcowy.Aby uzyskać więcej informacji na temat korzystania z typów przybliżonych danych zobacz Za pomocą po przecinku, float i danych rzeczywistych. Jeśli aplikacja używa zmiennoprzecinkowych typów, ale można spełnić wymagań dotyczących przy użyciu (dokładny typ dziesiętnynumeric, money, lub decimal), warto rozważyć użycie numeric Zamiast tego w poprawionej wersja widok indeksowany.

Jeśli widok indeksowany, nie zawiera agregacja przez wartości typu float lub real i błędów 8907 lub 8708, upuść indeksu w widoku i utworzyć go ponownie.

Nie należy używać instrukcji ALTER ODBUDOWAĆ indeks spróbować usunąć różnice między przechowywane i w widoku obliczaną, ponieważ ALTER ODBUDOWAĆ indeks nie obliczyć widok przed przebudowywanie indeksu.

Po zakończeniu ponowne utworzenie indeksu w widoku, należy uruchomić CHECKTABLE DBCC na widok, aby sprawdzić, czy nie różnice.Jeśli istnieją różnice, za sprzętu lub inne problemy związane z możliwych przyczyn.

Jak ustalić, czy różnice między widoków indeksowanych i obliczane są istotne?

W przypadku różnic między widok indeksowany, jak i w widoku obliczanej niczego innego niż niewielkie różnice w SUM agregacja z float lub real wartość, różnice są prawdopodobnie znaczące. W takich przypadkach należy upuścić i ponowne utworzenie indeksu w widoku.Jeśli istnieje różnica między widokami tylko SUM float lub real wartość i w widoku jest mała, efekty wizualne porównanie widoku indeksowanego i obliczeniowe i zdecydować, czy są znaczące różnice. Aby wyświetlić widok ViewName, pobrać wartości obliczeniowe i przechowywane w następujący sposób:

SELECT * FROM ViewName OPTION(EXPAND VIEWS) -- Get calculated view.
SELECT * FROM ViewName WITH(NOEXPAND)       -- Get stored view.

Może się okazać, że przydatne zobaczyć różnicę bezwzględną lub procentową nonequal wierszy do tej samej grupie agregacja widoku mogą pomóc w ustaleniu, czy są znaczące różnice.Na przykład poniższy skrypt pokazuje, jak porównać widok indeksowany i obliczane widok, w którym się nieco różnić.Skrypt wyświetla pary wierszy dla tej samej grupy, które zawierają różne sumy przechowywanych i obliczeniowe.

IF OBJECT_ID('v') IS NOT NULL DROP VIEW v
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
go
CREATE TABLE t
   (id int NOT NULL PRIMARY KEY, 
    a int NOT NULL, 
    b float(53) NOT NULL)
GO
CREATE VIEW v WITH SCHEMABINDING AS
SELECT a, SUM(b) AS sum_b, COUNT_BIG(*) AS c
FROM dbo.t
GROUP BY a
GO
CREATE UNIQUE CLUSTERED INDEX idx ON v(a)
GO
INSERT t VALUES(1, 1,1.0e1)
INSERT t VALUES(2, 1,1.0e2)
INSERT t VALUES(3, 2, 1.0e0)
INSERT t VALUES(4, 2, 5.0e-17)
INSERT t VALUES(5, 2, 5.0e-17)
INSERT t VALUES(6, 2, 5.0e-17)
GO
DELETE FROM t WHERE id=3
GO
DBCC CHECKTABLE ('v')
GO
-- Show the groups that have different SUMs, 
-- and the difference between the sums.
SELECT *, v1.sum_b - v2.sum_b AS sum_b_diff
FROM (SELECT * FROM v WITH (NOEXPAND)) AS v1,
     (SELECT * FROM v) AS v2
WHERE v1.a=v2.a
AND (v1.sum_b - v2.sum_b) <> 0
OPTION(EXPAND VIEWS)
GO

Wynik pokazuje, że tylko jedna grupa ma inne wartości SUM, a różnica sum_b_diff jest bardzo mała.