中の技術日誌
 ホーム / 上へ

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時点で行うなど行更新時の負荷は多少あがってしまうと思いますが有効活用できる場面もあるでしょう。


勉強会: 01/12 大阪#5, 02/03 東京#4 , 02/10 大阪#6 登録受付中

中の技術日誌
コンテンツ
わんくま同盟
わんくま同盟
わんくま同盟
広告
バナー
MVP LOGO
MSMVP Visual C# Since 2004/04-2007/03
MCP LOGO
070-316
姉妹サイト
姉妹サイト:じゃんぬのC#, VB.NET 入門
じゃんぬの
C#, VB.NET 入門
検索
Google

ブログ本家
広告