2

私が書いているクエリは、過去数日を見ると問題なく動作し、1 週間以上経過するとクロールします (約 20 分)。3つのテーブルを結合しています。これをより速く実行するには、何を探すべきか疑問に思っていました。投稿に他にどのような情報が必要かはよくわかりません。

編集: 詳細情報: db は Sybase 10 です。クエリ:

SELECT a.id, a.date, a.time, a.signal, a.noise,
b.signal_strength, b.base_id, b.firmware,
a.site, b.active, a.table_key_id
FROM adminuser.station AS a
JOIN adminuser.base AS b
ON a.id = b.base_id
WHERE a.site = 1234 AND a.date >= '2009-03-20'

3番目のJOINも取り出しましたが、それでも非常に遅くなります。別の JOIN メソッドを試す必要がありますか?

4

8 に答える 8

2

SQL Server Management Studioで[クエリ]メニューの[実際の実行プランを含める]オプションを設定してクエリを実行すると、多くの情報を取得できます(ここでMSSQLを使用していると仮定します)。

これにより、クエリを実行するためにSQLServerが実行するステップの図が表示されます。各ステップに対する相対的なコストが示されます。

次のステップは、クエリを少し作り直して(別の方法で試してください)、新しいバージョンと古いバージョンを同時に実行することです。各ステップだけでなく、クエリの2つのバージョンに対しても相対的なコストがかかる、2つの実行プランを取得します。したがって、進歩しているかどうかを客観的に知ることができます。

クエリをデバッグ/最適化するときに、これを常に行います。

于 2009-03-31T03:16:14.707 に答える
2

Sybase 10についてはよくわかりませんが、そのクエリをたとえば10日間実行してから、期間内の各日についてそれぞれ10回実行して時間を比較してみてください。最初のケースの時間がはるかに長い場合は、データベース キャッシュの制限に達している可能性があります。

解決策は、ループ内で (SQL ではなくプログラム内で) 単純に短い期間クエリを実行することではありません。テーブル A が日付で分割されている場合、特にうまく機能します。

于 2009-03-31T13:20:05.877 に答える
1

外部キーにインデックスがあることを確認してください。

于 2009-03-31T03:45:37.943 に答える
0
SELECT

 a.id, a.date, a.time, a.signal, a.noise,a.site, b.active, a.table_key_id,
 b.signal_strength, b.base_id, b.firmware

FROM 

( SELECT * FROM adminuser.station 
      WHERE site = 1234 AND date >= '2009-03-20') AS a
JOIN 

    adminuser.base AS b
ON

    a.id = b.base_id

結合を実行してから結果をフィルタリングするのではなく、最初に目的の行をフィルタリングしてから結合を実行するように、クエリを書き直しました。

サブクエリから * をプルするのではなく、必要な列を選択するだけで済みますが、これはあまり役に立ちません。

物事をスピードアップする上で、これはほとんど役に立たないでしょう。

これは MySql では有効ですが、sysbase の構文についてはよくわかりません。

于 2009-03-31T21:52:07.923 に答える
0

クエリに問題があるというよりも、メモリ リークがあるか、クライアント コードでデータベース接続を閉じていないように思えます。

[編集]
気にしないでください: サーバーがアクティブであった期間ではなく、日付範囲でクエリを実行することを意味します。他の人が同じ混乱を避けるのを助けるために、これはそのままにしておきます。

また、最初に難読化する必要がある場合でも、SQL クエリを投稿できれば役立ちます。日付列にインデックスがあるかどうか、およびより長い範囲によって返されるレコードの数を確認することをお勧めします。

于 2009-03-31T03:05:27.353 に答える