-2

Table1有列

Id int, Date smalldatetime.

View1在许多其他列中,有 column Id int

View1的最大值为2000 rows,但有一些相当复杂的计算来确定所有列的值。

返回所有Table1.Id不在介于and之间的最有效方法View1.Id是什么?Table1.Date'2012-05-30''2012-05-31'

过滤后的选择Table1通常返回约200 unique Table1.Id.

当我执行 SELECT * FROM View1 时,总数据总是在一秒钟内返回。当我从 Table1 WHERE Date BETWEEN '2012-05-30' AND '2012-05-31' 中执行 SELECT Id 时,结果总是即时的。

当我尝试 SELECT Table1.Id from Table1 T1 WHERE Date BETWEEN .. AND .. AND NOT EXISTS (SELECT Id from View1 WHERE ViewId=T1.Id) 时,它需要很长时间(几乎 20 秒)。

我也尝试使用 CTE,将 V1 用作(从 View1 中选择 ID)从表 1 T1 中选择 T1.Id,其中日期在 ... 和...之间并且不存在(从 V1 中选择 Id,其中 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 查询优化器只评估一次视图。

另一种方法是使用表变量来存储视图的结果:

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 回答