在对数据库进行概要分析时,我遇到了一个视图,该视图引用了一些不确定性函数,对于该应用程序池中的每个连接,每分钟可访问1000-2500次。从视图中看,一个简单的代码将产生以下执行计划:SELECT
对于少于一千行的视图来说,这似乎是一个复杂的计划,每隔几个月可能会看到一两行发生变化。但是随着以下其他情况的恶化,情况变得更糟:
- 嵌套视图是不确定的,因此我们无法为其编制索引
- 每个视图都引用多个
UDF
s来构建字符串 - 每个UDF都包含嵌套
UDF
的,以获取本地化语言的ISO代码 - 堆栈中的视图使用从s 返回的其他字符串构建器
UDF
作为JOIN
谓词 - 每个视图堆被视为一个表,这意味着有
INSERT
/UPDATE
/DELETE
在每个触发器来写入底层表 - 在视图上,这些触发器使用
CURSORS
该EXEC
存储过程作为参考更多的这些串建设UDF
秒。
这对我来说似乎很烂,但是我只有几年使用TSQL的经验。它也会变得更好!
看来开发人员认为这是个好主意,做了所有这些工作,以便所存储的几百个字符串可以基于从UDF
特定于模式的a返回的字符串进行翻译。
这是堆栈中的视图之一,但是它们都同样糟糕:
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内返回。
因此,长话短说(我希望您对这种愚蠢的行为表示赞赏),我想成为一名优秀的撒玛利亚人,并为99%运行该产品的客户完全不使用任何本地化功能进行重新设计和重写, - [en-US]
即使英语是第二/第三语言,最终用户也应使用语言环境。
由于这是非官方的骇客,因此我想到了以下几点:
- 创建一个新的String表,该表中填充有来自原始基础表的干净连接的数据集
- 索引表。
- 在堆栈中创建替换集的顶级视图,其中包括
NVARCHAR
和INT
列的WKType
和WKIndex
列。 - 修改一些
UDF
引用这些视图的,以避免在某些连接谓词中进行类型转换(我们最大的审计表是500-2,000M行,并将a存储INT
在NVARCHAR(4000)
用于与WKIndex
列(INT
)连接的列中)。 - 绑定视图
- 在视图中添加一些索引
- 使用设置逻辑而不是游标在视图上重建触发器
现在,我的实际问题是:
- 是否存在通过视图处理本地化字符串的最佳实践方法?
- 存在使用a
UDF
作为存根的替代方法吗?(我可以VIEW
为每个架构所有者写一个特定的文件,并对语言进行硬编码,而不是依赖于各种UDF
存根。) - 是否可以通过完全限定嵌套
UDF
s然后对视图堆栈进行模式绑定来简单地使这些视图具有确定性?
这对您有任何帮助吗? stackoverflow.com/questions/316780/…–
—
stacylaray
UDF
定义。另外,请参考T-SQL用户定义的函数:好的,坏的和丑陋的