2017-12-06 8 views
0

私はこのようなテーブルを持っている:SQL Serverの連合の性能向上

Table Data Stucture

このテーブルには、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 
) 
+0

最新のレコードを更新しますか? row_number()を(更新順で名前順に)パーティションしてから1を選択すると、最後に更新された各名前が得られます – plaidDK

+0

なぜ 'order by'ですか?最後のレコードはどの順序になっていますか? –

+0

私は2つの名前の列を持っています。ルイスレコードを取得する必要がある場合は、UNIONを使用する必要があります。そのため、この作業は遅いです。 – Kerberos

答えて

0

は、私はあなたが、元の1

SELECT TOP 1 
      coalesce(Name1Unidecode, Name1, Name2Unidecode, Name2) AS Name 
    FROM Persons 
    WHERE Season IS NOT NULL 
      AND Season = @Season 
      AND (Name2Code LIKE @NameCode + '%' OR Name1Code LIKE @NameCode + '%') 
    ORDER BY update desc 

は、私は一つの値だけが属性Name1UnidecodeName1Name2UnidecodeName2NULLないことを仮定しているのではなく、次のクエリを使用する必要があると考えています。それが真でない場合は、データに従って調整します。

また、インデックスがPerson(Season, Name2Code, update)Person(Season, Name1Code, update)の場合は、すばやく表示されます。

+0

名前は名前1列の名前でもよいと思います。私はクエリーはname1とname2の両方を持つようにすべきだと思うし、両方のカラムから実際の名前を選択するために1つ以上の比較を行うことができます – BlindSniper

+0

@BlindSniper true、私は彼がそれらのSQLで異なる名前を使用していることに気付きませんでした。 –

+0

このクエリを使用すると、これを渡した名前コードと比較することができます。 – BlindSniper

関連する問題