2009-03-31 1 views
2

私が書いているクエリーは、数週間前に見るとうまくいきます。一週間以上行くと(〜20分)クロールします。私は一緒に3つのテーブルを結合しています。私はこれをより速く走らせるために何を探しているのだろうと思っていました。私はポストに他の情報が必要であるかどうか本当に知りません。JOINを使用してSQLクエリを最適化するためのヒントが必要です

EDIT:さらに詳しい情報:デシベルでは、Sybase 10クエリです:私も3位を取った

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' 

はJOINと、それはまだ非常に遅い実行されます。私は別のJOINメソッドを試すべきですか?

+0

「1週間以上」とはどういう意味ですか?数日ではなく1週間分のデータが必要ですか?プロダクションで1週間以上実行していますか? –

+0

あなたの質問を投稿してください! – Blorgbeard

+0

また、どのデータベースサーバーを使用していますか? MSSQL? MySQL?オラクル? – Blorgbeard

答えて

2

Sybase 10についてよく分かりませんが、10日間と10日間、それぞれの期間にそれぞれのクエリを実行して比較してみてください。最初のケースの時間がはるかに長い場合は、おそらくデータベースキャッシュの限界に達したでしょう。

解決策は、単純にループ内の短い期間(プログラムではなくSQLで)にクエリを実行することです。テーブルAが日付別に分割されている場合は特に効果的です。

+0

実際には、これはかつて一度に5,000万レコード増加したテーブルに参加する唯一の効果的な方法でした列)と1年間のデータが含まれています。 – user76035

0

メモリリークがあるか、クライアントコードでデータベース接続を終了しているように聞こえるのは、クエリに問題があるというよりも聞こえます。

[編集]
Nevermind:サーバーがアクティブであった期間ではなく、日付範囲を照会することを意味します。私は他の人が同じ混乱を避けるためにこれを残しておきます。

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

+0

明日は投稿する必要があります。私は家でそれを読もうとしています。 –

0

データベースでサポートされている場合は、日付範囲にPARTITIONを使用することができます。私はこれが有意に助けることができると聞きました。 は(クエリメニューの)実際の実行計画オプションのセットを含めると

2

あなたは、SQL Server Management Studioでクエリを実行することにより、多くの情報(ここでMSSQLを使用していると仮定)を取得することができます。

これは、クエリを実行するためにSQLServerが実行するステップのダイアグラムを各ステップに対する相対コストとともに示します。

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

私はこれを常にデバッグ/最適化のクエリを行います。

+0

私はSybase 10を使用していますので、それは不可能です。 –

1

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

0

「プロフェッショナルSQL Server 2005パフォーマンスチューニング」という本をかなり掴んでください。

+0

私はSybase 10を使用していません –

0

あなたのデータベースは言及していません。それがSQL Serverでない場合、データを取得する方法の詳細は異なるかもしれませんが、アドバイスは根本的に同じです。

インデックス作成を参照してください。まず、Blorgbeardのアドバイスに従い、Management Studioを使用して実行計画をスキャンします(SQL Serverを実行している場合)。

小さな日付範囲の場合、オプティマイザは合理的なクエリプランを選択しますが、日付範囲が大きい場合は、完全に異なるものを選択します。おそらくテーブルスキャンまたはインデックススキャン、およびおそらく大規模な一時レコードセットにつながる結合が含まれます。実行計画アナライザはこれをすべて表示します。

スキャンとは、オプティマイザが、特定の値を求めるよりも、テーブル全体またはインデックス全体の研磨がお手頃であると考えることを意味します。

最終的に何をしたいのですか?インデックスを取得し、クエリの構文を設定して、クエリのクエリプランに日付範囲に関係なくインデックスをシークしたり、失敗した場合は必要なスキャンフィルタリングされるだけでなく、一時的なレコードセットサイズを最小限に抑えることができ、過剰な読み取りとI/Oを回避できます。

+0

適切なカラムのインデックスが作成されていて、Sybase 10を使用しています。 –

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構文についてはわかりません。

関連する問題