我在大约1:10秒内返回250,000条记录......对于一份工作来说太长了?
我觉得SQL Server应该更快..
SELECT ColOne
FROM TableA WITH (nolock)
WHERE EXISTS (SELECT ColOne
FROM VIEW_1 WITH (nolock)
WHERE LastDate < GETDATE() - 30)
有什么方法可以提高速度?或者我犯了错误?
*编辑 要澄清有关视图的任何问题 - VIEW_1有可能为ColOne提供多条记录。
查看SQL:
SELECT MAX(LastSeen) AS LastSeenDate, IDValue
FROM dbo.IDValueTable_LASTSEEN WITH (nolock)
WHERE (LastSeen IS NOT NULL) AND EXISTS (SELECT IDValue
FROM dbo.IDValueTable WITH (nolock)) GROUP BY IDValue
**更新 我相信这是工作查询(我仍然需要确认没有更多或更少的记录)
SELECT DISTINCT IDValue FROM dbo.IDValueTable_LASTSEEN WITH (nolock)
WHERE (LastSeen IS NOT NULL) AND (LastSeen < GETDATE() - 30)
AND IDValue IN (SELECT IDValue FROM dbo.IDValueTable WITH (nolock))
我们需要同时应用DISTINCT和你不是EXISTS
答案 0 :(得分:2)
正如@valex在评论中指出的那样,我认为EXISTS
条件是错误的。如果存在LastDate < GETDATE() - 30
的记录,那么你将获得整个表格 - 否则你什么也得不到。
我认为你想要(为了清楚起见,添加了表名)
SELECT ColOne
FROM TableA WITH (nolock)
WHERE TableA.ColOne IN (
SELECT VIEW_1.ColOne
FROM VIEW_1 WITH (nolock)
WHERE LastDate < GETDATE() - 30)
此处的主要性能改进是LastDate
和ColOne
答案 1 :(得分:2)
我只想简单地解决问题的第一部分 - “工作太长了?”
这取决于您的具体实施。您是从网络服务器运行还是作为本地实例运行?硬件,网络流量,服务器利用率等都会影响您的执行时间。
例如:我的公司刚刚升级了容纳SQL数据库的盒子。在这个位置拥有250多名员工,我对绩效改进的体验充其量只是微不足道。我会说上面的建议应该有所帮助。
答案 2 :(得分:1)
假设View中的表格也是我建议的选择中的表格。
为字段LastSeen的表dbo.IDValueTable_LASTSEEN添加索引。
忘掉VIEW,在这种情况下没有增加值,它实际上会减慢查询速度(如果以后你已经过滤了它,为什么要计算最后一个)。
使用以下SELECT。
SELECT DISTINCT IDValue
FROM dbo.IDValueTable_LASTSEEN WITH (nolock)
WHERE (LastSeen IS NOT NULL)
AND (LastSeen < GETDATE() - 30)
AND EXISTS (SELECT IDValue
FROM dbo.IDValueTable WITH (nolock))
答案 3 :(得分:0)
尝试加入表格:
SELECT a.ColOne
FROM TableA a
INNER JOIN VIEW_1 b ON a.ColOne = b.ColOne
WHERE b.LastDate < GETDATE() - 30;
答案 4 :(得分:0)
加入应该更快:
SELECT a.ColOne
FROM TableA AS a
INNER JOIN VIEW_1 AS b
ON a.ColOne = b.ColOne AND b.LastDate < GETDATE() - 30;