关于mssql2005 字段结构设计对查询速度的影响

时间:2021-05-27 00:28:37
我现在用的asp+mssql2005  数据有30万条,有10个字段,有5个字段是ntext。

问题1、我在内容列表网页中用select schoolname,shijian,dizhi,schoolid from school where schooltype=5 order by schoolid desc  来查询数据。

经常用到的字段就是schoolname,shijian,dizhi,schoolid。

而其他字段都是需要查看内容页的时候才用到,请问是否可以把不常用的字段移动到另外一张表中,这样列表网页中用select schoolname,shijian,dizhi,schoolid from school where schooltype=5 order by schoolid desc  来查询数据是不是会提高速度?

问题2、我有一个搜索网页,用的是select  schoolname,shijian,dizhi,schoolid  from school where schoolname like '%湖北中学%' 来查询,感觉非常慢,大概需要20秒才返回数据。有什么办法优化?

10 个解决方案

#1


打开执行计划看看,没有索引就加个索引!

#2


schoolname如果唯一的话,就设置成主键;否则,设置一个非聚簇索引

#3


我有2个问题呢,第一个呢?

#4




1、可以把表拆分一下,通过把那些ntext的字段,放到另一个表中,可以提高速度,另外,建议你把ntext改为nvarchar(max) 类型。

2、这个由于是like '%xxx%'所以没办法建立索引,建议用全文检索技术,提高速度

#5


select schoolname,shijian,dizhi,schoolid from school where schooltype=5 order by schoolid desc  就只查询了schoolname,shijian,dizhi,schoolid 这几个字段,其他的字段没有查询啊,难道其他的几个ntext字段会影响这次select 查询吗?

#6


Quote: 引用 4 楼 yupeigu 的回复:



1、可以把表拆分一下,通过把那些ntext的字段,放到另一个表中,可以提高速度,另外,建议你把ntext改为nvarchar(max) 类型。

select schoolname,shijian,dizhi,schoolid from school where schooltype=5 order by schoolid desc  就只查询了schoolname,shijian,dizhi,schoolid 这几个字段,其他的字段没有查询啊,难道其他的几个ntext字段会影响这次select 查询吗? 

#7


引用 5 楼 caineng 的回复:
select schoolname,shijian,dizhi,schoolid from school where schooltype=5 order by schoolid desc  就只查询了schoolname,shijian,dizhi,schoolid 这几个字段,其他的字段没有查询啊,难道其他的几个ntext字段会影响这次select 查询吗?


对的,虽然你不需要查询ntext字段的值,但是实际上sql server在查询的时候,会把整个表的数据都查出来的,然后把这些数据加载到内存,然后取出那几个字段,而其他不需要查询的字段的值,就不需要了,虽然这些数据也加载到了内存中,所以这样效率必然会有所下降

#8


具体需看ntext字段的内容数据量如何?
 如果很大,可以考虑分表存储,有利于提高查询效率.
 如果不大,则应考虑修改数据类型,如nvarchar.并添加索引以提高查询速度.

#9


引用 4 楼 yupeigu 的回复:
2、这个由于是like '%xxx%'所以没办法建立索引,建议用全文检索技术,提高速度


对schoolname这个字段建立全文索引后,还是用这个sql查询写法吗?例如:select  schoolname,shijian,dizhi,schoolid  from school where schoolname like '%湖北中学%' 

#10


引用 9 楼 caineng 的回复:
Quote: 引用 4 楼 yupeigu 的回复:



2、这个由于是like '%xxx%'所以没办法建立索引,建议用全文检索技术,提高速度


对schoolname这个字段建立全文索引后,还是用这个sql查询写法吗?例如:select  schoolname,shijian,dizhi,schoolid  from school where schoolname like '%湖北中学%' 



得改成这样:

schoolname,shijian,dizhi,schoolid  from school
WHERE FREETEXT ( schoolname,        --带全文索引的列名    
                '湖北中学');        --要搜索的文本

#1


打开执行计划看看,没有索引就加个索引!

#2


schoolname如果唯一的话,就设置成主键;否则,设置一个非聚簇索引

#3


我有2个问题呢,第一个呢?

#4




1、可以把表拆分一下,通过把那些ntext的字段,放到另一个表中,可以提高速度,另外,建议你把ntext改为nvarchar(max) 类型。

2、这个由于是like '%xxx%'所以没办法建立索引,建议用全文检索技术,提高速度

#5


select schoolname,shijian,dizhi,schoolid from school where schooltype=5 order by schoolid desc  就只查询了schoolname,shijian,dizhi,schoolid 这几个字段,其他的字段没有查询啊,难道其他的几个ntext字段会影响这次select 查询吗?

#6


Quote: 引用 4 楼 yupeigu 的回复:



1、可以把表拆分一下,通过把那些ntext的字段,放到另一个表中,可以提高速度,另外,建议你把ntext改为nvarchar(max) 类型。

select schoolname,shijian,dizhi,schoolid from school where schooltype=5 order by schoolid desc  就只查询了schoolname,shijian,dizhi,schoolid 这几个字段,其他的字段没有查询啊,难道其他的几个ntext字段会影响这次select 查询吗? 

#7


引用 5 楼 caineng 的回复:
select schoolname,shijian,dizhi,schoolid from school where schooltype=5 order by schoolid desc  就只查询了schoolname,shijian,dizhi,schoolid 这几个字段,其他的字段没有查询啊,难道其他的几个ntext字段会影响这次select 查询吗?


对的,虽然你不需要查询ntext字段的值,但是实际上sql server在查询的时候,会把整个表的数据都查出来的,然后把这些数据加载到内存,然后取出那几个字段,而其他不需要查询的字段的值,就不需要了,虽然这些数据也加载到了内存中,所以这样效率必然会有所下降

#8


具体需看ntext字段的内容数据量如何?
 如果很大,可以考虑分表存储,有利于提高查询效率.
 如果不大,则应考虑修改数据类型,如nvarchar.并添加索引以提高查询速度.

#9


引用 4 楼 yupeigu 的回复:
2、这个由于是like '%xxx%'所以没办法建立索引,建议用全文检索技术,提高速度


对schoolname这个字段建立全文索引后,还是用这个sql查询写法吗?例如:select  schoolname,shijian,dizhi,schoolid  from school where schoolname like '%湖北中学%' 

#10


引用 9 楼 caineng 的回复:
Quote: 引用 4 楼 yupeigu 的回复:



2、这个由于是like '%xxx%'所以没办法建立索引,建议用全文检索技术,提高速度


对schoolname这个字段建立全文索引后,还是用这个sql查询写法吗?例如:select  schoolname,shijian,dizhi,schoolid  from school where schoolname like '%湖北中学%' 



得改成这样:

schoolname,shijian,dizhi,schoolid  from school
WHERE FREETEXT ( schoolname,        --带全文索引的列名    
                '湖北中学');        --要搜索的文本