[英]sql server query performance issues
我有一个表,其中包含
数据更新的日期
我有一个查询,给定一个日期范围,它获取在该日期范围内更新的条目的列表,以及在它刚找到之前的最后一个更新的条目。 通常,日期范围在一天之内,因此,2013年7月10日00:00:000-2013年7月11日00:00:000。
例如。 给定2013年7月10日00:00:000-2013年7月11日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
并已updatedate
我当前正在使用的查询(概括地说) ::警告:: 不太漂亮 ::警告::
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#中执行查询。 如有必要,两个查询也可以。 我最终要寻找的是所选日期数据的变化。
我非常幸运地将所有这些嵌套的select语句放入#Temp表中。 根据您实际说话的大小,可以使用表变量。
也可以逐步检查您的查询,以查看是否真的需要在每个嵌套查询中长时间携带所有数据。 换句话说,所有嵌套查询是否都被外部查询占用,还是多余的数据流了过来。
我认为使用临时表的复杂性将是您最好的选择。 这样,您所有的嵌套查询都可以构建临时表,而不必将其保存在内存中。
您的最终查询将更紧凑,更快捷。
尝试使用临时表-
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.