Trong khi định hình một cơ sở dữ liệu, tôi đã bắt gặp một khung nhìn đang tham chiếu một số hàm không xác định được truy cập 1000-2500 lần mỗi phút cho mỗi kết nối trong nhóm ứng dụng này. Một đơn giản SELECT
từ khung nhìn mang lại kế hoạch thực hiện sau:
Đó dường như là một kế hoạch phức tạp cho một chế độ xem có ít hơn một nghìn hàng có thể thấy một hoặc hai hàng thay đổi cứ sau vài tháng. Nhưng nó trở nên tồi tệ hơn với các quan sát khác sau đây:
- Các khung nhìn lồng nhau là không xác định, vì vậy chúng tôi không thể lập chỉ mục cho chúng
- Mỗi khung nhìn tham chiếu nhiều
UDF
s để xây dựng chuỗi - Mỗi UDF chứa các
UDF
s lồng nhau để lấy mã ISO cho các ngôn ngữ được bản địa hóa - Lượt xem trong ngăn xếp đang sử dụng các trình tạo chuỗi bổ sung được trả về từ
UDF
s làmJOIN
vị ngữ - Mỗi ngăn xếp xem được coi là một bảng, có nghĩa là có
INSERT
/UPDATE
/DELETE
kích hoạt trên mỗi bảng để ghi vào các bảng bên dưới - Những trigger trên quan điểm sử dụng
CURSORS
rằngEXEC
thủ tục được lưu trữ mà tham khảo thêm các chuỗi tòa nhàUDF
s.
Điều này có vẻ khá thối với tôi, nhưng tôi chỉ có vài năm kinh nghiệm với TSQL. Nó cũng trở nên tốt hơn!
Có vẻ như nhà phát triển đã quyết định rằng đây là một ý tưởng tuyệt vời, đã làm tất cả những điều này để vài trăm chuỗi được lưu trữ có thể có một bản dịch dựa trên một chuỗi được trả về từ một chuỗi UDF
cụ thể.
Đây là một trong những khung nhìn trong ngăn xếp, nhưng chúng đều tệ như nhau:
CREATE VIEW [UserWKStringI18N]
AS
SELECT b.WKType, b.WKIndex
, CASE
WHEN ISNULL(il.I18NID, N'') = N''
THEN id.I18NString
ELSE il.I18nString
END AS WKString
,CASE
WHEN ISNULL(il.I18NID, N'') = N''
THEN id.IETFLangCode
ELSE il.IETFLangCode
END AS IETFLangCode
,dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex, N'WKS') AS I18NID
,dbo.UserI18N_Session_Locale_Key() AS IETFSessionLangCode
,dbo.UserI18N_Database_Locale_Key() AS IETFDatabaseLangCode
FROM UserWKStringBASE b
LEFT OUTER JOIN User3StringI18N il
ON (
il.I18NID = dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex, N'WKS')
AND il.IETFLangCode = dbo.UserI18N_Session_Locale_Key()
)
LEFT OUTER JOIN User3StringI18N id
ON (
id.I18NID = dbo.User3StringI18N_KeyValue(b.WKType, b.WKIndex,N'WKS')
AND id.IETFLangCode = dbo.UserI18N_Database_Locale_Key()
)
GO
Đây là lý do tại sao UDF
s đang được sử dụng như JOIN
vị ngữ. Các I18NID
cột được hình thành bằng cách ghép:STRING + [ + ID + | + ID + ]
Trong quá trình thử nghiệm, một đơn giản SELECT
từ chế độ xem trả về ~ 309 hàng và mất 900-1400ms để thực thi. Nếu tôi kết xuất các chuỗi vào một bảng khác và đặt một chỉ mục trên đó, cùng một lựa chọn sẽ trả về trong 20-75ms.
Vì vậy, câu chuyện dài (và tôi hy vọng bạn đánh giá cao một số điều ngớ ngẩn này) Tôi muốn trở thành một người Samari tốt và thiết kế lại và viết lại điều này cho 99% khách hàng đang chạy sản phẩm này không sử dụng bất kỳ nội địa hóa nào- người dùng -end dự kiến sẽ sử dụng [en-US]
ngôn ngữ ngay cả khi tiếng Anh là ngôn ngữ thứ 2/3.
Vì đây là một hack không chính thức, tôi nghĩ về những điều sau đây:
- Tạo một bảng Chuỗi mới được điền với một tập hợp dữ liệu được nối sạch từ các bảng cơ sở ban đầu
- Lập chỉ mục bảng.
- Tạo một tập hợp thay thế các chế độ xem cấp cao nhất trong ngăn xếp bao gồm
NVARCHAR
vàINT
các cột cho các cộtWKType
vàWKIndex
cột. - Sửa đổi một số ít
UDF
tham chiếu các chế độ xem này để tránh chuyển đổi loại trong một số vị từ tham gia (bảng kiểm toán lớn nhất của chúng tôi là 500-2.000M hàng và lưu trữINT
mộtNVARCHAR(4000)
cột được sử dụng để nối vớiWKIndex
cột (INT
).) - Schemabind quan điểm
- Thêm một vài chỉ mục để xem
- Xây dựng lại các kích hoạt trên các khung nhìn bằng cách sử dụng bộ logic thay vì con trỏ
Bây giờ, câu hỏi thực tế của tôi:
- Có một phương pháp thực hành tốt nhất để xử lý các chuỗi cục bộ thông qua một khung nhìn không?
- Những lựa chọn thay thế tồn tại để sử dụng
UDF
như một sơ khai? (Tôi có thể viết một cụ thểVIEW
cho từng chủ sở hữu lược đồ và mã hóa ngôn ngữ thay vì dựa vào nhiều loại sơUDF
khai.) - Những khung nhìn này có thể được thực hiện một cách đơn giản bằng cách xác định đầy đủ các
UDF
s lồng nhau và sau đó lập sơ đồ các ngăn xếp khung nhìn không?
UDF
định nghĩa của bạn là tốt. Ngoài ra, hãy tham khảo các Hàm do người dùng T-SQL xác định: tốt, xấu và xấu