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