大sql如果不能加索引,还能怎么优化
当前问题:
要执行简单查询sql 【select 字段1,字段2,……,字段40 from 表 where条件 group by 字段1,字段2,……,字段40】,但对应表里数据量大,且查询字段和group by字段是由动态配置的,于是这里不方便加索引,普通查询耗时2个小时以上。
解决方案:
这里便用hint的并行解决,新的sql【select /*+parallel(8) */ 字段1,字段2,……,字段40 from 表 where条件 group by 字段1,字段2,……,字段40】,减少了查询时间,用资源换时间。
以下来自于网络总结:
用hint提高并行度,并行(parallel)处理。
使用方式 select /*+parallel(4) */ 字段 from 表(其中4是并行数,可以适当增加或减小)
数据库并行处理是指客户端一条SQL的请求,数据库内部自动分解成多个进程并行处理。
并行的优点:
使用多进程处理,充分利用数据库主机资源(CPU,IO),提高性能。
并行的缺点:
1、单个会话占用大量资源,影响其它会话,所以只适合在主机负载低时期使用;
2、只能采用直接IO访问,不能利用缓存数据,所以执行前会触发将脏缓存数据写入磁盘操作。
注:
1、并行处理在OLTP类系统中慎用,使用不当会导致一个会话把主机资源全部占用,而正常事务得不到及时响应,所以一般只是用于数据仓库平台。
2、一般对于千万级记录以下的小表采用并行访问性能并不能提高,反而可能会让性能更差。
· 并行度的选择:并行度一般使用2的幂,如2、4、8、16等。通常情况下,不建议将并行度设置得太高,最多不要超过32。特殊情况下,如果需要非常高的响应速度,可以适度提高并行度,但需要注意控制并发数量,以免耗尽并行资源。
hint说明:
hint是一种基于代价的优化器,在绝大多数情况下会选择正确的优化器,减轻DBA的负担。但是有时候会选择效率很差的执行计划,使某个语句变得很慢,此时就需要DBA认为干预,告诉优化器使用指定的存取路径或者连接类型生成执行计划&#