- PR -

SQL ServerのVPN経由でのレスポンスについて

1
投稿者投稿内容
ナオ
会議室デビュー日: 2006/04/11
投稿数: 4
投稿日時: 2006-04-11 18:16
表題の件について、ご教示下さい。

サーバー環境
Windows 2000 Server &
MS SQL Server 2000 Standard Edition
1CPU(2.4GHz)
1024RAM

VBで制作したアプリケーションより、データベースの内容を操作しています。
本社と支社で同じアプリケーション、1つのデータベースを利用しており、
本社と支社間をBフレッツを利用したVPNで接続しております。

アプリ側で、例えばラジオボタンのようなボタンをクリックすると、
リストボックスの中にデータベースのテーブルの内容(3000行程度)を読み込んでくる処理を行うのですが、
本社のLANの中では一瞬で行われるものの、支社では表示までに2分近くかかってしまいます。
プロファイラで確認いたしましたところ、sp_cursorfetchのところがだいぶ遅くなってしまっているようでした。
そのほかにも、INSERT、UPDATEは一瞬でも、DELETEは上記同様2分近く時間がかかります。

上記の現象について、VPN経由であることが問題であるのか、そのほかに問題があり解決策があるのかわからないでいます。
プログラムが外注で、修正が容易ではないため、なんとかデータベース側のパフォーマンスを上げられればと考えております。
宜しくお願いいたします。
こばさん
大ベテラン
会議室デビュー日: 2004/03/17
投稿数: 147
投稿日時: 2006-04-14 18:52
 VPN 環境でも常識的なレスポンスで応答する業務システムを普段構築している者です。

引用:

リストボックスの中にデータベースのテーブルの内容(3000行程度)を読み込んでくる処理を行うのですが、
本社のLANの中では一瞬で行われるものの、支社では表示までに2分近くかかってしまいます。
プロファイラで確認いたしましたところ、sp_cursorfetchのところがだいぶ遅くなってしまっているようでした。


 縦は3000行ということですね。横は何列(何文字数)くらいなのでしょうか。
 純粋にデータをサーバーからクライアントに流している以上、1行のデータ量×3000件 は確実に流れます。(ルーター間で圧縮処理がない場合) 
 
 例えば、商品コードと商品名で、1行が合計50文字程度であれば、非表示の内部管理用のID列が別にあったところで、3000行程度であれば、(50+α)×3000 文字であれば数秒かからないと思われます。
 逆に、売上明細などで、商品名はもとより出荷先の住所があったり、その他諸々で、1行あたりのデータ量が多ければ、当然の如く遅くなります。
 
 プログラムのソースがあれば確実ですが、クライアントからデータベースサーバーに対して、必要な列のみを取得するようにプログラムしているか、ひとまず全部とってきてクライアント側で必要な列だけを表示するようにプログラムしているのか。

 もし後者であれば、社内LAN内でも、高速で気が付かないだけで、無駄な情報をサーバーからもらってきて、ネットワーク・サーバーともに無駄な負荷をかける随分とまぁ手抜きプログラムであると言わざるを得ません。


引用:

そのほかにも、INSERT、UPDATEは一瞬でも、DELETEは上記同様2分近く時間がかかります。



 通常、DELETE は、削除する条件をサーバーに対して指示するだけで、処理が済みますので、INSERT、UPDATE よりも高速に処理されるべきです。
 
 遅いというのは、3000件中で削除したい行を数行選択して、「削除実行」みたいなボタンを押したところで2分も待たされるんでしょか。
 それとも、先に抽出した3000件は削除候補データで、ほぼ全行を削除する、というものでしょうか。
ナオ
会議室デビュー日: 2006/04/11
投稿数: 4
投稿日時: 2006-04-25 15:16
遅くなりまして申し訳ありませんでした。
どうやら、本社・支社間の回線の速度が問題のようでした。
(traertコマンドを見たところ、経由しているところが多い)
そちらを見直してみたいと思います。
お騒がせいたしました。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2006-04-25 17:14
引用:
プロファイラで確認いたしましたところ、sp_cursorfetchのところがだいぶ遅くなってしまっているようでした。


サーバーカーソルを使用していると上記のようになり、低速回線でのパフォーマンスが極端に低下します。たとえば、ADO を使っている場合、Recordset.MoveNext で次行に移動するたびにサーバーとの通信が発生します。Connection.CursorLocation = adUseClient としてクライアントカーソルを使用するようにすると解決します。
1

スキルアップ/キャリアアップ(JOB@IT)