У меня есть случай, когда мне нужно перевести (поиск) несколько значений из одной таблицы. Первый способ, которым я это написал, - это использование подзапросов:
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"), я думал, что я бы поместил их в пользовательскую функцию 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, чтобы мне не приходилось использовать так много подзапросов?
Edit:
Просто небольшое объяснение того, когда это полезно. Этот простой запрос (то есть get userid) становится намного сложнее, когда я хочу получить текст для пользователя, так как мне нужно объединиться с профилем, чтобы получить язык, с компанией, чтобы посмотреть, должен ли язык быть выбранным. ' оттуда вместо этого и с таблицей перевода, чтобы получить переведенный текст. И для большинства этих запросов производительность является второстепенной проблемой для удобочитаемости и удобства обслуживания.