sql >> データベース >  >> RDS >> Sqlserver

SQL Serverのスカラー値関数が遅くなるのはなぜですか?

    ほとんどの場合、テーブルを参照するスカラー値関数は避けるのが最善です。テーブルは基本的にブラックボックスであり、行ごとに1回実行する必要があり、クエリプランエンジンで最適化できないためです。したがって、関連付けられたテーブルにインデックスがある場合でも、線形にスケーリングする傾向があります。

    インラインテーブル値関数はクエリとインラインで評価され、最適化できるため、使用を検討することをお勧めします。必要なカプセル化が得られますが、selectステートメントに式を正しく貼り付けるパフォーマンス。

    インライン化の副作用として、手続き型コードを含めることはできません(@variableを宣言しない; @variable =..; returnを設定する)。ただし、複数の行と列を返すことができます。

    次のように関数を書き直すことができます:

    create function usf_GIS_GET_LAT(
        @City varchar (30),
        @State char (2)
    )
    returns table
    as return (
      select top 1 lat
      from GIS_Location with (nolock) 
      where [State] = @State
        and [City] = @City
    );
    
    GO
    
    create function usf_GIS_GET_LON (
        @City varchar (30),
        @State char (2)
    )
    returns table
    as return (
      select top 1 LON
      from GIS_Location with (nolock)
      where [State] = @State
        and [City] = @City
    );
    

    それらを使用するための構文も少し異なります:

    select
        Lat.Lat,
        Lon.Lon
    from
        Address_Location with (nolock)
        cross apply dbo.usf_GIS_GET_LAT(City,[State]) AS Lat
        cross apply dbo.usf_GIS_GET_LON(City,[State]) AS Lon
    WHERE
        ID IN (SELECT TOP 100 ID FROM Address_Location WITH(NOLOCK) ORDER BY ID DESC)
    


    1. PostgreSQLでのSign()関数のしくみ

    2. MySQL:列のテキストの長さを取得する方法

    3. SQLServerの既存の列にデフォルトの制約を追加する方法

    4. CakePHPの1つのモデルに複数のデータベースを動的に使用する方法