提高MSSQL速度的实例问题。高手帮分析下。。

ltysunde 2011-12-15 04:12:36
有两个表:

tblist
---------------------------------------------
id sname keylist
1 ABC 1,2,3,4
2 BCD 3,4,5
3 EEE 6,7,8,9,10,11,12,13
4 FFF 1,5,7
5 XXX 6,8,9
6 PPP 7,9,10,11,12,15
---------------------------------------------

keywords_tb表
--------------------------------------------
id keyname
1 k1
2 k2
3 k3
4 k4
5 k5
6 k6
7 k7
8 k8
9 k9
10 k10
11 k11
12 k12
13 k13
14 k14
15 k15
16 k16
...................
----------------------------------------------

现在要用SQL语句得到这样的结果.
col0 col1 col2
-----------------------------
1 ABC k1,k2,k3,k4
2 BCD k3,k4,k5

----------------------------
我现在采用的方法如下:

select sname ,dbo.jfun(keylist) as keynamelist from tblist

其中jfun是一个函数代码如下:



CREATE FUNCTION jfun
(
@Idlist varchar(500)
)
RETURNS varchar(1024)
AS
BEGIN
declare @Str varchar(1024)
set @Str = ''
select @Str = @Str + [KeyName]+',' from keywords_tb
where ','+@Idlist+',' like '%,'+cast(id as varchar)+',%'
return @Str
END

=============================================================

结果是正确显示了。
不过速度不够理想。

当显示100条记录的时候,要用2,3秒时间。
有没有什么办法改进一行。我想得到1秒以内的显示速度。
...全文
102 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltysunde 2011-12-15
  • 打赏
  • 举报
回复
自己想了个办法。

因为要的是速度所以就要西生一些东西。

在TBLIST表中建了一个字段叫。

KEYNAMELIST。

然后第一次用存储过程更新过来。
以后就读这一个表。

每周用计划任务。晚上再更新。
因为关健字表,更新的频率不高。。。。

所以就这么做了。

谢谢各位。
结贴。
唐诗三百首 2011-12-15
  • 打赏
  • 举报
回复
明白. 因为2个表都是小数据量, 无法体现性能好坏,

大数据量的话, 我想10楼方法应该不差. 你测试一下咯?



ltysunde 2011-12-15
  • 打赏
  • 举报
回复
楼上的大哥,谢谢你。

我想说的是速度问题。

并不是获取数据的方法。
唐诗三百首 2011-12-15
  • 打赏
  • 举报
回复
try this,

create table tblist
(id int, sname varchar(5), keylist varchar(20))

insert into tblist
select 1, 'ABC', '1,2,3,4' union all
select 2, 'BCD', '3,4,5' union all
select 3, 'EEE', '6,7,8,9,10,11,12,13' union all
select 4, 'FFF', '1,5,7' union all
select 5, 'XXX', '6,8,9' union all
select 6, 'PPP', '7,9,10,11,12,15'

create table keywords_tb(id int, keyname varchar(5))

insert into keywords_tb
select 1, 'k1' union all
select 2, 'k2' union all
select 3, 'k3' union all
select 4, 'k4' union all
select 5, 'k5' union all
select 6, 'k6' union all
select 7, 'k7' union all
select 8, 'k8' union all
select 9, 'k9' union all
select 10, 'k10' union all
select 11, 'k11' union all
select 12, 'k12' union all
select 13, 'k13' union all
select 14, 'k14' union all
select 15, 'k15' union all
select 16, 'k16'


with t as
(select c.id,d.keyname from
(select a.id,
substring(a.keylist,b.number,charindex(',',a.keylist+',',b.number)-b.number) ak
from tblist a
inner join master.dbo.spt_values b
on b.[type]='P' and
substring(','+a.keylist,b.number,1)=',') c
inner join keywords_tb d on c.ak=d.id),
t3 as
(select t1.id,
cast((select t2.keyname+',' from t t2 where t2.id=t1.id for xml path('')) as varchar) ak2
from t t1
group by t1.id
)
select a.id 'col0',b.sname 'col1',
left(a.ak2,len(a.ak2)-1) 'col2'
from t3 a
inner join tblist b
on a.id=b.id
order by a.id

col0 col1 col2
----------- ----- ------------------------------
1 ABC k1,k2,k3,k4
2 BCD k3,k4,k5
3 EEE k6,k7,k8,k9,k10,k11,k12,k13
4 FFF k1,k5,k7
5 XXX k6,k8,k9
6 PPP k7,k9,k10,k11,k12,k15

(6 row(s) affected)
ltysunde 2011-12-15
  • 打赏
  • 举报
回复
能提供比较好的结构思路吗?

快溜 2011-12-15
  • 打赏
  • 举报
回复
你的表结构没什么好的效率
ltysunde 2011-12-15
  • 打赏
  • 举报
回复
最开始用的charindex效率不高。

最后改成了like 并用加上了 with (index=索引名)

也不咋样。

所有就不清楚有更好的办法没?
--小F-- 2011-12-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 geniuswjt 的回复:]
搜索关键字:拆分列值

要么等小F贴
[/Quote]

贴什么贴哦 效率不高的
快溜 2011-12-15
  • 打赏
  • 举报
回复
这个效率也不高
快溜 2011-12-15
  • 打赏
  • 举报
回复
select sname,
keylist=stuff((select ','+keyname from keywords_tb
where charindex(','+rtrim(id)+',',','+a.keylist+',')>0 for xml path('')),1,1,'')
from tblist a
geniuswjt 2011-12-15
  • 打赏
  • 举报
回复
搜索关键字:拆分列值

要么等小F贴
--小F-- 2011-12-15
  • 打赏
  • 举报
回复
说错了 直接charindex搞定
--小F-- 2011-12-15
  • 打赏
  • 举报
回复
这样的拆分字符串效率都不会高

2005+可以试试CTE

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧