SQLserverでVPN越えでアクセスすると異常に遅くなる

1.なぜ遅くなるのか?(VPNの「梱包」問題)
ip pp mtu 1454という設定で
ip tunnel tcp mss limit auto

この設定が大問題

1454 は「道路(NTT回線)が通せるトラックの最大サイズ」です。 VPN(L2TP/IPsec)を使うと、元のデータ(SQLの通信)に「暗号化ヘッダ」や「トンネルヘッダ」という余分な荷札が付きます。

  1. SQL Serverが、道路ギリギリサイズ(1454付近)のデータを送ろうとする。
  2. VPNルーターがそれに「暗号化ヘッダ」を上乗せする。
  3. 合計サイズが 1454 を超えてしまう。
  4. ルーターは仕方なくデータを**分割(フラグメント)**して送る。
  5. 【ここが原因】 分割処理はルーターに高負荷がかかる上、分割されたパケットが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つの設定

  1. AutoGenerateColumns = False にする
    • 「勝手に列を作らないでね」という指示です。
  2. 「DataPropertyName」を設定する
    • 「デザイン画面で作ったこの列には、SQLのこの項目(列名)を入れてね」という紐づけ(マッピング)です。

具体的な手順

手順1:Visual Studioのデザイン画面での設定(推奨)

これが簡単で確実です。

  1. フォーム上の DataGridView を選択し、右上の小さい三角(▶)をクリックして「列の編集」を開きます。
  2. 左側のリストから、値を表示させたい列を選びます(例:商品名を表示する列)。
  3. 右側のプロパティにある DataPropertyName という項目を探します。
  4. ここに、SQL文で書いた列名(AS 〇〇 の名前) を正確に入力します。
    • 例: M.NA を表示したい列なら → NA と入力
    • 例: isnull(j.sno,'0') as JSNO の列なら → JSNO と入力
    • 例: LEFT(..., 30) as BIKO の列なら → BIKO と入力
  5. 全ての列に対してこれを行います
' データ取得
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