首页 理论教育 SQL语句常见问题解析

SQL语句常见问题解析

时间:2023-11-03 理论教育 版权反馈
【摘要】:下面就某些SQL语句的编写中需要注意的问题作一个基本的介绍。如在下面的查询中索引得到了使用:3.order by语句性能低下问题order by语句决定了数据库如何将返回的查询结果排序。

SQL语句常见问题解析

下面就某些SQL语句的编写中需要注意的问题作一个基本的介绍。在这些语句中,即使某些列存在索引,但是由于编写了不科学的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。

1.IS NULL与IS NOT NULL导致索引失效问题

不能用NULL作索引,任何包含NULL值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有NULL,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。

任何在where子句中使用IS NULL或IS NOT NULL的语句优化器是不允许使用索引的。

2.带通配符(%)的like语句全表扫描问题

假定有一个职工表(employee),对于一个职工的姓和名分成两列存放(first_name和last_name),目前的需求是这样的,要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句:

这里由于通配符(%)在搜寻词首出现,所以数据库系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。如在下面的查询中索引得到了使用:(www.xing528.com)

3.order by语句性能低下问题

order by语句决定了数据库如何将返回的查询结果排序。order by语句对要排序的列没有什么特别的限制。任何在order by语句的非索引项或者有计算表达式都将降低查询速度。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应避免在order by子句中使用表达式。

4.索引数量的问题

索引并不是越多越好,索引固然可以提高相应的select的效率,但同时也降低了insert及update的效率,因为insert或update有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建立的索引是否有必要。

5.临时表的问题

避免频繁地创建和删除临时表,以减少系统表资源的消耗。临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。在新建临时表时,如果一次性插入数据量很大,那么可以使用select into 代替 create table,避免造成大量log,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈