使用SQL Server 2012 Express。
下面的SQL查询速度非常慢,需要建议来提高性能或提高效率。
它会查询名为PriceDaily
的表,并在Date
列中查询给定日期,例如2009/11/27
(日期可以是任何日期,实际上由变量确定)。
按日期排序,然后需要将X记录向上移动(+ X)或向下移动(-X)并返回该记录中日期字段的值。例如对于-5,它将向上移动5个记录并返回日期值。
e.g。它将返回2009/11/20
如果表格的一部分看起来像这样(因为2009/11/20
是5 2009/11/27
以上的记录):
2009/11/20
2009/11/23
2009/11/24
2009/11/25
2009/11/26
2009/11/27
2009/11/30
2009/12/01
2009/12/02
2009/12/03
2009/12/04
要优化的查询:
with Records AS
(
select
row_number() over(order by date) as 'row',
*
from [NIG03].[dbo].[PriceDaily]
)
select Date
from records
where row = (SELECT Top 1 ROW_NUMBER() OVER(ORDER BY Date DESC) AS Row
FROM [NIG03].[dbo].[PriceDaily]
WHERE [NIG03].[dbo].[PriceDaily].Date<'2009/11/27'
ORDER BY Date) - X + 1
有关如何优化此查询的任何建议都将受到高度赞赏
答案 0 :(得分:0)
你可以仅使用窗口函数来表达这一点:
select pd.*,
max(case when date = '2009-11-27' then seqnum end) as date_seqnum
from (select pd.*,
row_number() over (order by date) as seqnum
from PriceDaily pd
) pd
where seqnum = date_seqnum - X + 1;
对于此查询(以及您的查询),我认为性能问题是您需要date
上的索引:
create index idx_pricedaily_date on PriceDaily(date);
还有另一种方法(也会从索引中受益):
select pd.*
from PriceDaily pd
where date >= '2009-11-27'
order by date
offset X rows fetch first 1 row only;
当然,您需要针对where
的不同值调整X
中的偏移量和比较方向。
答案 1 :(得分:0)
尝试以下,
declare @date date = '2009/11/27'
declare @up int = -5
with Records AS
(
select row_number() over(order by date) as 'row',
*
from [NIG03].[dbo].[PriceDaily]
)
select Date from records
where row=((select row from record where Date = @date) + (@up))