Arka fon
Ben büyük bir sağlık kayıtları DB (yazma SP'ler, fonksiyonlar, işler, vb.) İçin çok sayıda büyük raporlar yazarım ve genellikle saklarım. Orijinal şema ve onu kullanan yazılım farklı bir satıcıdan, bu yüzden yapısal olarak çok fazla değiştiremiyorum. Laboratuarlar, prosedürler, aşılar, vb.Gibi izleme gerektiren birçok kayıt vardır ve birçoğu şişirilmiş ve zayıf endekslenmiş düzinelerce tabloya dağılmıştır (Bunu biraz düzeltebildim).
Sorun
Sorun, DB üzerinde çok az kontrole sahip olduğumuz ve herhangi bir güncelleme veya yamadan değişebileceğinden, özellikle büyük miktarda çakışma olduğunda bu raporların yazılmasını ve sürdürülmesini zor ve sıkıcı hale getirmesidir. Tek gereken bir yama ve bir düzine raporun büyük bölümlerini yeniden yazmakta kaldım. Buna ek olarak, birleştirmeler, iç içe yerleştirmeler seçtikleri ve yığın oluşturdukça sorgular hızla gizlenir ve yavaşlar.
Çözümüm"
Planım, tüm bu kayıtları bir "tümünü yakala" tablosuna yazmak ve bu toplu tabloda kayıtları korumak için orijinal tablolara tetikleyiciler yazmaktı. Tabii ki, güncellemelerden sonra tetikleyicilerimin sağlam olduğundan emin olmalıyım, ancak bu sürdürülebilirlik açısından çok daha kolay ve sadece verileri referans alarak daha kolay olurdu.
Tablo ince ve uzun olacak, yalnızca gerekli verileri depolayacaktı:
CREATE TABLE dbo.HCM_Event_Log (
id INT IDENTITY,
type_id INT NULL,
orig_id VARCHAR(36) NULL,
patient_id UNIQUEIDENTIFIER NOT NULL,
visit_id UNIQUEIDENTIFIER NULL,
lookup_id VARCHAR(50) NULL,
status VARCHAR(15) NULL,
ordered_datetime DATETIME NULL,
completed_datetime DATETIME NULL,
CONSTRAINT PK_HCM_Event_Log PRIMARY KEY CLUSTERED (id)
)
Sonra type_id ve item groupings gibi şeyler için çeşitli ilişkisel tabloları olurdu.
Bu tabloların birçoğu biraz yazıldığından, bu fikri tahmin etmeye ikinci olarak başlıyorum, yazacağım SP'ler ve raporlar da verilere çok referans verecekti. Bu yüzden bu tablonun çok fazla G / Ç ile kayıt kilitleme ve performans kabusu haline gelmesinden endişe ediyorum.
Benim sorum
Kötü mü iyi bir fikir mi? SQL Server (2008 r2 Standard Edition BTW) ve "bazen" kuralında her durumun farklı olduğunu anlıyorum, ama gerçekten sadece genel tavsiye arıyorum.
Bir servis aracısı kullanmayı düşünmeye başladım, ancak yalnızca basit güncellemeler / ekler yapıyordum ( Kabul edilen cevaba alternatifi inceleyin ). Birçok durumda verilerin gerçek zamanlı olması gerekir, bu nedenle yedek bir DB kullanmak gerçekten işe yaramaz. Performans zaten bizim için bir sorun, ancak bunların çoğu yakında çözülecek olan donanımla ilgili.