0

我有一个表,其中包含

  • 非唯一标识
  • n 列各种数据

数据更新的日期

我有一个查询,给定一个日期范围,它会获取在该日期范围内更新的条目列表以及在它刚刚找到的更新之前的最后一次更新的条目。通常,日期范围在一天内,因此 07-10-2013 00:00:000 - 7-11-2013 00:00:000。

例如。给定 07-10-2013 00:00:000 - 7-11-2013 00:00:000,查询找到 2 个条目

id   new data      updatedate              old data     last updatedate
3    randomdata    7-10-2013 03:30:343     randomdata   7-05-2013 06:34:764
4    randomdata    7-10-2013 13:30:343     randomdata   6-09-2013 04:37:376

这是我想要得到的结果。目前我已经有一个执行此操作的查询,但查询速度很慢,因为在一个有很多条目的表上有 3 个内部连接,我想知道是否有人能想出一种方法来加快查询速度。使用 SQL Server 2000。

表信息

  • 非唯一标识
  • 唯一 ID(这只是一个自动增量 ID)
  • 要收集的各种数据
  • 更新日期

编辑:

索引目前在id并且updatedate

我目前正在使用的查询(概括它)::WARNING::这不漂亮::WARNING::

select * 
from 
    (select distinct 
        s1.id as id, 
        s1.randData1, s2.randData1, s1.randData2, s2.randData2,..., 
        s1.updatedate as newupdatedate,
        s2.updatedate as prevupdatedate, 
        datediff(second, s1.updatedate ,s2.updatedate) as maxdate 
     from 
        (select * 
         from updates 
         where updatedate >= '{0}' and updatedate < '{1}' 
           and id in ('{3}')) as s1 
     inner join 
        updates s2 on s1.id = s2.id and s1.updateid != s2.updateid) as t1 
 inner join 
     (select 
          s1.id, max(datediff(second, s1.updatedate, s2.updatedate)) as maxdate2 
      from updates s1 
      inner join updates s2 on s1.id in ('{3}') and s1.id = s2.id and s1.updateid != s2.updateid 
      where datediff(second, s1.updatedate, s2.updatedate) < 0
        and s1.updatedate < '{1}' and s2.updatedate < '{1}' 
      group by 
         s1.id) as t2 on t1.id = t2.id and t1.maxdate = t2.maxdate2

{0} {1} 和 {2} 是传入的参数。

编辑:如果有任何区别,查询正在 C# 中执行。如有必要,2个查询也很好。我最终要寻找的是所选日期的数据发生了什么变化。

4

2 回答 2

0

我很幸运地将所有这些嵌套的选择语句放入#Temp 表中。根据您真正在谈论的大小,您可能会使用表变量。

还可以逐步仔细检查您的查询,看看您是否真的需要在每个嵌套查询中长时间携带所有数据。换句话说,是所有嵌套查询都被外部查询消耗掉了,还是有额外的数据过来了。

我认为使用临时表在这里看到的复杂性将是你最好的选择。这样,您所有的嵌套查询都可以构建临时表,而不必将它们保存在内存中。

您的最终查询会更加紧凑和快捷。

于 2013-07-18T03:46:49.470 回答
0

尝试使用临时表 -

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL
   DROP TABLE #temp

SELECT *
INTO #temp
FROM dbo.updates
WHERE ID IN ('{3}')

SELECT * 
FROM 
    (
     SELECT DISTINCT 
             s1.id AS id, 
             s1.randData1, s2.randData1, s1.randData2, s2.randData2,
             s1.updatedate AS newupdatedate,
             s2.updatedate AS prevupdatedate, 
             DATEDIFF(second, s1.updatedate ,s2.updatedate) AS maxdate 
     FROM 
     (
          SELECT *
          FROM #temp
          WHERE updatedate BETWEEN '{0}' AND '{1}'
     ) s1 
     JOIN #temp s2 ON s1.id = s2.id AND s1.updateid != s2.updateid
) t1 
JOIN (
     SELECT 
          s1.id, 
          MAX(DATEDIFF(second, s1.updatedate, s2.updatedate)) AS maxdate2 
     FROM #temp s1 
     JOIN #temp s2 ON s1.id = s2.id AND s1.updateid != s2.updateid 
     WHERE DATEDIFF(second, s1.updatedate, s2.updatedate) < 0
          AND s1.updatedate < '{1}' AND s2.updatedate < '{1}' 
     GROUP BY s1.id
) t2 ON t1.id = t2.id AND t1.maxdate = t2.maxdate2
于 2013-07-18T06:06:48.737 回答