我有一个案例,我需要从同一个表中翻译(查找)几个值。我写它的第一种方式是使用子查询:
SELECT
(SELECT id FROM user WHERE user_pk = created_by) AS creator,
(SELECT id FROM user WHERE user_pk = updated_by) AS updater,
(SELECT id FROM user WHERE user_pk = owned_by) AS owner,
[name]
FROM asset
因为我经常使用这个子查询(也就是说,我有大约 50 个包含这些字段的表),我可能需要向子查询添加更多代码(例如, "AND active = 1" )我想我' d 将它们放入用户定义的函数UDF并使用它。但是使用该 UDF 的性能非常糟糕。
CREATE FUNCTION dbo.get_user ( @user_pk INT )
RETURNS INT
AS BEGIN
RETURN ( SELECT id
FROM ice.dbo.[user]
WHERE user_pk = @user_pk )
END
SELECT dbo.get_user(created_by) as creator, [name]
FROM asset
#1 的性能不到 1 秒。#2 的性能大约是 30 秒...
为什么,或者更重要的是,有什么方法可以在 SQL Server 2008 中编码,这样我就不必使用这么多子查询了?
编辑:
只是对何时有用的更多解释。当我想为用户获取文本时,这个简单的查询(即获取用户 ID)变得更加复杂,因为我必须加入个人资料才能获取语言,并与公司一起查看是否应该获取语言'而是从那里编辑,并使用翻译表来获取翻译后的文本。对于这些查询中的大多数,性能是可读性和可维护性的次要问题。