Table1
有列
Id int, Date smalldatetime.
View1
在许多其他列中都有Id int
列。
View1
的最大值为2000 rows
,但是有一些相当复杂的计算来确定所有列的值。
在[{1}}和Table1.Id
之间返回View1.Id
Table1.Date
以内的所有'2012-05-30'
的最有效方法是什么?
来自'2012-05-31'
的已过滤选择通常会返回约Table1
200 unique
当我执行SELECT * FROM View1时,总数据总是在一秒钟内返回。当我从Table1 WHERE Date BETWEEN'2012-05-30'EN'2012-05-31'执行SELECT Id时,结果总是不稳定的。
我尝试SELECT Table1.Id从Table1 T1 WHERE Date BETWEEN .. AND .. AND NOT EXISTS(从View1 WHERE ViewId = T1.Id中选择Id),它需要年龄(差不多20秒)。
我也试过使用CTE,WITH V1 as(来自View1的SELECT Id)SELECT T1.Id FROM Table1 T1 WHERE Date BETWEEN ... and ... AND NOT EXISTS(SELECT WH from V1 WHERE V1.Id = T1 .Id),也需要很长时间。
感谢。
答案 0 :(得分: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)
勒兹
答案 1 :(得分: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
);
但我怀疑如果你可以绕过观点,你可以在这里做更有效的事情。