使用varchar(max)的SQL选择查询花费了太多时间

时间:2015-07-24 18:28:51

标签: sql sql-server azure azure-sql-database

我有一个像这样的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行。

1 个答案:

答案 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)的索引。