+ -
当前位置:首页 → 问答吧 → FOR XML PATH 语句 求优化

FOR XML PATH 语句 求优化

时间:2011-11-10

来源:互联网

我有类似这样的表t:
A B C 
1 1 asd
1 2 sdf
1 3 dfg
2 1 fgh
2 2 ghj
2 3 hjk
2 4 jkl
3...
大概一共50W行。

要得到
1 asd\sdf\dfg
2 fgh\ghj\hjk\jkl
3 ...

我使用
SELECT A,
SUBSTRING((SELECT '\' + C FROM t L WHERE L.A = F.A ORDER BY L.B FOR XML PATH(''))) 
FROM t F
GROUP BY A

但是查询非常的慢。
请问各位,听说子查询时索引很有用,我需要为这个表建索引吗?怎么建立?

不胜感激。

作者: siegebaoniu   发布时间: 2011-11-10

最好的方法就是不在sql中做拆分列值和合并列值,在程序里处理

作者: geniuswjt   发布时间: 2011-11-10

不用一次把50万行都取出来吧,眼睛也看不过来呀,分页吧

作者: pengxuan   发布时间: 2011-11-10

这个木有办法优化了。

作者: fredrickhu   发布时间: 2011-11-10

给A加主键 不过貌似还是会慢

作者: q465897859   发布时间: 2011-11-10

引用楼主 siegebaoniu 的回复:
我有类似这样的表t:
A B C
1 1 asd
1 2 sdf
1 3 dfg
2 1 fgh
2 2 ghj
2 3 hjk
2 4 jkl
3...
大概一共50W行。

要得到
1 asd\sdf\dfg
2 fgh\ghj\hjk\jkl
3 ...

我使用
SELECT A,
SUBSTRING((SELECT '\' + C FROM t L……


就2列,A,B,C一块建个覆盖索引。 所查即所得。

作者: OrchidCat   发布时间: 2011-11-10

引用楼主 siegebaoniu 的回复:
我有类似这样的表t:
A B C
1 1 asd
1 2 sdf
1 3 dfg
2 1 fgh
2 2 ghj
2 3 hjk
2 4 jkl
3...
大概一共50W行。

要得到
1 asd\sdf\dfg
2 fgh\ghj\hjk\jkl
3 ...

我使用
SELECT A,
SUBSTRING((SELECT '\' + C FROM t L……


SUBSTRING((SELECT '\' + C FROM t L WHERE L.A = F.A ORDER BY L.B FOR XML PATH(''))) 

用法不正确
 SQL code
stuff((SELECT '\' + C FROM t L WHERE L.A = F.A ORDER BY L.B FOR XML PATH('')),1,1,'')

作者: roy_88   发布时间: 2011-11-10

lz 的sql 基本没法通过 建索引优化。

分页,从业务上优化

支持2楼的说法

作者: fanzhouqi   发布时间: 2011-11-10