データベース オブジェクトについて説明する

完了

テーブルに加えて、リレーショナル データベースには、データ編成の最適化、プログラムのアクションのカプセル化、アクセス速度の向上に役立つ、他の構造体を含めることができます。 このユニットでは、ビューストアド プロシージャ、およびインデックスという 3 つの構造についてさらに詳しく説明します。

ビューとは

ビューは、SELECT クエリの結果に基づく仮想テーブルです。 ビューは、基になる 1 つ以上のテーブル内の指定された行のウィンドウと考えることができます。 たとえば、注文と顧客データを取得する OrderCustomer のテーブルのビューを作成して、注文の配送先住所を簡単に特定できる単一のオブジェクトを提供できます。

CREATE VIEW Deliveries
AS
SELECT o.OrderNo, o.OrderDate,
       c.FirstName, c.LastName, c.Address, c.City
FROM Order AS o JOIN Customer AS c
ON o.Customer = c.ID;

ビューに対してクエリを実行し、テーブルとほぼ同じ方法でデータをフィルター処理できます。 次のクエリでは、シアトルに住んでいる顧客の注文の詳細が検索されます。

SELECT OrderNo, OrderDate, LastName, Address
FROM Deliveries
WHERE City = 'Seattle';

ストアド プロシージャとは

ストアド プロシージャは、コマンドで実行できる SQL ステートメントを定義します。 ストアド プロシージャは、アプリケーションがデータを操作するときに実行する必要があるアクションのプログラム ロジックをデータベースにカプセル化するために使用されます。

パラメーターを使用してストアド プロシージャを定義して、特定のキーまたは条件に基づくデータに適用する必要がある共通するアクションに対して、柔軟なソリューションを作成できます。 たとえば、次のストアド プロシージャを定義して、指定した製品 ID に基づいて製品の名前を変更できます。

CREATE PROCEDURE RenameProduct
	@ProductID INT,
	@NewName VARCHAR(20)
AS
UPDATE Product
SET Name = @NewName
WHERE ID = @ProductID;

製品の名前を変更する必要が生じたら、ストアド プロシージャを実行して、製品の ID と新しく割り当てる名前を渡します。

EXEC RenameProduct 201, 'Spanner';

インデックスとは

インデックスは、テーブル内でのデータ検索に便利です。 テーブルのインデックスは、書籍の最後に記載される索引のようなものです。 書籍の索引には、並べ替えられた参照のセットと、各参照が存在するページが記載されます。 書籍内である項目に関する参照を見つけたい場合は、索引を調べます。 索引内のページ番号を使用すると、書籍内の正しいページに直接進むことができます。 索引がなければ、探している参照を見つけるために、書籍を最初から最初まで読むことになります。

データベースにインデックスを作成する場合は、テーブルの列を指定します。インデックスによって、テーブル内の対応する行へのポインターも含めて、このデータのコピーが並べ替えられた順序で格納されます。 WHERE 句でこの列を指定するクエリをユーザーが実行すると、データベース管理システムは、このインデックスを使用してテーブル全体を 1 行ごとスキャンする場合よりも速くデータを取り込むことができます。

たとえば、次のコードを使用して、Product テーブルの Name 列にインデックスを作成できます。

CREATE INDEX idx_ProductName
ON Product(Name);

インデックスは、データベース システムのクエリ オプティマイザーが指定した Name に基づいて Product テーブル内の行をすばやく検索するために使用できるツリーベースの構造を作成します。

ツリーベースの構造を作成するインデックスの例。

行が少ないテーブルの場合、インデックスの使用は、単にテーブル全体を読み取り、クエリによって要求された行を見つける (この場合、クエリ オプティマイザーはインデックスを無視します) ほど効率的ではない可能性があります。 ただし、テーブルに多数の行がある場合、インデックスによってクエリのパフォーマンスが大幅に向上する可能性があります。

テーブルでは、インデックスを多数作成できます。 そのため、価格に基づいて製品を検索する場合は、Product テーブルの Price 列に別のインデックスを作成すると便利な場合があります。 ただし、インデックスはコストがかからないわけではありません。 インデックスは、記憶領域を消費するため、テーブル内でデータを挿入、更新、または削除するたびに、そのテーブルのインデックスを維持しなくてはなりません。 この追加作業により、挿入、更新、および削除の操作が遅くなる可能性があります。 したがって、クエリの実行を高速化するインデックスと、他の操作の実行コストのバランスについて見極める必要があります。