MS SQL Server 2008 R2 でいくつかのクエリを高速化しようとしていますが、2 つの方法があります。
1)一時テーブルを作成することにより:
IF OBJECT_ID('tempdb..#Rec') IS NOT NULL
BEGIN
DROP TABLE #Rec
END
CREATE TABLE #Rec
(
ID int NULL,
DateBeg datetime NULL,
DateEnd datetime NULL,
Artist varchar(200) NULL,
DescriptionFull text NULL,
ActionPlaceID int NULL,
ActionTypeID smallint NULL,
Visible tinyint NULL,
Created datetime NULL,
DateList varchar(4000) NULL,
DatesAsPeriod tinyint NULL,
ShowReservLegend tinyint NULL,
ProviderID int NULL
)
INSERT INTO #Rec
SELECT ID,
DateBeg,
DateEnd,
Artist,
DescriptionFull,
ActionPlaceID,
ActionTypeID,
Visible,
Created,
DateList,
DatesAsPeriod,
ShowReservLegend,
ProviderID
FROM [ConcertDev].[dbo].[T_Action]
WHERE DateBeg BETWEEN '2012-01-01' AND '2012-06-01'
INSERT INTO #Rec
SELECT ID,
DateBeg,
DateEnd,
Artist,
DescriptionFull,
ActionPlaceID,
ActionTypeID,
Visible,
Created,
DateList,
DatesAsPeriod,
ShowReservLegend,
ProviderID
FROM [ConcertDev].[dbo].[T_Action]
WHERE DateBeg BETWEEN '2013-01-01' AND '2013-06-01'
SELECT * FROM #Rec
2) UNION ALL を使用する場合:
SELECT ID,
DateBeg,
DateEnd,
Artist,
DescriptionFull,
ActionPlaceID,
ActionTypeID,
Visible,
Created,
DateList,
DatesAsPeriod,
ShowReservLegend,
ProviderID
FROM [ConcertDev].[dbo].[T_Action]
WHERE DateBeg BETWEEN '2012-01-01' AND '2012-06-01'
UNION ALL
SELECT ID,
DateBeg,
DateEnd,
Artist,
DescriptionFull,
ActionPlaceID,
ActionTypeID,
Visible,
Created,
DateList,
DatesAsPeriod,
ShowReservLegend,
ProviderID
FROM [ConcertDev].[dbo].[T_Action]
WHERE DateBeg BETWEEN '2013-01-01' AND '2013-06-01'
UNION ALL の方がはるかに高速であると予想していましたが、そうではありませんでした。1秒だけ速くなります。
レコード数は 6147 です。一時テーブル メソッドを使用すると、実行時間は 18 秒です。UNION ALL メソッドを使用すると、実行時間は 17 秒です。
それで、クエリを高速化するためのこの正しいアプローチはありますか?