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

400 万件のレコードに対する 2 つの根本的に異なるクエリが同時に実行される - 1 つはブルート フォースを使用する

    オプティマイザーを信頼してください。

    達成しようとしていることを最も簡単に表現するクエリを作成します。 もし パフォーマンスに問題がある そのクエリでは、不足しているインデックスがあるかどうかを確認する必要があります。ただし、明示的にする必要はありません。 これらのインデックスを操作してください。

    あなたのことを気にしないでください。 そのような検索を実装するかもしれません。

    とても まれに、(ヒントを介して) 特定のインデックスを使用するようクエリにさらに強制する必要がある場合がありますが、これはおそらくクエリの 0.1% 未満です。

    投稿された計画では、「最適化された」バージョンにより、(おそらく) Params テーブル (PK_Params_1、IX_Params_1) の 2 つのインデックスに対してスキャンが行われています。クエリを見なければ、なぜこれが起こっているのかを知ることは困難ですが、テーブルに対して 1 回のスキャン (「ブルート フォース」) と 2 回のスキャンを比較すると、2 回目のスキャンがより効率的でない理由が簡単にわかります。

    試してみたいと思います:

            SELECT      p.ProductID, ptr.[Rank]
            FROM        dbo.SearchItemsGet(@SearchID, NULL) AS si
                        JOIN dbo.ProductDefs AS pd
            ON          pd.ParamTypeID = si.ParamTypeID
                        JOIN dbo.Params AS p
            ON          p.ProductDefID = pd.ProductDefID
                        JOIN dbo.ProductTypesResultsGet(@SearchID) AS ptr
            ON          ptr.ProductTypeID = pd.ProductTypeID
    
    LEFT JOIN Params p_anti
        on p_anti.ProductDefId = pd.ProductDefID and
             (p_anti.ParamLo < si.LowMin or p_anti.ParamHi > si.HiMax)
    
    
            WHERE       si.Mode IN (1, 2)
    
    AND p_anti.ProductID is null
    
            GROUP BY    p.ProductID, ptr.[Rank]
    

    つまり望ましくない結果を排除するアンチ結合を導入します。



    1. SQL、データとテーブルを削除する方法

    2. SQL Data Reader データを DataTable にロードする際の問題

    3. mysqlで日付のギャップを見つける

    4. カンマ区切りの文字列をmysqlの行に分割します