0

では、行きましょう。この乱雑なSELECTクロス他のテーブルと、1 つの目的の行を取得するための順序があります。基本的に、私は の中で「計算」を行いORDER BYます。

1 ベーステーブル。

7JOINSローカルテーブルへのポイティング。

WHERE2つの句とNOT IN別のテーブルの交差があります。

ORDER BY5 つの異なる計算の結果を合計した非常に大きな/醜いコードが表示されます。order by最悪の行ケースを取得するには、これらの計算にその結果が必要です。

問題は、ストアド プロシージャを実行すると、実行に最大 8 秒かかることです。それはちょっと受け入れられない。だから、私はインデックスをチェックし始めています。

そこで、このクエリをより速く実行する方法についてのアドバイスを探しています。WHERE句とフィールドにインデックスを付けてLINEAいますが、他のものにインデックスを付ける必要がありますか? 行のように、私はJOINs?または、クエリに別の方法でアプローチする必要がありますか?

クエリ:

SET @LINEA = (
    SELECT TOP 1
        BOA.LIN
    FROM
        BAND_BA BOA
    LEFT JOIN
        TEL PAR
        ON REPLACE(BOA.Lin,'-','') = SUBSTRING(PAR.Te,2,10)
    LEFT JOIN
        TELP CLP
        ON REPLACE(BOA.Lin,'-','') = SUBSTRING(CLP.Numtel,2,10)
    LEFT JOIN
        CA C
        ON REPLACE(BOA.Lin,'-','') = C.An
    LEFT JOIN
        RE R
        ON REPLACE(BOA.Lin,'-','') = R.Lin
    LEFT JOIN
        PRODUCTOS2 P2
        ON BOA.PRODUCTO = P2.codigo
    LEFT JOIN
        EN 
        ON REPLACE(BOA.Lin,'-','') = EN.G
    LEFT JOIN
        TIP ID
        ON TIPID = ID.ID
    WHERE 
        BOA.EST = 'C' AND
        ID.SE =  'boA' AND 
        BOA.LIN NOT IN (
            SELECT 
                LIN 
            FROM 
                BAN

            )   
    ORDER BY (EN.VALUE + ANT.VALUE + REIT.VAL + C.VALUE + TEL.VALUE

        ) DESC,             
4

2 に答える 2

7

率直に言って、これはかなりひどい SQL です。すべてのテーブル構造を確認しないと、ここでのアドバイスは不完全になります。そうは言っても、これで「コンサルタントを雇う」領域にすでに非常に近づいているため、すべてのテーブル構造を投稿しないでください。

  1. すべてのREPLACEロジックを廃止する必要があります。これらのフィールドが必要な場合はJOIN、比較可能なフィールドをテーブルに追加して、データを操作する必要がないようにします。orJOINを使用するすべてのシングルは、テーブルまたはインデックス スキャンです。これらは SARGable ではなく、明確なアンチパターンです。REPLACESUBSTRING

  2. これは、おそらく私が今まで見ORDER BYた中で最も複雑です。ORDER BYそこにいくつかの主要な問題があります:

    • サブクエリはすべて削除し、外側のクエリまたは変数として具体化する必要があります
    • 文字列操作は排除する必要があります (上記の項目 1 を参照)

クエリ全体は基本的にコードの匂いです。ビジネス要件を満たすためにこのようなコードを記述する必要がある場合は、設計が非常に不適切であるか、組織またはデータにその他のより大きな問題があります。

于 2012-09-19T17:25:41.777 に答える
2

パフォーマンスを低下させる原因の 1 つは、多くの LEFT JOIN を使用することです。LEFT JOIN のパフォーマンスを向上させるために、結合先の列にインデックスがあることを確認したい場合があります。これは、パフォーマンスに大きな影響を与える可能性があります。

于 2012-09-19T17:18:53.390 に答える