とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub
スポンサードリンク

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

スポンサードリンク

インデックス付きViewの作成

Viewがクソ遅い時にIndexの検討をすればいいんかな。

メリットは多そうやけど、デメリットもあるっぽいので
注意して扱ったほうがいいかもしれん。

以下参考されたし
http://technet.microsoft.com/ja-jp/library/cc917715.aspx

http://handcraft.blogsite.org/ComponentGeek/ShowArticle/122.aspx

http://d.hatena.ne.jp/zecl/20080302/p3

作成時の間違えやすい点とかは以下
・ビューでは、テーブルとユーザ定義関数について、スキマー名.オブジェクト名の2つの要素で構成される名前で参照すること。
・ビュー内の式で参照される関数は決定的であること。
 決定的であるとは、関数の引数に同じ値を渡した場合、
 常に同じ値が返される状態を指す。これに対して、GETDATEやNEWID関数は、
 実行する度に異なる値が返されるので非決定的関数と言える。


サンプルソース

SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET CONCAT_NULL_YIELDS_NULL ON
SET NUMERIC_ROUNDABORT OFF
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
GO

-- あったら消す
IF OBJECT_ID('dbo.View_1') IS NOT NULL
DROP VIEW dbo.View_1
GO
IF OBJECT_ID('dbo.TEST_TABLE') IS NOT NULL
DROP VIEW dbo.View_1
GO
IF OBJECT_ID('dbo.TEST_TABLE2') IS NOT NULL
DROP VIEW dbo.View_1
GO

-- ビュー用テーブル1
CREATE TABLE [dbo].[TEST_TABLE](
[PK1] [varchar](50) NOT NULL,
[pk2] [varchar](50) NOT NULL,
[col1] [varchar](50) NULL,
[col2] [varchar](50) NULL,
[col3] [varchar](50) NULL,
CONSTRAINT [PK_TEST_TABLE] PRIMARY KEY CLUSTERED
(
[PK1] ASC,
[pk2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


-- ビュー用テーブル2
CREATE TABLE [dbo].[TEST_TABLE2](
[PK1] [varchar](50) NOT NULL,
[pk2] [varchar](50) NOT NULL,
[col1] [varchar](50) NULL,
[col2] [varchar](50) NULL,
[col3] [varchar](50) NULL,
[col4] [varchar](50) NULL,
[col5] [varchar](50) NULL,
CONSTRAINT [PK_TEST_TABLE2] PRIMARY KEY CLUSTERED
(
[PK1] ASC,
[pk2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO



-- VIEW作成
CREATE VIEW dbo.View_1 WITH SCHEMABINDING
AS
SELECT TBL1.PK1 AS TT_PK1
, TBL1.pk2 AS TT_PK2
, TBL1.col1 AS T1_COL1
, TBL1.col2 AS T1_COL2
, TBL1.col3 AS T1_COL3
, TBL2.col1 AS T2_COL1
, TBL2.col2 AS T2_COL2
, TBL2.col3 AS T2_COL3
, TBL2.col4 AS T2_COL4
FROM dbo.TEST_TABLE TBL1
INNER JOIN dbo.TEST_TABLE2 TBL2
ON TBL2.PK1 = TBL1.PK1
AND TBL2.PK2 = TBL2.PK2
GO

-- INDEX作成(クラスタ)
CREATE UNIQUE CLUSTERED INDEX PK_View_1
ON dbo.View_1 ( TT_PK1, TT_PK2 )
GO

-- INDEX作成(ノンクラ)
CREATE NONCLUSTERED INDEX IX_View_1
ON dbo.View_1 ( T1_COL1, T1_COL2, T1_COL3 )
GO

▼この記事を読んだ方は、こんな記事も読んでいます。▼

スポンサードリンク

テーマ:ブログ日記 - ジャンル:ブログ

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://dalmore.blog7.fc2.com/tb.php/10-e6cb8b5d
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。