2012-03-28 4 views
6

以下の2つの方法の間にパフォーマンスの違いがあるかどうかは疑問でした。 基本的には、IDのスペースとダッシュを許可していますが、一部の従来のアプリケーションではこれらを使用できないため、削除されています。 私が見る限り、これを行うための最もきれいな方法は、引き金や計算された列のいずれかです。 SQLは以下に示されています(エラーが発生した場合には匿名で匿名で返信されます) これまでのテストサーバーでは、2つの方法の違いはありませんでした。代わりにトリガまたは計算列?それは良いですか?

[データベースのSQL Server 2008] [ルックアップテーブル20000000行と成長]

オプション1 - トリガーを作成します

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 

対オプション2 - 計算された列を使用

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 
) 

どちらが最適ですか?

答えて

4

計算された列が最適です。

INSTEAD OFトリガーは、最初にテーブル全体をtempdbに作成します。あなたのCREATE TABLE声明(ヒープ上の非クラスタ化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 

は私の計算列バージョン一方

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 

を与えるとトリガーバージョンについては

Plan

が似ていますが、ことを回避します worktableが読み込まれます。

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

この値を永続させる理由はありますか? (永続化されていない計算カラムを持つのとは対照的に)

+0

計算カラムがインデックスの一部として使用されているため、計算カラムを保持する必要があると思いました。 (http://msdn.microsoft.com/en-us/library/ms189292.aspx#BKMK_persisted) これは間違っていますか? –

+0

@ EoinO - Nope。この場合ではなく、不正確な(浮動小数点)値またはCLR関数/型の場合のみです。 –

+1

ありがとう@Martin、あなたの答えは本当に有益でした! Re:永続的なコメント、何千ものレコードを実行している場合、この値は毎回計算されますか? –

関連する問題