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

トップ句を選択すると、長い時間コストが発生する可能性がある理由

    この同じトピックに関する他のスタックオーバーフローの議論があります(下部のリンク)。上記のコメントに記載されているように、インデックスとオプティマイザが混乱して間違ったものを使用していることに関係している可能性があります。

    私の最初の考えは、(select * ....)からselect top serviceidを実行していて、オプティマイザーがクエリを内部クエリにプッシュしてインデックスを使用するのが難しい場合があるということです。

    次のように書き直すことを検討してください

    select top 10 ServiceRequestID  
    from  big_table_1
    inner join big_table_2 cap2
    on cap1.servicerequestid = cap2.customerreferencenumber
    and big_table_1.statusid = 2
    

    クエリでは、データベースはおそらく結果をマージして返し、外部クエリの上位10に制限しようとしている可能性があります。上記のクエリでは、結果がマージされるときにデータベースが最初の10個の結果を収集するだけで済み、時間の負荷を節約できます。また、servicerequestIDにインデックスが付けられている場合は、必ずそれを使用します。あなたの例では、クエリは、仮想のインデックス付けされていない形式ですでに返されている結果セット内のservicerequestid列を探しています。

    それが理にかなっていることを願っています。仮に、オプティマイザーはSQLを入力する形式を採用し、毎回値を返すための最良の方法を見つけることになっていますが、実際には、SQLを組み合わせる方法は、特定の手順が実行される順序に実際に影響を与える可能性があります。 DB。

    SELECT TOPは、ORDERBYに関係なく遅いです

    SQL Serverのインデックス付き列でtop(1)を実行するのが遅いのはなぜですか?



    1. このクエリからのSQLインジェクションを防ぐ方法は?

    2. MySQLの入れ子集合-ノードの親を見つける方法は?

    3. SQLサーバーのRollUPと合計しますが、最後の要約だけですか?

    4. MariaDBにデータを挿入するときの「エラー1136(21S01):列数が行1の値数と一致しない」を修正