2012-03-28 21 views
6

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?

cevap

4

Hesaplanan sütunlar en iyi olacaktır.

INSTEAD OF tetikleyicisi, ilk olarak tempdb numaralı belgede tüm sahte inserted tablosunu oluşturacaktır. senin CREATE TABLE deyimi (Bir yığın olmayan kümelenmiş PK)

SET STATISTICS IO ON; 

INSERT INTO [_test].[dbo].[Mem_lkup] 
      ([ex_id] 
      ,[contact_gid] 
      ,[id_type_code] 
      ,[date_time_created]) 
SELECT type AS [ex_id] 
     ,1 [contact_gid] 
     ,'A' [id_type_code] 
     ,getdate() [date_time_created] 
    FROM master..spt_values 

bana hesaplanmış sütun sürümü Oysa

Table 'Worktable'. Scan count 0, logical reads 5076 
Table 'spt_values'. Scan count 1, logical reads 15 

Table 'Mem_lkup'. Scan count 0, logical reads 7549 
Table 'Worktable'. Scan count 1, logical reads 15 

verir ile tetik versiyonu için

Plan

benzer ancak önler worktable okur.

Table 'Mem_lkup'. Scan count 0, logical reads 7555 
Table 'spt_values'. Scan count 1, logical reads 15 

Bu değere rağmen ısrar etmenin bir sebebi var mı? (kalıcı olmayan bir hesaplama sütununa sahip olmanın aksine)

+0

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? –

+0

@EoinO - Hayır. Bu durum için değil, sadece kesin olmayan (float) değerler veya CLR fonksiyonları/tipleri için değil. –

+1

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ı? –

İlgili konular