2012-03-28 35 views
6

Tôi đã tự hỏi nếu có bất kỳ sự khác biệt về hiệu suất giữa hai cách tiếp cận bên dưới. Về cơ bản, vấn đề là chúng tôi cho phép dấu cách và dấu gạch ngang trong id nhưng một số ứng dụng kế thừa nhất định không thể sử dụng chúng để chúng bị loại bỏ. Theo như tôi có thể thấy cách gọn gàng nhất để làm điều này là kích hoạt hoặc là cột được tính toán. SQL được hiển thị bên dưới (được dọn dẹp và ẩn danh để xin lỗi nếu có lỗi xảy ra) Cho đến nay trên máy chủ thử nghiệm của chúng tôi, dường như không có bất kỳ sự khác biệt nào giữa hai phương pháp, có ai khác có đầu vào không?Thay vì Kích hoạt hoặc Cột được Tính? cái nào tốt hơn?

[Cơ sở dữ liệu SQL Server 2008] [Lookup bảng 20000000 hàng và phát triển]

Lựa chọn 1 - Tạo kích hoạt

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 

Versus Lựa chọn 2 - sử dụng một cột tính

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 
) 

Cái nào là tốt nhất?

Trả lời

4

Cột được tính toán sẽ là tốt nhất.

Kích hoạt INSTEAD OF sẽ tạo toàn bộ bảng inserted giả ở số tempdb trước.

Plan

Đối với phiên bản kích hoạt với CREATE TABLE tuyên bố của bạn (không nhóm PK trên một đống)

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 

Cung cấp cho tôi

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 

Trong khi phiên bản cột tính là tương tự nhưng tránh số đọc worktable.

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

Có lý do nào để bạn duy trì giá trị này không? (trái ngược với việc có cột được tính không liên tục)

+0

Tôi nghĩ rằng tôi cần phải duy trì cột được tính toán vì cột này đang được sử dụng như một phần của chỉ mục. (http://msdn.microsoft.com/en-us/library/ms189292.aspx#BKMK_persisted) Điều đó có đúng không? –

+0

@EoinO - Không. Không phải cho trường hợp này, chỉ cho các giá trị không chính xác (float) hoặc các hàm/kiểu CLR. –

+1

Cảm ơn @Martin, Câu trả lời của bạn đã thực sự mang tính thông tin! Re: lưu ý lâu dài, nếu bạn đang chạy qua hàng ngàn hồ sơ, liệu giá trị này có được tính toán mọi lúc không? –

Các vấn đề liên quan