SQL:SQL Server 2005 計算列
2005/07/13
この文書はSQL Server 2005 CTP June/2005時点をベースに記述されています。
SQL Server
2005では計算列という機能が追加されました。
計算列とは独自の値を持たずに、演算した結果を持つカラムでExcelの計算式のようなものです。
CREATE TABLE [dbo].[T計算列]( [row] [int] NOT NULL, [col] [int] NOT NULL, [su] AS ([row]*[col]) ) ON [PRIMARY]
このようなSQLで金額を行*列で割り出してくれるようになります。
この計算列はインデックスを持つことができるところがポイントです。
どの程度パフォーマンス向上が期待できるかなど、実際にやってみましょう。
まずはテーブルを作成します。
CREATE TABLE [dbo].[T計算列]( [row] [int] NOT NULL, [col] [int] NOT NULL, [su] AS ([row]*[col]) ) ON [PRIMARY] GO CREATE NONCLUSTERED INDEX [IX_T計算列] ON [dbo].[T計算列] ( [su] ASC )WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF>) ON [PRIMARY] GO CREATE TABLE [dbo].[T通常]( [row] [int] NOT NULL, [col] [int] NOT NULL ) ON [PRIMARY] GO
テストデータをINSERTします。
この例では100x100の1万レコードを双方のテーブルに対してINSERTします。
set nocount on truncate table T計算列 truncate table T通常 declare @i int declare @j int set @i = 0 while @i < 100 begin set @j = 0 while @j < 100 begin insert into T計算列(row, col) values(@i, @j) insert into T通常(row, col) values(@i, @j) set @j = @j + 1 end set @i = @i + 1 end
これで環境は準備できましたので、以下のSQLを流して実行プランを取得してみてください。
select * from T計算列 where su = 1000 select * from T通常 where row*col = 1000
いかがでしょうかインデックスが利いているため、T計算列の方ではインデックスシークになっています。
もちろんインデックスを使っている、計算をINSERT,
UPDATE時点で行うなど行更新時の負荷は多少あがってしまうと思いますが有効活用できる場面もあるでしょう。