Aracılığıyla paylaş


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

dizinli görünüm ana tablodaki görünüm hesaplayarak bulundu aynı satır içerip içermediğini görmek için dbcc checkdb ve dbcc checktable kullanabilirsiniz.dbcc 8907 veya saklı görünümünde hesaplanan görünümü, aynı olduğunu belirtmek, 8908, hata verirse bu sorunu çözmek için aşağıdakileri göz önünde bulundurun.

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

De SQL Server 2000, gibi tablo ipuçlarını içeren dizin oluşturulmuş görünümler oluşturmanolock. Bazı durumlarda, bu dizinli görünüm bozulmasına yol açabilir.Görünümünüzü tablo ipuçlarını içeriyorsa, Görünüm bırakın Bu tür ipuçları kaldırmak için kendi tanımını düzenlemek ve yeniden.Sonra Görünüm dizini yeniden oluşturun.

dizinli görünüm türü float veya gerçek değer toplu toplu hesaplaması yapmıyor?

Bu durumda, dizinli görünüm ve hesaplanan görünümü arasındaki tek fark, toplanan sütun ve farklar depolanan ve hesaplanan karşılık gelen satırlar için küçük?Veri ve uygulama, düşünmeden değil önemli olsalar, herhangi bir düzeltici Eylem gereklidir.

Önemli farklar, Görünüm dizin bırakın ve yeniden oluşturma.Bu bozulma durum yaklaşık kayan doğası nedeniyle büyük bir olasılıkla kaynaklanıyor.Sayılar dizinli görünüm bakım sırasında eklediğiniz sırada bazen sonuç üzerinde genellikle küçük bir etkiye sahip olabilir.Yaklaşık veri türleri'ni kullanma hakkında daha fazla bilgi için bkz: Ondalık, kayan nokta ve gerçek veri kullanma.Uygulamanızın kayan nokta türü kullanır, ancak gereksinimlerinizi tam bir ondalık türü kullanarak karşılanacağı (numeric, money, veya decimal), kullanmayı düşünün numeric bunun yerine yeniden düzenlenmiş bir sürüm dizinli görünüm.

dizinli görünüm toplu türü değerleri içermiyorsa, float veya real ve alış hatalarının 8907 veya 8708, drop Index görünümünde yeniden it.

alter dizin yeniden alter dizin yeniden oluşturma dizini yeniden oluşturuluyor önce Görünüm hesaplamak için depolanan ve hesaplanan görünümü arasındaki farklar temizlemek için kullanmayın.

dbcc checktable görünüm dizini yeniden oluşturuluyor sonra hiçbir farkı kalması doğrulamak için Görünüm çalıştırın.Fark kalır, donanım ya da diğer sorunlar nedeni düşünün.

Hesaplanan ve dizin oluşturulmuş görünümler arasındaki farklar önemli olup olmadığını nasıl belirleyebilirim?

dizinli görünüm ve hesaplanan görünümü arasındaki farklar bir şey dışında ise toplu küçük farklılıklar, toplu bir float veya real bir değer farklılıkları büyük olasılıkla önemli.Bu gibi durumlarda, bırakın ve Görünüm dizini yeniden oluşturmanız gerekir.Olup üzerinden toplam yalnızca görünümlerde arasında bir fark bir float veya real değeri ve görünümü küçük, görsel olarak hesaplanan ve dizinlenmiş görünüm karşılaştırmak ve farklılıklar önemli olup karar.Bir görünüm için ViewName, hesaplanan ve depolanan değerleri şu şekilde elde edilir:

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

Aynı gruptaki nonequal satırlar için mutlak veya yüzde fark farklar önemli olup olmadığını belirlemenize yardımcı olmak için bir toplu görünümündeki bakmak daha yararlı olabilir.Örneğin, aşağıdaki komut dosyası bir dizinli görünüm ve biraz farklı bir hesaplanan görünümü karşılaştırmak gösterilmiştir.Aynı grup için farklı saklı ve hesaplanan toplamlar satırları çiftleri komut dosyasını 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

Bu yalnızca bir grup olan farklı bir toplam değeri ve sonucu gösterir fark sum_b_diff ise çok küçük.