0

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

有什么提高速度的方法吗?还是我犯了错误?

*EDIT 澄清有关视图的任何问题 - 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 和你的 IN not EXISTS

4

5 回答 5

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

于 2013-10-30T13:55:36.630 回答
2

我只想简单地回答问题的第一部分——“工作时间太长?”

这取决于您的特定实现。您是从网络服务器运行它,还是作为本地实例运行它?硬件、网络流量、服务器利用率等都会影响您的执行时间。

例如:我的公司刚刚升级了容纳我们的 SQL 数据库的盒子。在这个地方有 250 多名员工,我对绩效改进的体验充其量只是微不足道的。我想说上面的建议应该会有所帮助。

于 2013-10-30T14:05:25.043 回答
1

假设视图中的表也是我建议的选择中的表。

为字段 LastSeen 向表 dbo.IDValueTable_LASTSEEN 添加索引。

忘记 VIEW,在这种情况下不会增加价值,它实际上会减慢查询速度(如果稍后您已经在过滤它,为什么还要计算 lastseen 的最大值)。

使用以下 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))
于 2013-10-30T17:07:07.623 回答
0

尝试加入表格:

SELECT a.ColOne 
FROM TableA a
INNER JOIN VIEW_1 b ON a.ColOne = b.ColOne
WHERE b.LastDate < GETDATE() - 30;
于 2013-10-30T13:50:51.977 回答
0

加入应该更快:

SELECT a.ColOne 
FROM TableA AS a
     INNER JOIN VIEW_1 AS b 
     ON a.ColOne = b.ColOne AND b.LastDate < GETDATE() - 30;
于 2013-10-30T13:52:32.633 回答