1

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 秒です。

それで、クエリを高速化するためのこの正しいアプローチはありますか?

4

2 に答える 2

1

このようにすることもできます:

SELECT ID,
DateBeg,
DateEnd,
Artist,
DescriptionFull,
ActionPlaceID,
ActionTypeID,
Visible,
Created,
DateList,
DatesAsPeriod,
ShowReservLegend,
ProviderID

into #Rec

FROM [ConcertDev].[dbo].[T_Action]
WHERE DateBeg BETWEEN '2012-01-01' AND '2012-06-01'
OR
DateBeg BETWEEN '2013-01-01' AND '2013-06-01' 

SELECT * FROM #Rec
DROP TABLE #Rec
于 2013-06-17T10:23:38.067 に答える
0

UNION ALL を使用している場合は、おそらくそうでしょう。デフォルトでは、UNION は DISTINCT を意味します。これにより、一時テーブルと同じくらいコストがかかる余分な並べ替えステップが発生する可能性があります。

ただし、パフォーマンスに関しては常に「依存」が多いため、説明したシナリオからの逸脱がある場合、実際の答えは異なる場合があります。

私が考えることができる一時テーブルの利点の1つは、indexesそれらに適用できることです。そのため、できるだけ早く結果を取得する必要がある大量のデータを処理する場合に役立ちます。

于 2013-06-17T07:32:42.137 に答える