데이터베이스 프로파일 동안 나는 액세스 얻을 약간의 비 결정적 함수를 참조하는 뷰 건너 온 분당 1000-2500 번 에 대한 각 이 응용 프로그램의 풀에서 연결을. SELECT
보기에서 단순 하면 다음과 같은 실행 계획이 생성됩니다.
이는 몇 개월마다 한두 행씩 바뀌는 행이 수천 개 미만인 뷰에 대한 복잡한 계획처럼 보입니다. 그러나 다음과 같은 다른 준수로 인해 악화됩니다.
- 중첩 된 뷰는 비 결정적이므로 인덱스 할 수 없습니다.
- 각 뷰는 여러
UDF
개의을 참조 하여 문자열을 만듭니다. - 각 UDF에는
UDF
현지화 된 언어에 대한 ISO 코드를 얻기 위해 중첩 된 s가 포함되어 있습니다. - 스택의 뷰는 s 에서 리턴 된 추가 문자열 빌더
UDF
를JOIN
술부로 사용합니다. - 각 뷰 스택이 있다는 것을 의미하는 테이블로 취급
INSERT
/UPDATE
/DELETE
기본 테이블에 기입하는 각 트리거 - 뷰의 이러한 트리거 는 이러한 문자열 작성을 더 참조
CURSORS
하는EXEC
저장 프로 시저를 사용 합니다UDF
.
이것은 나에게 썩은 것처럼 보이지만 TSQL에 대한 경험은 몇 년 밖에 없습니다. 나아진다!
이것이 좋은 아이디어라고 결정한 개발자는이 모든 것을 수행하여 저장된 수백 개의 문자열 UDF
이 스키마별로 반환 된 문자열을 기반으로 번역 할 수 있도록했습니다 .
스택의 뷰 중 하나는 다음과 같습니다.
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
UDF
s가 JOIN
술어 로 사용되는 이유는 다음과 같습니다 . I18NID
칼럼을 연결함으로써 형성된다 :STRING + [ + ID + | + ID + ]
이것들을 테스트하는 동안 SELECT
뷰에서 간단한 것은 ~ 309 행을 반환하고 실행하는 데 900-1400ms가 걸립니다. 문자열을 다른 테이블에 덤프하고 인덱스를 때리면 동일한 선택이 20-75ms에 반환됩니다.
그래서, 긴 이야기의 짧은 내가 선한 사마리아인과가되고 싶어요 (나는 당신이 sillyness의 일부를 감사 바랍니다) 재 설계 및 않습니다이 제품을 실행하는 클라이언트의 99 %에 대한 다시 쓰기이 없는 모든 -에서 지역화를 사용 -최종 사용자는 [en-US]
영어가 제 2/3 언어 인 경우에도 로케일 을 사용해야합니다 .
이것은 비공식적 인 해킹이므로 다음을 생각하고 있습니다.
- 원래 기본 테이블에서 완전히 조인 된 데이터 집합으로 채워진 새 문자열 테이블을 만듭니다.
- 테이블을 인덱싱하십시오.
- 최상위 스택을 포함 조회수의 여분의 세트 작성
NVARCHAR
및INT
용 컬럼WKType
및WKIndex
컬럼. - 소수의 수정
UDF
일부 Join 술어 피하기 형식 변환에 이러한 뷰를 참조들 (우리의 가장 큰 감사 테이블은 500-2,000M 행과 저장한다 인INT
A의NVARCHAR(4000)
에 참여하는 데 사용되는 열WKIndex
(열INT
).) - 뷰 스키마 화
- 뷰에 몇 가지 인덱스 추가
- 커서 대신 세트 로직을 사용하여 뷰에서 트리거를 다시 작성하십시오.
이제 내 실제 질문 :
- 뷰를 통해 지역화 된 문자열을 처리하는 가장 좋은 방법이 있습니까?
UDF
스텁으로 사용하기위한 대안 은 무엇입니까? (VIEW
각 스키마 소유자마다 고유 한 내용 을 작성 하고 다양한UDF
스텁 에 의존하는 대신 언어를 하드 코딩 할 수 있습니다 .)- 중첩 뷰를 정규화
UDF
한 다음 뷰 스택을 스키마 바인딩하여 이러한 뷰를 간단하게 결정 론적으로 만들 수 있습니까 ?
UDF
정의도 게시하십시오 . 또한 T-SQL 사용자 정의 함수를