3

いくつかのかなり大きなテーブル(最大のテーブルは10 mil。レコード)で5つの結合を持つクエリを取得しましたが、行が存在するかどうかを知りたいです。これまで、行が存在するかどうかを確認するためにこれを実行しました。

SELECT TOP 1 tbl.Id
FROM table tbl
INNER JOIN ... ON ... = ... (x5)
WHERE tbl.xxx = ...

このクエリを使用すると、ストアドプロシージャで22秒かかり、「インスタント」に近づけたいと思います。これも可能ですか?それをスピードアップするために私は何ができますか?

参加しているフィールドとWHERE句のフィールドのインデックスを取得しました。

何か案は?

4

6 に答える 6

3

EXISTS述部に切り替えます。一般的に、トップ1などを選択するよりも高速であることがわかりました。

だからあなたはこのように書くことができますIF EXISTS (SELECT * FROM table tbl INNER JOIN table tbl2 .. do your stuff

于 2009-07-08T12:56:49.103 に答える
3

RDBMSに応じて、クエリのどの部分に時間がかかり、どのインデックスが使用されているかを確認できます(したがって、それらが適切に使用されていることがわかります)。

MSSQLでは、送信するクエリの実行パスの図を表示できます。

OracleとMySQLでは、EXPLAINキーワードを使用して、クエリがどのように機能しているかについての詳細を取得できます。

ただし、クエリで実行できるのは22秒が最適な場合もあります。私たちはそれに答えることはできません、あなたのRDBMSによって提供された実行の詳細だけが答えることができます。使用しているRDBMSを教えていただければ、ボトルネックを確認するために必要な情報を見つける方法を教えていただけます。

于 2009-07-08T12:57:28.150 に答える
2

4つのオプション

  • TOP 1 tbl.idの代わりにCOUNT(*)を試してください

  • 列ごとのインデックスでは不十分な場合があります。複合インデックスを使用する必要がある場合があります

SQL Server 2005を使用していますか?somの場合、欠落しているインデックスを見つけることができます。または、データベースチューニングアドバイザーを試してください

  • また、5つの結合が必要ない可能性もあります。

親-子-孫などを想定すると、孫の行は親の行なしでは存在できません(外部キーがあると想定)

したがって、クエリは次のようになります

SELECT TOP 1
   tbl.Id --or count(*)
FROM
   grandchildtable tbl
   INNER JOIN
   anothertable ON ... = ...
WHERE
   tbl.xxx = ...
  • EXISTSをお試しください。

5つのテーブルまたは想定される階層のいずれか

SELECT TOP 1 --or count(*)
   tbl.Id
FROM
   grandchildtable tbl
WHERE
   tbl.xxx = ...
   AND
   EXISTS (SELECT *
       FROM
           anothertable T2
       WHERE
           tbl.key = T2.key /* AND T2 condition*/)
-- or
SELECT TOP 1 --or count(*)
   tbl.Id
FROM
   mytable tbl
WHERE
   tbl.xxx = ...
   AND
   EXISTS (SELECT *
       FROM
           anothertable T2
       WHERE
           tbl.key = T2.key /* AND T2 condition*/)
   AND
   EXISTS (SELECT *
       FROM
           yetanothertable T3
       WHERE
           tbl.key = T3.key /* AND T3 condition*/)
于 2009-07-08T13:10:01.437 に答える
1

最初の選択の早い段階でフィルターを実行すると、実行できる場合に役立ちます。最初のインスタンスでデータをフィルタリングすると、すべての結合が削減されたデータで結合されます。

Select top 1 tbl.id
From 
(
Select top 1 * from 
table tbl1
Where Key = Key
) tbl1
inner join ... 

その後、クエリがどのように機能するかを理解するために、クエリをさらに提供する必要があります。

于 2009-07-08T12:56:06.717 に答える
0

たぶん、この事実調査ミッションをオフロード/キャッシュすることができます。動的に実行する必要がない場合や実行時に実行する必要がない場合と同様に、結果をはるかに小さなテーブルにキャッシュしてからクエリを実行します。また、クエリを実行しているすべてのテーブルに適切なクラスター化インデックスがあることを確認してください。確かに、これらのテーブルを他のタイプのクエリに使用している可能性がありますが、絶対に最速の方法として、この1つのクエリのすべてのクラスター化インデックスを調整できます。

編集:はい、他の人が言ったこと。測定、測定、測定!クエリプランの見積もりは、ボトルネックが何であるかを示すことができます。

于 2009-07-08T12:57:37.963 に答える
0

すべての結合で最初に最大行テーブルを使用し、whereで複数の条件を使用する場合は、whereis条件のシーケンスが重要です。最大行を提供する条件を使用してください。

クエリを最適化するには、フィルタを慎重に使用してください。

于 2009-07-08T13:10:21.047 に答える