SQL优化(一)

3/7/2017来源:SQL技巧人气:970

大表的select操作 1、首先建立索引,考虑实际用途最好建立组合索引 当任何单个查询要检索的行少于或者等于整个表行数的10%时,索引就非常有用。 当业务需要检索表中数据超过25%,索引意义不大 普通索引 create index idx_t_normalid on t(object_id) 唯一索引(索引列非空则唯一,比普通索引占用空间小一点) create unique index idx_t_uniid on t(object_id) 复合索引(查询时按索引的顺序加入条件object_id,object_name或object_id) create index idx_t_normalid on t(object_id,object_name); 2、使用中间表 如人员明细表,可建立地域、时间人员数量表作为中间表以查询人数 注意:对明细表进行更改是也要对中间表相应字段进行更改 3、水平拆表 如果表中的数据呈现出某一类特性,比如呈现时间特性,那么可以根据时间段将表拆分成多个。 4、垂直拆表 将表按字段拆分成多个表,常用的字段放在一个表,不常用的字段或大字段放在另外一个表 5、索引优化 (1)索引不存储为NULL的列 (2)避免通配符(%)在搜寻词首出现,如必须可使用  reverse函数 (3)避免对索引列进行类型转换 (4)避免对索引列进行函数运算,如必须可建立函数索引

(5)避免索引列使用 <>,!=,NOT IN,NOT EXISTS,可使用< OR > 来避免

(6)频繁进行删除操作的被索引的表,应当阶段性地重建索引,以避免在索引中造成空间碎片,影响性能.在许可的条件下,也可以阶段性地truncate表,truncate命令删除表中所有记录,也删除索引碎片.

6、sql优化

尽量使用 JOIN 进行表的连接,永远不要在 FROM 后面使用逗号连接表

order by 非索引字段或者有计算表达式都将降低查询速度

避免使用HAVING子句,可用where代替

EXISTS替代IN、用NOT EXISTS替代NOT IN

sql语句用大写的;因为Oracle总是先解析sql语句,把小写的字母转换成大写的再执行

不要使用游标 !!

7、优化GROUP BY

将不需要的记录在GROUP BY 之前过滤掉

8、 用内存缓存数据,以空间换时间、 将常用而且不常修改的数据加载到内存中,直接从内存查询则可。