Rozwiązywanie problemów z błędami DBCC na widoki indeksowane
Za pomocą DBCC CHECKDB i DBCC CHECKTABLE czy indeksowany widok zawiera tych samych wierszach, wykrytych przez computing widok z tabel bazowych.DBCC zwraca błędy 8907 lub 8908, które wskazują przechowywane widok nie jest identyczne do widoku obliczone, należy rozważyć następujące rozwiązania problemu.
Definicję widoku zawiera wskazówki?
W SQL Server 2000, można tworzyć widoki indeksowane, które zawierają wskazówki tabela, takich jak NOLOCK.Czasami może to prowadzić do uszkodzenia indeksowany widok.Widok zawiera wskazówki dotyczące tabela, upuść widoku, edytowanie jej definicji do usunięcia takich wskazówek i ją odtworzyć.Następnie należy ponownie utworzyć indeks w widoku.
indeksowany widok obliczyć łączna wartość zagregowana nad wartości typu float lub rzeczywistym?
Jeśli tak, są tylko różnice między indeksowany widok i widoku obliczanej kolumna zagregowanych i różnice mały dla odpowiadających im wierszy przechowywane i obliczane?Jeśli nie mają znaczenia, biorąc pod uwagę danych i aplikacji, wymagane jest podejmowana żadna akcja.
W przypadku znaczących różnic porzucić indeksu w widoku i utwórz je ponownie.Uszkodzenie w takim przypadek prawdopodobnie ze względu na charakter przybliżony arytmetykę zmiennopozycyjną.Kolejność, w której liczby są dodawane podczas konserwacji indeksowany widok czasami ogólnie mały wpływ na wynik końcowy.Aby uzyskać więcej informacji na temat typów danych przybliżone, zobacz Za pomocą dziesiętnych, pływak i rzeczywistych danych.Jeśli aplikacja używa zmiennoprzecinkowych typów, ale można spełnić wymagań przy użyciu dokładny typ dziesiętny (numeric, money, lub decimal), należy rozważyć użycie numeric zamiast w poprawionej wersja indeksowany widok.
Jeśli indeksowany widok nie zawiera wartość zagregowana nad wartości typu float lub real i błędów, 8907 lub 8708, upuść indeksu w widoku i ponownie go
Nie używaj ALTER ODBUDOWAĆ indeks do próby usunięcia różnic między przechowywane i obliczanych widoku ponieważ ALTER ODBUDOWAĆ indeks nie obliczyć zanim odbudowanie indeksu.
Po odtwarzanie indeksu w widoku, należy uruchomić DBCC CHECKTABLE w widoku, aby zweryfikować, że nie różnice.Istnieją różnice, jako możliwa przyczyna rozważyć sprzętu lub innych problemów.
Jak ustalić, czy różnice między widoki indeksowane i obliczane są istotne?
Jeżeli różnice między indeksowany widok i widoku obliczone są cokolwiek innego niż małe różnice sumy wartość zagregowana z float lub real wartości są prawdopodobnie znaczące różnice.W tych przypadkach należy upuścić i ponownie utwórz indeks w widoku.Jeżeli istnieje różnica między widokami tylko sumy float lub real wartość i widok jest mały, porównać wizualnie widok indeksowany i obliczeniowe i zdecydować, czy różnice są znaczące.Dla widoku ViewName, pobrać wartości obliczeniowych 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 znaleźć przydatne przyjrzyj się bezwzględną lub procentową różnica nonequal wierszy dla tej samej grupy wartość zagregowana widoku, aby ustalić, czy różnice są znaczące.Na przykład poniższy skrypt pokazuje jak porównać indeksowany widok i obliczanej widok, który się nieco różnić.Skrypt wyświetla pary wierszy dla tej samej grupy, które mają różne sumy obliczeniowe i przechowywane.
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 inną wartość sumy, a różnica sum_b_diff jest bardzo mała.
Zobacz także