Sql select 使用 varchar (max) 的查询花费太多时间

Sql select query with varchar (max) is taking too much time

我有一个 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 (max),我会在 2 秒内得到结果。但是我的结果中需要这个 C 列。

我想让这个查询 运行 更快。我只有一个到数据库的只读连接字符串,没有修改 table.

的权限

我尝试按照 Whosebug 中有人的建议将数据放入分页 table 中,但没有帮助。 我还尝试限制我在分页 table 中为 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

如何修改此查询以使其 运行 更快? 这是 运行ning 对 sql azure server v12 版本 正如您在查询中看到的那样,我想要做的是对按 columnA 分区的行进行编号并获取每个类别中的第一行

编辑:添加更多信息: 索引仅在列 A 上。 table 有大约 10000 行,结果有 2359 行。

这个版本需要多长时间才能运行?

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) 上有一个索引。