goo blog サービス終了のお知らせ 

PG(プログラマー)&SEによる業務に役立つプログラミング知識 

主に仕事で覚えた業務で使えるプログラム、パソコン、ソフトウェア、ハードウェアの知識を提供していくブログです。

ストアドファンクション高速化

2008年02月22日 01時13分56秒 | SQLSERVER2005
--ストアドファンクション高速化
--ストアドファンクションでWHERE条件で条件を絞る場合
--パラメータで渡ってくる変数をそのままWHERE文で使う場合よりも
--パラメータで渡ってくる変数を一度、ストアドファンクションで宣言した変数
--に代入してから代入した変数をWHERE文で使う方が処理が速くなる。
--なぜそうなるのか原因はわかりませんが、実際に処理させるとそうなりました。
--SAMPLEの例では処理速度はそんなに変わらないかもしれませんが、同じパラメータの値で
--何度も条件を絞り、なおかつデータ量が多い場合は高速化します。
--パラメータの変数は一度、別の変数に入れましょう。


--悪い例

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SAMPLE01SF]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[SAMPLE01SF]
GO

CREATE FUNCTION [dbo].[SAMPLE01SF]

-- パラメータ宣言
(
@IN_SHORIDATE CHAR(8)
)
RETURNS
-- 戻り値格納用
@RETURN_TABLE TABLE
(
ReturnChi DECIMAL(4,3)
)
AS
BEGIN

-- 処理開始

PROC_START:

INSERT INTO @RETURN_TABLE
SELECT TOP 1
ReturnChi
FROM
SampleTable
WHERE
ShoriNO = '01'
AND ShoriDate = @IN_SHORIDATE --←パラメータの変数をそのまま使う(×)


IF @@ROWCOUNT = 0
BEGIN

INSERT INTO @RETURN_TABLE VALUES ( 0.0 )

END

-- 処理終了

PROC_END:

RETURN

END



--良い例

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[SAMPLE01SF]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[SAMPLE01SF]
GO

CREATE FUNCTION [dbo].[SAMPLE01SF]

-- パラメータ宣言
(
@IN_SHORIDATE CHAR(8)
)
RETURNS
-- 戻り値格納用
@RETURN_TABLE TABLE
(
ReturnChi DECIMAL(4,3)
)
AS
BEGIN

-- 変数宣言

DECLARATION:

DECLARE @sSHORIDATE CHAR(8)

-- 処理開始

PROC_START:

SET @sSHORIDATE = @IN_SHORIDATE --←一度、別の変数に代入(○)

INSERT INTO @RETURN_TABLE
SELECT TOP 1
ReturnChi
FROM
SampleTable
WHERE
ShoriNO = '01'
AND ShoriDate = @sSHORIDATE --←代入した変数を使う(○)
--以下で同じ変数の条件を使う場合は@sSHORIDATEを使う

IF @@ROWCOUNT = 0
BEGIN

INSERT INTO @RETURN_TABLE VALUES ( 0.0 )

END

-- 処理終了

PROC_END:

RETURN

END

SQLテーブルバックアップ作成(INSERT SELECT)

2008年02月20日 23時21分06秒 | SQLSERVER2005
データベースのテーブルのバックアップを簡単に作る方法として

SELECT * INTO バックアップテーブル名 FROM テーブル名

でSELECT文で取得したデータが入ったテーブルが作れます。
意外と便利なので重宝します。

例:商品マスタ全件のバックアップを商品マスタAという名前のテーブルに作る場合は
SELECT * INTO 商品マスタA FROM 商品マスタ

※ただし、作られるテーブルには主キーは設定されません。