我试图将一个DB表行转换为列并使用PIVOT函数和游标,这里是Sql:
DECLARE Cur CURSOR FOR
SELECT DISTINCT CounterId
FROM AllCounterIds
DECLARE @Temp NVARCHAR(MAX),
@AllCounterIds NVARCHAR(MAX),
@CounterIdQuery NVARCHAR(MAX)
SET @AllCounterIds = ''
OPEN Cur
-- Getting all the movies
FETCH NEXT FROM Cur INTO @Temp
WHILE @@FETCH_STATUS = 0
BEGIN
SET @AllCounterIds = @AllCounterIds + '[' + @Temp + '],'
FETCH NEXT FROM Cur INTO @Temp
END
CLOSE Cur
DEALLOCATE Cur
SET @AllCounterIds = SUBSTRING(@AllCounterIds, 0, LEN(@AllCounterIds))
SET @CounterIdQuery = 'SELECT DateTime, ' + @AllCounterIds + '
FROM
(SELECT Type, DateTime, Value, AllCounterIds.CounterId
FROM AllCounterIds
INNER JOIN AllCounters
ON AllCounterIds.CounterId = AllCounters.CounterId) S
PIVOT
(
SUM (Value)
FOR CounterId IN
(' + @AllCounterIds + ')) AS pvt'
EXEC sp_executesql @CounterIdQuery
其中AllCounterIds是我使用它创建的视图:
GO
CREATE VIEW AllCounterIds AS
SELECT DISTINCT CounterId FROM AllCounters
GO
所以问题是到目前为止我在表中有大约27993600行,当我执行SQL时需要花费4分钟和15秒来给我输出,并且根据性能要求它是坏的...所以我的问题是那么,无论如何,我可以在哪里实现我想要的结果但是获得更好的表现?
只是为了让你知道集群索引也在表格中定义......
答案 0 :(得分:2)
我不确定它对你的情况实际上更快,但也许尝试这样的事情
declare
@allcounterids varchar(max),
@counteridquery varchar(max)
;
select
@allcounterids = stuff((
select
'],[' + cast([CounterId] as varchar(32))
from
allcounterids
for xml path('')), 1, 2, '') + ']'
;
set @counteridquery = 'select
s.datetime, pvt.*
from
(SELECT Type, DateTime, Value, AllCounterIds.CounterId
FROM AllCounterIds
INNER JOIN AllCounters
ON AllCounterIds.CounterId = AllCounters.CounterId
) S
PIVOT
(
SUM (Value)
FOR CounterId IN
(' + @AllCounterIds + ')
) AS pvt;'
;
execute(@counteridquery);
使用varchar
代替nvarchar
是故意的。对于整数列表来说,需要 unicode不太可能,它会节省一些内存,因此可能需要时间。