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

UDFがサブクエリよりもはるかに遅いのはなぜですか?

    UDFはクエリオプティマイザーのブラックボックスであるため、すべての行に対して実行されます。行ごとのカーソルを実行しています。アセットの各行について、別のテーブルでIDを3回検索します。これは、スカラーまたはマルチステートメントUDFを使用する場合に発生します(インラインUDFは、外部クエリに展開される単なるマクロです)

    この問題に関する多くの記事の1つは、「スカラー関数、インライン化、およびパフォーマンス:退屈な投稿の面白いタイトル」です。

    サブクエリは、行ごとの操作を相互に関連付けて回避するように最適化できます。

    あなたが本当に欲しいのはこれです:

    SELECT
       uc.id AS creator,
       uu.id AS updater,
       uo.id AS owner,
       a.[name]
    FROM
        asset a
        JOIN
        user uc ON uc.user_pk = a.created_by
        JOIN
        user uu ON uu.user_pk = a.updated_by
        JOIN
        user uo ON uo.user_pk = a.owned_by
    

    2019年2月の更新

    SQLServer2019はこの問題の修正を開始します。



    1. 1つのテーブルに複数の主キーが存在できますか?

    2. macOSにSQLiteをインストールする方法

    3. 主キーSQLチュートリアル–データベースで主キーを定義する方法

    4. MariaDBで数値のみを返す