私はこのようなテーブルを持っている:SQL Serverの連合の性能向上
このテーブルには、40万を超える行があります。
以下のように、SQL Serverの関数を使用して値を取得しています。実際に私は最後の更新レコードを取得したいと思います。
SELECT
ID, ISNULL(dbo.FncGetName(Season , NameCode),ShortName) AS Name
FROM
Table1
ので、パフォーマンスを向上させるための任意のアプローチがあります:
ALTER FUNCTION [dbo].[FncGetName]
(@Season VARCHAR(30),
@NameCode VARCHAR(30))
RETURNS VARCHAR(150)
AS
BEGIN
DECLARE @Name VARCHAR(150)
SET @Name = (SELECT TOP 1 Names.Name
FROM
(SELECT
CASE
WHEN Name1Unidecode IS NOT NULL
THEN Name1Unidecode
ELSE Name1
END AS Name
FROM
Persons
WHERE
Season IS NOT NULL
AND Season = @Season
AND Name1Code LIKE @NameCode + '%'
GROUP BY
Name1, Name1Unidecode
UNION
SELECT
CASE
WHEN Name2Unidecode IS NOT NULL
THEN Name2Unidecode
ELSE Name2
END AS Name
FROM
Persons
WHERE
Season IS NOT NULL
AND Season = @Season
AND Name2Code LIKE @NameCode + '%'
GROUP BY
Name2, Name2Unidecode) AS Names
)
RETURN @Name
END
これはSELECT
クエリはありますか?
EDITED
私は以下のようにUNIONのSELECTクエリの2のインデックスを作成しているし、パフォーマンスが向上。
CREATE NONCLUSTERED INDEX [Index_Name1] ON [dbo].[Person]
(
[Season] DESC,
[Name1Code] DESC,
[Name1 DESC,
[Name1Unidecode] DESC
)
CREATE NONCLUSTERED INDEX [Index_Name2] ON [dbo].[Person]
(
[Season] DESC,
[Name2Code] DESC,
[Name2 DESC,
[Name2Unidecode] DESC
)
最新のレコードを更新しますか? row_number()を(更新順で名前順に)パーティションしてから1を選択すると、最後に更新された各名前が得られます – plaidDK
なぜ 'order by'ですか?最後のレコードはどの順序になっていますか? –
私は2つの名前の列を持っています。ルイスレコードを取得する必要がある場合は、UNIONを使用する必要があります。そのため、この作業は遅いです。 – Kerberos