提高数据库查询速度的几点经验

来源:互联网  作者:本站整理
摘要:1、首先深刻理解需求,灵活合理设计库表结构,这非一日之功今日暂不作讨论重点。2、库表中是否有blob与text型,这两种数据类型通过页链,存储在不同的数据页上。查询速度慢是很正常的事情。对于这两种类型的特殊部分还有很多,例如在不能有相同的记……

1、首先深刻理解需求,灵活合理设计库表结构,这非一日之功今日暂不作讨论重点。

2、库表中是否有blob与text型,这两种数据类型通过页链,存储在不同的数据页上。

查询速度慢是很正常的事情。对于这两种类型的特殊部分还有很多,例如在不能有相同的记录,更谈不上查询的速度问题。

3、库表索引的建立与使用是提高查询速度最重要的手段,正常情况下是程序在运行过程中自动使用索引,但是根据其特殊需要也可以在程序中指定索引。
select /+ using index 索引名 +/ into:变量 from 表名
索引的建立与使用当然也有很多规则,希望大家不要建垃圾索引。与索引关系很大的就是临时库了,因为索引的原理之一就是重新排序,数据库系统默认的临时库(一般为2M)太少,会出错误提示的。另一个是在标中使用索引是会出问题的。
说的非常好,但我想补充一些,我记得SQL优化索引的规则中,还有一条是:多表关联查询时,记录少的表放在最前面(包括放在=左边)。
不知说的对不对,请大家指教。。。

4、数据库使用内存的分配,高速缓存的使用也是很重要的,我使用的数据库为Sybase,配置方法为sp_configure

5、SQL语句的写法不同,查询的速度影响也很大。(第三种查询方式最快,但还不是最快的。)

表titles中的记录多于表titleauthor
SELECT title_id, title FROM titles, titleauthor
WHERE title.title_id = titleauthor.title_id
AND titleauthor.title_id = 'T81002'

SELECT title_id, title FROM titles, titleauthor
WHERE title.title_id = titleauthor.title_id
AND title.title_id = 'T81002'

SELECT title_id, title FROM titles, titleauthor
WHERE title.title_id = titleauthor.title_id
AND title.title_id = 'T81002'
AND titleauthor.title_id = 'T81002'

6、灵活使用数据共享,会产生意想不到的效果。

80万条数据,20秒内查询搞定是很正常的事情。

聚簇索引是一种对磁盘上实际数据重新组织以按指定的一个或多个列的值排序。由于聚簇索引的索引页面指针指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页,所以要将临时库扩容。

在聚簇索引下,数据在物理上按顺序排在数据页上,重复值也排在一起,因而在那些包含范围检查(between、、>=)或使用group by或order by的查询时,一旦找到具有范围中第一个键值的行,具有后续索引值的行保证物理上毗连在一起而不必进一步搜索,避免了大范围扫描,可以大大提高查询速度。

在一个频繁发生插入操作的表上建立聚簇索引时,不要建在具有单调上升值的列(如IDENTITY)上,否则会经常引起封锁冲突。

在聚簇索引中不要包含经常修改的列,因为码值修改后,数据行必须移动到新的位置。

只有两个或三个值的列,如男性和女性(是或否),从不会从索引中得到好处。
鉴于索引加快了查询速度,但减慢了数据更新速度的特点。可通过在一个段上建表,而在另一个段上建其非聚簇索引,而这两段分别在单独的物理设备上来改善操作性能。

因为大量的索引在插入、修改和删除操作时比没有索引花费更多的系统时间

选择聚簇索引应基于where子句和连接操作的类型。聚簇索引的侯选列是:

● 主键列,该列在where子句中使用并且插入是随机的。

● 按范围存取的列,如pri_order > 100 and pri_order < 200 。

● 在group by或order by中使用的列。

● 不经常修改的列。

● 在连接操作中使用的列。

【相关文章】好搜一下
成功网络广告设计的8项原则

成功网络广告设计的8项原则

现在乃至将来都是一个过剩的消费时代。在一个相对富裕的社会里,消费者的消费目的,不…