処理するのに時間のかかるストアドプロシジャを、予めスタートアップ時に実行し、
その結果を一時テーブルに保存し、他からのリクエストに応じられるようにする方法について
■ポイントは、二つである。
<0>導出を担当する「導出ストアドプロシジャ」を作成する
これは導出に時間を要するものとする。
既にユーザーデータベース内に作成されているものとする。
<1>導出結果をテンポラリテーブルに保存する「構成用ストアドプロシジャ」を作成する
導出をリクエストするたび処理に時間を要するストアドプロシジャは、
予め実行しておき導出結果をテンポラリテーブルに保存しておく。
結果を保持しているこのテンポラリテーブルに対してリクエストすれば速いからだ。
<2>スタートアップ時に自動的に実行されるように「構成用ストアドプロシジャ」を登録する
テンポラリテーブルは、SQL Server のシャットダウン(再起動)時に、自動的に消去される。
そのため再起動毎にテンポラリテーブルが自動構成されるように、
「構成用ストアドプロシジャ」をSQL Server のスタートアップに設定する。
◆スタートアップによって最終的に実行される、構成用ストアドプロシジャの作成を先ず行った
作成したテンポラリテーブル「構成用ストアドプロシジャ」は、
sp_TEST_StoreResultDataTo_TmpTable_TBLResult である。
ユーザーデータベース MYDataBase に保存した。
(スタートアップによって、最終的にこの構成用ストアドプロシジャが実行されるようにしたい。)
USE MyDataBase
GO
CREATE PROC [dbo].[sp_TEST_StoreResultDataTo_TmpTable_TBLResult]
AS
CREATE TABLE tempdb.dbo.TmpTable_TBLResult
(
コード int NULL
,名前 nvarchar(100) NULL
)
INSERT INTO tempdb.dbo.TmpTable_TBLResult
(
コード int NULL
,名前 nvarchar(100) NULL
)
Exec [dbo].[sp_TEST_ReturnResultData] --時間のかかる導出用プロシジャを呼び出し
コードの説明:
この
sp_TEST_StoreResultDataTo_TmpTable_TBLResult を実行すると、
テンポラリデータベース内
tmpdb にテンポラリテーブル
TmpTable_TBLResult が作成され、
ここに既存の別のストアドプロシジャ
sp_TEST_ReturnResultData による導出結果を、保存される。
作成するテーブルの構造は、
sp_TEST_ReturnResultData による導出結果に合わせること。
この方法で作成されたテンポラリデータベース内の、テンポラリテーブル(名前の頭に#や、##を付けない)は、
接続セッションを問わずにアクセス可能であり、
SQL Server のシャットダウン時には自動的に削除される。
◆ユーザーデータベース内のストアドプロシジャをスタートアップ時に実行されるように設定する
スタートアップ時に、上記ユーザデータベース内の「構成用ストアドプロシジャ」が実行されればよい。
しかし、
スタートアップに登録されるストアドプロシジャは、master データベース内に存在する必要がある。
そのため、スタートアップ時に実行可能なストアドプロシジャ内部から、
ユーザーデータベース内のさきの「構成用ストアドプロシジャ」を実行するようにする。
○スタートアップ時に直接実行されるストアドプロシジャを次のように作成した。
USE [master]
GO
CREATE PROC [dbo].[sp_startup_userproc]
AS
Exec [MyDataBase].[dbo].[sp_TEST_StoreResultDataTo_TmpTable_TBLResult]
コードの説明:
sp_startup_userproc は、master データベース内に保存されるストアドプロシジャである。
この中から、ユーザーデータベース MyDataBase 内の、既に作成済みの「構成用ストアドプロシジャ」を実行する。
○スタートアップの登録を行う。
この作成したストアドプロシジャ sp_startup_userproc を、次のようにしてスタートアップに登録する。
USE [master]
GO
sp_procoption
@ProcName = 'sp_startup_userproc',
@OptionName = 'startup',
@OptionValue = 'on' --解除する場合は、off
これらによって、SQL Server が起動されるとき、一連のストアドプロシジャが実行される。
まとめると、次のような流れになる。
<SQL Server スタートアップ>
↓
(スタートアップ時に直接実行されるmasterデータベース内のストアドプロシジャ)
[master].[dbo].[sp_startup_userproc]
↓
(副次的に呼び出されるユーザーデータベース内の構成用ストアドプロシジャ)
[MyDataBase].[dbo].[sp_TEST_StoreResultDataTo_TmpTable_TBLResult]
この結果、起動時には必要なテンポラリテーブル tempdb.dbo.TmpTable_TBLResult が復元される。
あとは、任意のストアドプロシジャから、この構成済み一時テーブルを自由に使えばよい。
(参考 : 一時テーブルについて )
・Local and global temporary tables in SQL Server
<http://stackoverflow.com/questions/2920836/local-and-global-temporary-tables-in-sql-server> 2015年12月11日
・How to insert data from one table to another table
<https://blogs.technet.microsoft.com/mdegre/2009/09/08/how-to-insert-data-from-one-table-to-another-table/> 2015年12月11日
・Temporary Tables and Table Variables in Microsoft SQL Server 2008 T-SQL Programming
<https://www.microsoftpressstore.com/articles/article.aspx?p=2233324> 2015年12月11日
・In SQL Server 2008 ,is it possible to disable auto drop of global temp table
<http://stackoverflow.com/questions/2826282/in-sql-server-2008-is-it-possible-to-disable-auto-drop-of-global-temp-table> 2015年12月11日
( 参考 : スタートアップに関して )
・sp_procoption is not executing strored procedure with OPENQUERY
<http://stackoverflow.com/questions/31213192/sp-procoption-is-not-executing-strored-procedure-with-openquery> 2015年12月11日
・Configure Stored Procedures to Automatically Run at SQL Server Startup
<http://zarez.net/?p=1566> 2015年12月11日
・sp_procoption (Transact-SQL)
<https://msdn.microsoft.com/en-us/library/ms181720.aspx> 2015年12月11日