我有一个像这样的SQL查询:
with history as (select columnA,columnB,columnC,ROW_NUMBER() OVER (Partition by columnA ORDER BY columnD desc) as rownum from TableA )
select m.columnA,m.columnB,m.columnC from history as m where m.rownum=1
这需要大约5分钟才能执行。 在尝试了不同的东西之后,我发现如果我不包括columnC,这是一个nvarchar(最大值),我得到2秒的结果。但我在结果中需要这个专栏C.
我想让这个查询运行得更快。我只有一个只读连接字符串到数据库,并且没有权限修改表。
我尝试将数据放入分页表中,就像有人在stackoverflow中建议的那样,并没有帮助。 我也尝试限制我在columnC的分页表中收到的字符,这些字符也没有用:
Create Table #PagedTable (
columnA nvarchar(255),
columnB nvarchar(255),
columnC nvarchar(1000),
rownum int
);
with history as (select columnA,columnB,columnC,ROW_NUMBER() OVER (Partition by columnA ORDER BY columnD desc) as rownum from TableA )
Insert into
#PagedTable
select m.columnA,m.columnB,m.columnC from history as m where m.rownum=1
Select * from #PagedTable
如何修改此查询以使其运行更快? 这是针对sql azure server v12版本运行的 正如您在查询中看到的那样,我要做的是对按行分区的行进行编号并获取每个类别中的第一行
编辑:添加更多信息: 索引仅在columnA上。该表有大约10000行,结果有2359行。
答案 0 :(得分:2)
此版本需要多长时间才能运行?
select h.columna, h.columnb, h.columnc
from (select columna, max(columnd) as maxd
from history h
group by columna
) hh join
history h
on h.columna = hh.columna and h.columnd = hh.maxd;
这假设您有history(columna, columnd)
的索引。