Kami memiliki gudang data dengan jumlah catatan yang cukup besar (10-20 juta baris) dan sering menjalankan kueri yang menghitung catatan antara tanggal tertentu, atau menghitung catatan dengan bendera tertentu, misalnya
SELECT
f.IsFoo,
COUNT(*) AS WidgetCount
FROM Widgets AS w
JOIN Flags AS f
ON f.FlagId = w.FlagId
WHERE w.Date >= @startDate
GROUP BY f.IsFoo
Performanya tidak buruk, tetapi bisa relatif lamban (mungkin 10 detik pada cache dingin).
Baru-baru ini saya menemukan bahwa saya dapat menggunakan GROUP BY
dalam tampilan yang diindeks dan mencoba sesuatu yang mirip dengan yang berikut ini
CREATE VIEW TestView
WITH SCHEMABINDING
AS
SELECT
Date,
FlagId,
COUNT_BIG(*) AS WidgetCount
FROM Widgets
GROUP BY Date, FlagId;
GO
CREATE UNIQUE CLUSTERED INDEX PK_TestView ON TestView
(
Date,
FlagId
);
Akibatnya kinerja kueri pertama saya sekarang <100 ms, dan tampilan & indeks yang dihasilkan adalah <100rb (meskipun jumlah baris kami besar, kisaran tanggal dan ID bendera berarti bahwa tampilan ini hanya berisi 1000-2000 baris).
Saya berpikir bahwa mungkin ini akan melumpuhkan kinerja menulis ke tabel Widget, tetapi tidak - kinerja menyisipkan dan pembaruan ke dalam tabel ini cukup banyak yang tidak terpengaruh sejauh yang saya tahu (ditambah, menjadi gudang data, tabel ini diperbarui jarang. bagaimanapun)
Bagi saya, ini kelihatannya terlalu bagus untuk menjadi kenyataan - bukan? Apa yang harus saya perhatikan saat menggunakan tampilan yang diindeks dengan cara ini?
SELECT
danCREATE VIEW
salah, karena saya percayaCREATE INDEX
skrip Anda .