- - PR -
リンクサーバーからのデータ抽出速度について
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-12-04 19:36
いつもお世話になります。
現在、SQLサーバー2000SP4に対して、AS/400のDB2を参照するリンクサーバーを設定し、開発を行なっています。 データ抽出速度について質問があります。 質問 SQLサーバーからクエリを実行する場合、SQLサーバー内のデータを抽出するのと、リンク先(AS/400)のデータを抽出するのでは、 SQLサーバー内のデータの方が抽出速度が速いのでしょうか? また、抽出速度が速い場合、その理由は何でしょうか? 実際に、それぞれのサーバーから同じ1,000,000件のデータを抽出する場合、SQLサーバー内のデータはすぐに結果が表示されるが、 リンク先のデータの場合、結果が表示されるまでに非常に時間がかかります。 これはリンク元(SQLサーバー)とリンク先(AS/400)との通信速度が影響しているのでしょうか? どなたかご存知の方はアドバイスをお願いします。 | ||||||||
|
投稿日時: 2007-12-04 21:57
質問だけに回答するなら「SQLサーバー内のデータの方が抽出速度が速い」し、
その理由は「オーバーヘッドが少ないから」でしょう。 ただ、比べるべくもなく速度差があるなら、 通信やデータ変換のオーバーヘッドというよりは、何か別の要因が考えられるはずです。 例えば、非同期でカーソルを開けるなら、結果セットが作成された端から表示できるので 最終的な結果セットの件数にかかわらず、最初の表示が返った時点で「結果が返った」と見えます。 | ||||||||
|
投稿日時: 2007-12-05 12:41
こあらさん、コメントありがとうございます。
オーバーヘッドについて調べた結果、「ネットワーク間」、「アプリケーション間」といったプロセスを跨ぐ際の負荷という認識を得ました。 やはりリンクサーバーだと別のサーバーの為、ネットワーク間の負荷があるようですね。 もう1つ質問があるのですが、 @SELECT * FROM テーブルA ASELECT * FROM テーブルA WHERE フィールド = ○○ と2つのSQL文があるとして、 抽出されるデータ件数ではAの方が少ないのに@の方が抽出にかかる時間が短い場合があります、それは何故でしょうか? 条件を指定する事が抽出データは少なくなるが、サーバーへの負荷が大きくなるのでしょうか? | ||||||||
|
投稿日時: 2007-12-05 13:22
>WHERE フィールド = ○○
に適切なIndexが貼られていない場合など(他にも要因はありますが)、 全件検索のほうが早い場合があります。 SQL、チューニングなどで調べてみてください。 | ||||||||
|
投稿日時: 2007-12-05 14:12
こんにちは
っていうのは、実機で何かを計って調べました? ”認識を得ました”って机上だけで言っているように聞こえるのですけど。 誤解だったらごめんなさい。
すっごい単純に言うと a.そのテーブルにあるもの全部持ってきて b.そのテーブルの上からこの種類のもの全部もってきて の違いだと思います。 a.の方が頭使わないですよね? #実際はもう少し複雑でしょうが。。。 | ||||||||
|
投稿日時: 2007-12-05 23:38
> また、抽出速度が速い場合、その理由は何でしょうか?
既に話が出ている通り、ネットワークの負荷が大きいと思います。 それとリンク元とリンク先サーバのスペックも同等ですか? それも影響します。 また、SQL Serverはコストベースオプティマイザで動作してますので、 効率的なSQLを実行するためにデータベースの統計情報が利用されます。 ローカル実行の場合には、統計情報が利用されますが、リンクサーバの 場合には、統計情報が利用されません。 そのために、SQLによっては実行計画に差が出る場合もありますので ご注意ください。 これはDB2へのリンクサーバに限った話ではなく、SQL Server同士で リンクサーバした際にも同様となります。 | ||||||||
|
投稿日時: 2007-12-05 23:43
>抽出されるデータ件数ではAの方が少ないのに@の方が抽出にかかる時間が短い場合があります、それは何故でしょうか?
>条件を指定する事が抽出データは少なくなるが、サーバーへの負荷が大きくなるのでしょうか? 比較している2つのSQLの実行計画を比較し、実行コスト等の 比較をしてみると良いかもしれません。 いくつかの原因が推測されます。 例えば、フィールドで指定している条件の選択率が悪く、なおかつインデックススキャンされている。 ⇒ 全件検索によるフルスキャンの方が早いケースかもしれない。 もしくは、条件指定時に指定されているインデックスが極度に断片化している・・・とか。 何にしろ、SQL実行計画の比較がお勧めです。 | ||||||||
|
投稿日時: 2007-12-06 11:47
KOXさん、みなとさん、ラララさん、コメントありがとうございます。
クエリアナライザの実行プランを確認しました。 @SELECT * FROM テーブルAの場合 結果コスト1%(コスト0.20 UPCコスト) Tableスキャンコスト99%(コスト28.49 CPUコスト2.26) ASELECT * FROM テーブルA WHERE フィールド = ○○ 結果コスト0% Parallelism GatherStreamsコスト3%(コスト0.80 CPUコスト0.31) Tableスキャンコスト97%(コスト27.36 CPUコスト1.13) となりました。 たまたま今回はAのケースが早いとなってしまいました、実行するタイミングや環境に影響するのでしょうか。。。 また、AのParallelism GatherStreamsコストについては、「並列処理が必要な演算です」と表示されていました。これはどういった事を表しているのでしょうか? 実行プランやパフォーマンスチューニングについてみなさんはどのように勉強されていますか?もし宜しければお勧めのホームページなどあれば教えてもらえないでしょうか?ぜひ勉強してみたいと思います。 よろしくお願いします。 |