使用查询子查询对SQL查询进行的任何改进?

时间:2013-10-30 13:38:35

标签: sql sql-server

我在大约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

5 个答案:

答案 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)

此处的主要性能改进是LastDateColOne

上的索引

答案 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;