1

tableB のいくつかの行に一致する tableA からいくつかのデータを選択するクエリがあります。動作しますが、非常に遅く、数百行を返すのに約 20 分かかります。これがクエリです。どこを改善するか、何を変更するかについての提案があれば幸いです。

SQL Server 2008 を使用しています

DECLARE @MaxDate DATETIME

SELECT @MaxDate = MAX(TimeStamp) -- I know it's not the best column name
FROM tableA
WHERE CodeName IN
(SELECT Tag FROM TableB 
WHERE POSITION = 'UP' AND PLACE = 'Shelf') 

IF @MaxDate > '2011-08-08'
BEGIN

 SELECT @MaxDate = MAX(TimeStamp) -- I know it's not the best column name
FROM tableA
WHERE CodeName IN
(SELECT Tag FROM TableB 
WHERE POSITION = 'UP' AND PLACE = 'Shelf')AND TimeStamp >= '2008-12-24' AND TimeStamp < '2010-12-24'

END
ELSE 
PRINT 'Date out of range'
4

1 に答える 1

1

サブクエリは怪しげに見え、tableAのすべての行に対してテーブルスキャンのリスクがあります。また、必要なクエリは1つだけであり、とにかく他の目的で変数を再利用しないでください。

コードネーム、タグ、位置、タグが適切にインデックス付けされていることを確認してください。「up」/「shelf」タグがあまり一般的でない場合は、tableAのテーブルシークで逃げることができるはずです。

    SELECT
        @MaxDate  = MAX(TimeStamp),
        @MaxDate2 = MAX(                
            CASE WHEN 
                TimeStamp >= '2008-12-24' AND
                TimeStamp < '2010-12-24'
                THEN TimeStamp END)
    FROM
        tableA A
    JOIN
        Tag T ON 
            T.CodeName=A.Tag 
    WHERE   
        T.POSITION = 'UP' AND
        T.PLACE = 'Shelf' 

そして、結果に応じて適切なことをします

IF @MaxDate > '2011-08-08'
BEGIN
    SELECT @MaxDate2
END
ELSE 
PRINT 'Date out of range'
于 2013-03-20T15:09:02.700 に答える