-2

Table1列があります

Id int, Date smalldatetime.

View1他の多くの列の中で、列がありますId int

View1の最大2000 rows値はですが、すべての列の値を決定するためのかなり複雑な計算がいくつかあります。

との間にTable1.Idないものをすべて返すための最も効率的な方法は何ですか?View1.IdTable1.Date'2012-05-30''2012-05-31'

からのフィルタリングされた選択は、Table1通常、約200 unique Table1.Id.

SELECT * FROM View1を実行すると、合計データは常に1秒未満で返されます。Table1 WHERE Date BETWEEN '2012-05-30'と'2012-05-31'からSELECTIdを実行すると、結果は常に瞬時になります。

Table1からSELECTTable1.Idを試した瞬間T1WHEREDate BETWEEN .. AND .. AND NOT EXISTS(SELECT Id from View1 WHERE ViewId = T1.Id)、時間がかかります(ほぼ20秒)。

CTEも使用してみましたが、V1を(View1からのSELECT Id)としてSELECT T1.Id FROM Table1 T1 WHERE Date BETWEEN ... and ... AND NOT EXISTS(SELECT Id from V1 WHERE V1.Id = T1.Id) 、そしてそれも何年もかかりました。

ありがとう。

4

2 に答える 2

1

次のようなことを試してください:

SELECT t.Id, t.[Date]
FROM dbo.Table1 AS t
LEFT HASH JOIN dbo.View1 AS v ON v.Id = t.Id
WHERE t.[Date] >= '20120530' AND t.[Date] < '20120531'
AND v.Id IS NULL

HASH ヒントは、SQL Server クエリ オプティマイザーがビューを 1 回だけ評価するように強制します。

もう 1 つの方法は、テーブル変数を使用してビューの結果を格納することです。

DECLARE @ViewResult TABLE (Id int PRIMARY KEY)
INSERT INTO @ViewResult 
SELECT Id FROM dbo.View1

SELECT Id, [Date]
FROM dbo.Table1
WHERE [Date] >= '20120530' AND [Date] < '20120531'
AND Id NOT IN (SELECT Id FROM @ViewResult)

ラズヴァン

于 2012-06-07T05:47:07.230 に答える
0

先に進むことはほとんどありませんが、ビューを参照する必要がある場合は次のようになります。

SELECT t.Id, t.[Date]
  FROM dbo.Table1 AS t
  WHERE t.[Date] >= '20120530'
  AND t.[Date] < '20120531'
  AND NOT EXISTS 
  (
    SELECT 1 FROM dbo.View1 AS v
    WHERE v.Id = t.Id
  );

しかし、ビューをバイパスできれば、ここでもっと効率的なことができると思います。

于 2012-06-07T05:04:21.630 に答える