SDS でも使用される TDS とは

マイクロソフトの太田です。前回のSQL Data Serviceの記事の後で、TDSを検索してみましたが、「東京ディズニーシー」等がリストアップされ、適切な結果を得ることができませんでしたので、簡単にTDSについて解説しておきます。

TDSはTabular Data Streamの略で、テーブル形式のデータストリームというところでしょうか。データベースアプリケーションとしてのクライアントと、SQL Server間で情報をやりとりするためのアプリケーション層のプロトコルです。プロトコルですので、そこでやりとりされるメッセージの形式・フォーマットとそれぞれのメッセージを送受信する際の状態、条件等(状態遷移)が規定されます。

元々TDSというプロトコルはSybaseのSQL Serverで使用されていたもので、今でもMicrosoftもSybase社もTDSと呼んでいます。バージョンはそれぞれに進化していますが、基本的なSyntax等は多くは変わっていません。私は90年代初頭にSybaseの日本法人ができた当初から3年間ほどSybaseのエンジニアリング部門でソースコードを見ていました。当時は今のSQL Server のプロファイラーのようなツールがなく、サーバの挙動をしらべるために、このプロトコルをネットワークの途中で取り出し、解析するプログラムを作った記憶があります。当時はTDSは仕様が公開されていなかったのですが、今はTDSの仕様は公開されています。

https://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-TDS%5D.pdf

このプロトコルがテーブル形式と呼ばれる理由を以下の例から見てみましょう。図は、Microsoft Network Monitor 3.1でSQL Server Management StudioとSQL Server 2008との間のSQL (Select * from table_a)とその応答をモニターしたところです。

図1 SQL Server Management Studio の結果画面

 

図2 SQL Server からSSMSへの応答メッセージのパケット詳細(クリックすると画面を拡大します)

 

詳細に表示されているものが、SQL Serverからの応答メッセージです。

Hex Detailの中で紫色の04から始まる部分がTCPのペイロードとしてのTDSメッセージです。04はこのメッセージがSQL Responseであることを意味しています。その後に状態や長さ(0x0074=112バイト=04から最後の00までのバイト数) が続きます。水色の81から始まる部分がCOLMETADATA(カラムのメタ情報)となり、カラム名(緑色でマーキング)をはじめとするカラム情報が含まれています。次に水色のD1から始まる部分がROW(各行)データです。ここではInt型の値(長さ0x04バイトと値0x00000001)とCHARの文字列(長さ0x0Aと値 'aaaaaaaaaa')が返ってきていることが分かります。

さらに2行目も同様に0xD1 からはじまります。このようにテーブルそのものの形式が送られてくるためにTDSと呼ばれます。

TDSは1980年代というネットワークが非常に低速な時代に考えられたプロトコルであり、またデータベースというパフォーマンスが最優先されるサーバに対するプロトコルであるために冗長的な情報はほとんどありません。密結合を前提としたプロトコルです。最近のRESTのようなプロトコルと対比すると違いが明らかですね。