1.なぜ遅くなるのか?(VPNの「梱包」問題)
ip pp mtu 1454という設定で
ip tunnel tcp mss limit auto
この設定が大問題
1454 は「道路(NTT回線)が通せるトラックの最大サイズ」です。 VPN(L2TP/IPsec)を使うと、元のデータ(SQLの通信)に「暗号化ヘッダ」や「トンネルヘッダ」という余分な荷札が付きます。
- SQL Serverが、道路ギリギリサイズ(1454付近)のデータを送ろうとする。
- VPNルーターがそれに「暗号化ヘッダ」を上乗せする。
- 合計サイズが
1454を超えてしまう。 - ルーターは仕方なくデータを**分割(フラグメント)**して送る。
- 【ここが原因】 分割処理はルーターに高負荷がかかる上、分割されたパケットが1つでも欠けると再送が発生します。SQL Serverのようなデータベース通信は大量のデータをやり取りするため、この「分割→遅延→再送」の悪循環が致命的な速度低下を招きます。
「VPNトンネルの中を通るデータの最大サイズ(MSS)」を小さく制限
ip tunnel tcp mss limit auto → ip tunnel tcp mss limit 1300
1350でもいいのだけど確実性は1300程度
2.なぜ遅くなるのか?名前解決(DNS/NetBIOS)のタイムアウト待ち
接続設定に「サーバーのコンピュータ名(例: SERVER01)」を使っている
VPN越しでは、Windows標準の「ブロードキャスト(叫んで探す)」が届かないことが多いです
IPアドレスを使用してください
3.なぜ遅くなるのか?往復遅延の積み重ね
現象: 1回のデータ取得で、アプリとサーバーが「数百回〜数千回のやり取り」を行っている。
LANの場合: 応答速度(Ping)が 0.3ms なので、1000回往復しても 0.3秒。気になりません。
VPNの場合: 応答速度が 30ms(インターネット経由)かかるとします。
計算: 30ms × 1000回 = 30秒
結果: LANなら一瞬の処理が、VPNだと30秒待たされることになります。
対策: アプリケーションの改修が必要(1回のクエリでまとめてデータを取るなど)
難しい場合はRDP運用を続ける
○往復遅延を改善する
例としてスケジュールをSQLで読み出しdataGridViewにセルごとにセットするアプリ
の場合 While reader.Read() でループしながら、Grid.Rows.Add(...) で1行ずつ追加しているなら、VPNでは致命的に遅くなります。
重要な2つの設定
AutoGenerateColumns = Falseにする- 「勝手に列を作らないでね」という指示です。
- 「DataPropertyName」を設定する
- 「デザイン画面で作ったこの列には、SQLのこの項目(列名)を入れてね」という紐づけ(マッピング)です。
具体的な手順
手順1:Visual Studioのデザイン画面での設定(推奨)
これが簡単で確実です。
- フォーム上の DataGridView を選択し、右上の小さい三角(▶)をクリックして「列の編集」を開きます。
- 左側のリストから、値を表示させたい列を選びます(例:商品名を表示する列)。
- 右側のプロパティにある
DataPropertyNameという項目を探します。 - ここに、SQL文で書いた列名(AS 〇〇 の名前) を正確に入力します。
- 例:
M.NAを表示したい列なら →NAと入力 - 例:
isnull(j.sno,'0') as JSNOの列なら →JSNOと入力 - 例:
LEFT(..., 30) as BIKOの列なら →BIKOと入力
- 例:
- 全ての列に対してこれを行います
' データ取得
Dim dt As New DataTable()
Using da As New SqlDataAdapter(sql, connection)
da.Fill(dt)
End Using
' ▼【ここが重要】勝手に列を作らせない設定
DataGridView1.AutoGenerateColumns = False
' データソースをセット
DataGridView1.DataSource = dt
' ※もしDataSourceセット後に微調整したい場合だけコードで書く
' DataGridView1.Columns("colSNO").Width = 50