Oracles数据库中有100万条数据,带条件查询,如何优化sql语句?

2025-03-14 14:53:43
推荐回答(4个)
回答1:

这个简单的查询来说,SQL语句是没有办法优化的。

你真的要优化,还真的只有对物理表进行操作:

1:性别使用位字段,反正也有三态(null:未填或不可识别,1:男,0:女),也基本满足了需求,如果你一定要考虑到人妖之类的,那就定义为字节类型,性能也要高。如果定义字节类型最好索引。千万别定义为字符类型,那可就惨了。

2:年龄字段理所当然的应该是整数类型,一般来说也就是int吧,最好是字节(毕竟年龄百岁以内,字节可以表示255岁了)。如果你把年龄定义位字符类型,那就该哭就哭吧。此外,年龄一定要索引。

你要求不考虑索引,只优化SQL,那么,没门!除非你人为的把这个查询语句复杂化了。假如你一定要这样,可以把要查询的字段在select后一个一个的写出来。这样一来可以忽略不必要的字段,二来在指明字段的情况下查询效率比使用通配符要高。

此外,我没用过oracle,between效率如何不知道,想来应该比同时使用大于等于和小于等于要好,你可以比较下它们之间的性能,如果between对性能影响大,则可以考虑放弃。另外,between是否同时包含23和28?这个你也要斟酌下。至于条件编写的顺序,我想应该是有影响的,只是我也没有研究过,从我们人为的思维理解,应该是有,所以写条件的时候,把易识别易判断的放前面,如:

select * from 表名 where 性别=1 and 年龄 between 23 and 28

回答2:

1、如果数据库允许,可以适当加几个并行,2个以上都行,但最好不要超过4个,否则如果并行不足的话,会一直等待;
2、 >=、<=的效率比between高,可以用前者,另外>=、<=也比>、<的效率高,尽量使用带“=”号的。可以试试下边的语句:假设男性用'M'来表示,则
select /*+parallel(t,4)*/
*
from 表名 t
where 性别 = 'M' -- 男性
and 年龄 >= 23
and 年龄 <= 28;

回答3:

select * from [tablename] where age between 23 and 28 and gender=male
年龄字段如果不带索引,要走全表扫描的,性别字段只是离散的几个数据,带索引没意义

回答4:

SI OB这个数据库管理软件可能会对你有用,最近研究了几次,感觉功能强大