Aracılığıyla paylaş


Dizin oluşturulmuş görünümler DBCC hatalarda sorun giderme

dizinli görünüm, görünümün temel tablolarından bilgi işlem tarafından bulunan satırları aynı içerip içermediğini görmek için DBCC CHECKDB ve DBCC CHECKTABLE kullanabilirsiniz.DBCC 8907 veya saklı görünümün hesaplanan görünümüne aynı olduğunu gösteren, 8908 hatası döndürürse bu sorunu gidermek için aşağıdakileri göz önünde bulundurun.

Bilgisayarınızın görünüm tanımı, ipuçları içeriyor mu?

Içinde SQL Server 2000, NOLOCK gibi tablo ipuçları içeren dizin oluşturulmuş görünümler oluşturabilirsiniz. Bazı durumlarda, bu dizinli görünüm bozulmasına neden olabilir.Görünümünüze tablo ipuçları içeriyorsa, görünümü bırakma gibi ipuçları kaldırmak için tanımını düzenlemek ve onu yeniden.Sonra dizini görünümünde yeniden oluşturun.

dizinli görünüm, türü float veya gerçek değerleri üzerinde toplamak bir toplamak hesaplamak mu?

Bu durumda, yalnızca farklar dizinli görünüm ve hesaplanan görünümü arasında Toplanan sütundaki ve farklar depolanan ve hesaplanan ilgili satır için küçük?Verilerinizi ve uygulama düşünmeden olmayan önemli oldukları düzeltici eylem gereklidir.

Önemli bir fark varsa, dizin görünümü üzerinde bırakın ve onu yeniden oluşturun.Bozulmanın büyük olasılıkla yaklaşık kayan noktalı aritmetik yapısı nedeniyle bu durumda olur.Sipariş numaralarını dizinlenmiş görünümün bakım sırasında eklenen, bazen nihai sonucu genellikle küçük bir etkisi olabilir.Yaklaşık veri türleri'ni kullanma hakkında daha fazla bilgi için bkz: Ondalık, float ve gerçek veri kullanma. Uygulamanız, kayan nokta türü kullanır, ancak gereksinimlerinizi tam ondalık türü () bir kullanarak karşılanabileceğinumeric, money, veya decimal), kullanmayı düşünün numeric Bunun yerine, yeniden düzenlenen bir sürümünün, dizinli görünüm.

dizinli görünüm türü değerleri üzerinde toplamak yoksa float veya real ve hataları 8907 veya 8708 aldığınızda, dizin görünümü üzerinde bırakın ve onu yeniden.

DIZINI yeniden OLUşTURMAK ALTER dizini yeniden oluþturma önce Görünüm yeniden değil çünkü depolanan ve hesaplanan görünümü arasındaki farkları kaldırmak için ALTER DIZINI yeniden OLUşTURMAK kullanmayın.

DBCC CHECKTABLE dizini görünümünde yeniden sonra yok fark kalmasını doğrulamak için görünümünü çalıştırın.Farkları kalırsa, donanım veya diğer sorunları olası bir neden göz önünde bulundurun.

Dizin oluşturulmuş ve hesaplanan görünümler arasındaki farkları önemli olduğunu nasıl belirler?

dizinli görünüm ve hesaplanan görünümü arasındaki farklar hiçbir şey dışında bir toplamak küçük farklılıkları olan toplamak bir float veya real değer, büyük olasılıkla önemli fark var. Bu gibi durumlarda, bırakın ve dizini görünümünde yeniden oluşturmanız gerekir.Olup olmadığını üzerinden yalnızca TOPLA görünümler arasında bir fark bir float veya real değeri ve görünümü küçük, dizinlenmiş ve hesaplanan görünümü görsel olarak karşılaştırmak ve önemli farklılıkları olup karar verin. Bir görünümü için ViewName, hesaplanan ve depolanan değerleri gibi edinin:

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

Mutlak veya yüzde farkı nonequal satırlar için aynı zamanda aynı grup için önemli farklılıkları olup olmadığını belirlemek için toplu bir görünüm bakmak yararlı.Örneğin, aşağıdaki komut dosyası dizinli görünüm ve biraz farklı bir hesaplanan görünümü Karşılaştırılacak gösterilmiştir.Komut dosyası, aynı grubu için depolanan ve Hesaplanmış toplamların farklı olan satır çiftleri görüntüler.

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

Farklı bir TOPLAM değeri ve, tek bir grubun sahip sonucu gösterir fark sum_b_diff çok küçüktür.