Aşağıdaki iki yaklaşım arasında herhangi bir performans farkı olup olmadığını merak ediyordum. Temel olarak, sorun bir boşlukta boşluklara ve tire çizgilerine izin vermemizdir, ancak bazı eski uygulamalar bu özellikleri kullanamaz ve bu nedenle çıkarılır. Bunu yapmanın en iyi yolunu görebildiğim kadarıyla ya bir tetikleyici ya da kalibre edilmiş bir sütun olarak. SQL aşağıda gösterilmiştir (temizlenmiş ve anonimleştirilmiş bir hata içeriyorsa özür dileriz) Test sunucularımıza şu ana kadar, iki yöntem arasında herhangi bir fark görünmüyor, başka herhangi bir girdi var mı?Bunun yerine Tetikleyici veya Hesaplanan Sütun mu? Hangisi daha iyi?
[Veritabanı SQL Server 2008] [Arama tablosu 20000000 satır ve büyüyen]
Seçenek 1 - oluştur tetik
CREATE TRIGGER triMem_Lkup on Mem_Lkup
INSTEAD OF INSERT
AS
BEGIN
INSERT INTO Mem_lkup
SELECT ex_id, contact_gid, id_type_code, date_time_created,
(replace(replace([ex_id],' ',''),'-','')) as ex_id_calc
FROM inserted
END
GO
Seçenek 2 Karşı - bir hesaplanan sütun kullanmak
CREATE TABLE [dbo].[Mem_lkup](
[mem_lkup_sid] [int] IDENTITY(1,1) NOT NULL,
[ex_id] [varchar](18) NOT NULL,
[contact_gid] [int] NOT NULL,
[id_type_code] [char] (1) NOT NULL,
[date_time_created] [datetime] NOT NULL,
[ex_id_calc] AS CAST(replace(replace([ex_id],' ','') ,'-','') AS varchar(18)) PERSISTED
CONSTRAINT [PK_Mem_Lkup] PRIMARY KEY NONCLUSTERED
(
[mem_lkup_sid] ASC
)
Hangisi en iyisi?
Bir indeksin parçası olarak kullanıldığı için hesaplanan sütunu devam ettirmem gerektiğini düşündüm. (http://msdn.microsoft.com/en-us/library/ms189292.aspx#BKMK_persisted) Bu doğru değil mi? –
@EoinO - Hayır. Bu durum için değil, sadece kesin olmayan (float) değerler veya CLR fonksiyonları/tipleri için değil. –
Teşekkürler @Martin, Yanıtlarınız gerçekten bilgilendirici oldu! Re: kalıcı yorum, binlerce kayıttan geçiyorsanız, bu değer her seferinde hesaplanır mı? –