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

WHERE句で定数が(同じ値を持つ)パラメーターに置き換えられた場合、クエリが大幅に遅くなるのはなぜですか?

    Martinが質問の下のコメントで示唆したように、問題はSQLサーバーがWHERE句から述語を適切にプッシュダウンしないことです-彼のコメントのリンクを参照してください。

    最終的に、ユーザー定義のテーブル値関数を作成し、それをCROSSAPPLY演算子とともに使用してビューを作成しました。

    ソリューション自体を見てみましょう。

    ユーザー定義のテーブル値関数

    CREATE FUNCTION [dbo].[TestFunction] (@Id INT)
    RETURNS TABLE 
    AS
    RETURN 
    (
        WITH
        Hierarchy (Id,  ParentId, Data, Depth)
        AS(
        SELECT Id, ParentId, NULL AS Data, 0 AS Depth FROM Test Where Id = @Id
        UNION ALL
        SELECT h.Id, t.ParentId, COALESCE(h.Data, t.Data), Depth + 1 AS Depth
            FROM Hierarchy h
                INNER JOIN Test t ON t.Id = h.ParentId
        )
        SELECT * FROM Hierarchy
    )
    

    表示

    CREATE VIEW [dbo].[TestView]
    AS
    SELECT t.Id, t.ParentId, f.Data, f.Depth
    FROM
        Test AS t
        CROSS APPLY TestFunction(Id) as f
    

    定数を使用したクエリ

    SELECT * FROM TestView WHERE Id = 69
    

    パラメータを使用したクエリ

    DECLARE @Id INT
    SELECT @Id = 69
    SELECT * FROM TestView WHERE Id = @Id
    

    パラメーターを使用したクエリは、基本的に定数を使用したクエリと同じ速度で実行されます。

    マーティンと他の人にも感謝します!



    1. Djangoを使用したデータベーステーブル名

    2. PostgreSql、スキーマオブジェクトDDLを抽出してSQLファイルを分離します

    3. ACLのデータベーススキーマ

    4. ajaxでdbquery(sql server 2005)を実行します。出来ますか?