大表的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、 用内存缓存数据,以空间换时间、将常用而且不常修改的数据加载到内存中,直接从内存查询则可。