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

パラメータ化されたクエリが、パラメータ化されていないクエリと比較して非常に遅いクエリプランを生成するのはなぜですか

    クエリプランナは、すでに持っている情報に基づいてリテラルクエリで決定を下したようです。特定のリテラルで指定されたデータの広がりに基づいて効率的にクエリできる統計が含まれます。

    パラメータ化されたクエリは、テーブル内のすべてのデータに対して最も公平であると信じるクエリを選択しました。これは、多くのネストされたループ(パフォーマンス=不良)であることに気付くでしょう。

    おそらく、データベースでデータベース最適化ツールを実行して、いくつかのインデックスがここで役立つかどうかを確認することができますか?

    特にクエリで、これを試してください:

    declare @p0 int
    set @p0 = 1000
    select *
    from foo
    join bar on bar.x = foo.x
    join baz on baz.y = foo.y
    where foo.x = @p0
    OPTION ( OPTIMIZE FOR (@p0 = 1000))
    

    ただし、このクエリに含まれるデータが変更されないこと、およびこのプランのクエリが常により効率的になることを確信せずに、これを行うことには注意が必要です。



    1. IDENT_CURRENT()を使用して、SQLServerのID列の現在のID値を返します

    2. AtlassianBitbucketを使用したPostgreSQLバージョン管理

    3. SQL RANK()とROW_NUMBER()

    4. ActiveRecordクエリの時間ベースの優先度