Tables
適用対象: SQL Server 2016 (13.x) 以降 Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
テーブルは、データベースのすべてのデータを格納するデータベース オブジェクトです。 テーブルでは、スプレッドシートのように、データが論理的に行と列の形式にまとめられます。 各行は一意なレコードを表し、各列はレコードのフィールドを表します。 たとえば、会社の従業員のデータを格納するテーブルを、各従業員に相当する行と、従業員の社員番号、姓名、住所、役職名、自宅の電話番号などの情報を格納する列から構成する場合があります。
データベース内のテーブルの数は、データベースで許可されているオブジェクトの数 (2,147,483,647) によってのみ制限されます。 標準のユーザー定義テーブルは、最大で 1, 024 の列を持つことができます。 テーブルの行の数は、サーバーの記憶域容量によってのみ制限されます。
テーブルやテーブルの各列にプロパティを割り当てて、許可されているデータや他のプロパティを制御することができます。 たとえば、列に NULL 値を許容しない制約を作成したり、値が指定されない場合の既定値を設定したりすることができます。また、テーブルにキー制約を割り当てて一意性を強制したり、テーブル間のリレーションシップを定義したりすることもできます。
テーブル内のデータは、行ごとまたはページごとに圧縮できます。 データを圧縮すると、より多くの行をページに格納できます。 詳細については、「 Data Compression」を参照してください。
テーブルの種類
SQL Server には、標準的な役割を果たす基本的なユーザー定義のテーブル以外に、データベース内で特別な目的で使用される次のような種類のテーブルがあります。
パーティション テーブル
パーティション テーブルはデータが行方向に分割されているテーブルで、パーティションがデータベースの複数のファイル グループに分散される場合もあります。 大きなテーブルやインデックスをパーティション分割すると、コレクション全体の整合性を維持しながら、データのサブセットに対するアクセスや管理を迅速かつ効率的に行うことができるので、大きなテーブルやインデックスを管理しやすくなります。 SQL Server では、最大 15,000 個のパーティションを既定でサポートしています。 詳細については、「 Partitioned Tables and Indexes」を参照してください。
一時テーブル
一時テーブルは tempdbに格納されます。 一時テーブルには、ローカル一時テーブルとグローバル一時テーブルの 2 種類があります。 この 2 種類の一時テーブルでは、名前、表示設定、および可用性が異なります。 ローカル一時テーブル名の先頭には、番号記号 (#) が 1 つ付いています。このテーブルは、ユーザーの現在の接続でのみ表示され、ユーザーが SQL Server のインスタンスから切断すると削除されます。 グローバル一時テーブル名の先頭には、番号記号が 2 つ (##) 付いています。このテーブルは、作成されるとすべてのユーザーに表示され、このテーブルを参照するすべてのユーザーが SQL Server のインスタンスから切断すると削除されます。
複数のスコープにまたがる一時テーブルを使用するワークロードの再コンパイルの削減
すべてのデータベース互換レベルにおいて、SQL Server 2019 (15.x) により、複数のスコープにまたがる一時テーブルを使用するワークロードの再コンパイルが減ります。 この機能は、すべてのデプロイ モデルのデータベース互換レベル 150 の Azure SQL Database でも有効になります。 この機能が提供されるまでは、一時テーブルが外側のスコープのバッチによって作成されていた場合、データ操作言語 (DML) ステートメント (SELECT
、INSERT
、UPDATE
、DELETE
) で一時テーブルを参照すると、実行のたびに DML ステートメントが再コンパイルされました。 この改良により、SQL Server では追加の軽量なチェックが実行されて、不要な再コンパイルが回避されます。
- コンパイル時に一時テーブルの作成に使用される外側のスコープのモジュールが、連続実行に使用されるものと同じかどうかを確認してください。
- 最初のコンパイルで行われたデータ定義言語 (DDL) のすべての変更を追跡し、連続実行に対する DDL 操作と比較します。
最終的な結果は、余分な再コンパイルと CPU のオーバーヘッドを削減することです。
システム テーブル
SQL Server では、サーバーの構成とそのすべてのテーブルの構成を定義したデータが、システム テーブルという特殊なテーブル セットに格納されます。 ユーザーは、システム テーブルに対して直接クエリや更新を行うことはできません。 システム テーブル内の情報は、システム ビューから入手できます。 詳細については、「システム ビュー (Transact-SQL)」を参照してください。
幅の広いテーブル
幅の広いテーブルでは、 スパース列 を使用して、テーブルに持たせることができる列の合計数が 30,000 まで増加します。 スパース列は、NULL 値用にストレージが最適化されている通常の列です。 スパース列によって、NULL 以外の値を取得するためのオーバーヘッドは増大しますが、NULL 値に必要となる領域は削減されます。 幅の広いテーブルでは 列セットが定義されています。これは、型指定されていない XML 表記であり、テーブルのすべてのスパース列を 1 つにまとめて構造化した出力です。 インデックスと統計情報の数も、それぞれ 1,000 と 30,000 に増加します。 幅の広いテーブルの最大行サイズは 8,019 バイトです。 そのため、特定の行のデータの大部分を NULL にする必要があります。 幅の広いテーブルの非スパース列と計算列の最大数は合わせて 1,024 のままです。
幅の広いテーブルは、パフォーマンスに対して次のような影響を与えます。
幅の広いテーブルは、テーブルのインデックスの管理にかかるコストを増加させる場合があります。 幅の広いテーブルのインデックスの数は、ビジネス ロジックで必要なインデックスの数に制限することをお勧めします。 インデックスの数が増加すると、DML のコンパイル時間および必要なメモリ容量も増加します。 非クラスター化インデックスは、データのサブセットに適用されるフィルター選択されたインデックスにする必要があります。 詳細については、「 Create Filtered Indexes」を参照してください。
アプリケーションでは、幅の広いテーブルから動的に列を追加したり削除したりできます。 列が追加または削除された場合、コンパイルされたクエリ プランも無効になります。 スキーマの変更が最小限になるように、予測されるワークロードに合わせてアプリケーションを設計することをお勧めします。
データが幅の広いテーブルから追加および削除される場合、パフォーマンスに影響が生じる可能性があります。 テーブルに対する変更が最小限になるように、予測されるワークロードに合わせてアプリケーションを設計する必要があります。
クラスター化キーの複数の行を更新する、幅の広いテーブル上での DML ステートメントの実行を制限します。 これらのステートメントのコンパイルおよび実行には、大量のメモリ リソースが必要になる場合があります。
幅の広いテーブルでのパーティションの切り替え操作は、実行速度が遅く、処理に大量のメモリが必要になる場合があります。 パフォーマンスおよびメモリの要件は、切り替え元のパーティションと切り替え先のパーティションの両方の列の合計数に比例します。
幅の広いテーブルの特定の列を更新する更新カーソルは、FOR UPDATE 句で明示的に列を列挙する必要があります。 これは、カーソルを使用する場合にパフォーマンスを最適化するのに役立ちます。
一般的なテーブルのタスク
次の表に、テーブルの作成や変更に関連する一般的なタスクへのリンクを示します。
テーブルのタスク | トピック |
---|---|
テーブルを作成する方法について説明します。 | テーブルの作成 (データベース エンジン) |
テーブルを削除する方法について説明します。 | テーブルの削除 (データベース エンジン) |
既存のテーブルの一部またはすべての列を含む新しいテーブルを作成する方法について説明します。 | テーブルの複製 |
テーブル名を変更する方法について説明します。 | テーブル名の変更 (データベース エンジン) |
テーブルのプロパティを表示する方法について説明します。 | テーブル定義の表示 |
ビューやストアド プロシージャなどの他のオブジェクトがテーブルに依存しているかどうかを判断する方法について説明します。 | テーブルの依存関係の表示 |
次の表に、テーブル内の列の作成や変更に関連する一般的なタスクへのリンクを示します。
列のタスク | トピック |
---|---|
既存のテーブルに列を追加する方法について説明します。 | テーブルへの列の追加 (データベース エンジン) |
テーブルの列を削除する方法について説明します。 | テーブルからの列の削除 |
列の名前を変更する方法について説明します。 | 列名の変更 (データベース エンジン) |
列の定義のみ、または定義とデータの両方をコピーすることで、あるテーブルから別のテーブルに列をコピーする方法について説明します。 | テーブル間での列のコピー (データベース エンジン) |
データ型やその他のプロパティを変更することによって列定義を変更する方法について説明します。 | 列の変更 (データベース エンジン) |
列の表示順序を変更する方法について説明します。 | テーブル内の列の順序の変更 |
テーブルに計算列を作成する方法について説明します。 | テーブルの計算列の指定 |
列の既定値を指定する方法を説明します。 この値は、別の値が指定されない場合に使用されます。 | 列の既定値の指定 |