提升SQL性能:35个实战技巧详解

1 下载量 3 浏览量 更新于2024-09-03 收藏 111KB PDF 举报
在编写高性能SQL语句时,以下几个关键点需要特别关注,以确保你的查询能有效地利用服务器资源并提升页面加载速度: 1. 整合简单、无关联的数据库访问:当你需要执行多个独立的查询时,尽量合并它们为一个查询,尽管它们之间可能没有直接的关系,这样做可以减少网络请求和服务器解析的开销。 2. 删除重复记录:使用高效的方法,如示例中的ROWID来删除重复记录,这样可以避免额外的存储和查询开销。通过ROWID而非标准的DELETE操作来删除,以减少回滚段的使用,提高删除速度。 3. 用TRUNCATE替代DELETE:在删除大量数据时,使用TRUNCATE命令可以节省资源和时间,因为它不涉及事务管理和回滚,但仅适用于全表删除,并且TRUNCATE是DDL操作,而非DML。 4. 表名顺序策略:在FROM子句中,将基础表(数据量最少或被其他表引用的交叉表)放在最后,这样能优先处理,有助于优化查询性能。对于多表连接查询,应考虑连接顺序,以最大化过滤效果。 5. WHERE子句连接顺序:遵循自下而上的解析原则,确保关联条件在前,能够快速排除无效记录的条件放在最后,减少不必要的计算。 6. 避免SELECT *:在SELECT子句中,尽量明确指定所需列,避免使用通配符'*',因为这会导致Oracle查询数据字典以获取列信息,消耗额外资源。 7. 减少数据库访问次数:减少不必要的数据库查询,因为每个查询都会引发一系列内部操作,包括解析、索引评估和数据读取,过多的查询会拖慢响应时间。 8. 调整SQL*Plus、SQL*Forms和Pro*C的ARRAYSIZE参数:增大数组大小可以帮助批量处理数据,减少I/O次数,进一步优化性能。 9. 利用索引:合理设计和使用索引可以大大提高查询速度,尤其是在大规模数据集上。但是,过度的索引会占用额外空间并降低插入/更新速度。 10. 优化查询计划:理解Oracle的优化器如何工作,监控执行计划,适时调整SQL语句以获得更好的执行路径。 通过遵循以上建议,你可以显著提高SQL语句的执行效率,从而改善整个系统的性能。记住,优化SQL不仅仅是技术问题,还涉及到对业务需求的理解和数据库结构的设计。
2023-07-17 上传

1.以下sql,使用了subplan+broadcast, 请根据语义合理优化该sql, 使其运行效率更高效 select * from user01.tb1 t1 where exists (select max(id) from user01.tb2 t2 where t1.name=t2.name); 2.以下SQL, t1表使用了broadcast算子,请使用 hint 优化,避免t1表使用 broadcast select t1,id,t2.id2 from user01.tb1 t1 inner join user01.t_skew t2 on t1.id=t2.id2 and t1.name='beijing' order by 1; 3.如何判断下列语句是否下推,请写出判断方法: select count(t1.*) from user01.tb1 t1 left join user01.tb2 t2 on t1.id=t2.td and t2.name ='beijing' 4.下列语句的执行计划中,优化器选择表他作为hash内表,t2作为hash外表,请使用hint调整执行计划,使t2做hash内表 select t1.id,t2.id2 from user01.tb1 t1 inner join user01.t_skew t2 on t1.id=t2.id2 and t1.name ='beijing' order by 1 5.将schema权限赋予用户user1 将schema s2下所有表的访问权限赋予用户user1 6.gsql开创建数据库usdb,指定字符集utf-8,限制连接数20启时间检查命令 7.创建名为us01的用户,并将sysadmin权限授权给他 8.创建数据库usdb,指定字符集utf-8,限制连接数20 9.下面的语句的执行计划中州优化器选择了nestloop的关联方式,请根据语义修改语句,其实关联方式变为hashion,以提升查询性能 select * from user01.tb1 t1 where t1.id not in(select t2.id from user01.tb2 t2 where t2.name='shanghai'); 改写参考: select * from user01.tb1 t1 where not exists (select 1 from user01.tb2 t2 where t2.name='shanghai' and t1.id=t2.id) and t1.id is not null; 10.1、下面的执行计划存在性能问题,已知该集群有10个dn,且 select reltuples from pg class Where relname='t1'; 结果为123456798765,请根据执行计划分析,判断性能瓶颈,并给出优化建议: id | operation | E-rows | E-memory | E-width | E-costs ----+-------------------------------+-----------+---------------+-----------|---------- 1 |->Streaming (type: GATHER) | 100 | | 12 | 114.24 2 | ->Hash Join(3,4) | 100 | 1MB | 12 | 111.05 3 | ->Seq Scan on t2 | 100000 | 1MB | 4 | 91.50 4 | ->Hash | 96 | 16MB | 8 | 3.56 5 | ->Streaming(type: BROADCAST) |100| 2MB | 8 | 3.56 6 | ->Seg Scan on t1 | 100 | 1MB | 8 | 3.06

2023-07-24 上传