职业 & 观点4 分钟阅读
ChatGPT 4o 优化 SQL 可靠吗?
@TOC目录 如果大家对如何使用 ChatGPT 来运维数据库和编写 Shell 代码感兴趣的话,后续我会继续更新这方面的内容! PS: 如果想免费体验 ChatGPT 4o,可以扫码进群,我会在每个工作日免费发放 Plus 会员的体验授权码。社群中还有准备好的 GPT 保姆级教程,进群后记得查看群公告噢!
2024年10月28日阅读—点赞—收藏—
database
在知识库中专注阅读,并随时返回相关工具与课程
@TOC目录 如果大家对如何使用 ChatGPT 来运维数据库和编写 Shell 代码感兴趣的话,后续我会继续更新这方面的内容! PS: 如果想免费体验 ChatGPT 4o,可以扫码进群,我会在每个工作日免费发放 Plus 会员的体验授权码。社群中还有准备好的 GPT 保姆级教程,进群后记得查看群公告噢!
如果大家对如何使用 ChatGPT 来运维数据库和编写 Shell 代码感兴趣的话,后续我会继续更新这方面的内容!
PS: 如果想免费体验 ChatGPT 4o,可以扫码进群,我会在每个工作日免费发放 Plus 会员的体验授权码。社群中还有准备好的 GPT 保姆级教程,进群后记得查看群公告噢!
群里会通知最新的活动情况和使用教程等信息。
本章目标:掌握本章核心知识点 前置要求:完成前序章节学习 预计时长:60 分钟
前天写的一篇 听说 ChatGPT 4o 可以取代初级 DBA? 在群里引起了广泛讨论,很多朋友觉得在基础运维方面,ChatGPT 4o > 初级 DBA,但是在 SQL 优化领域,ChatGPT 4o < 初级 DBA,事实真是如此吗?
于是,我提问 ChatGPT 4o 测试了一下!
针对一个慢查询 SQL,在 Oracle 数据库中,一般有哪些优化的方法?
在 Oracle 数据库中,针对慢查询的优化通常可以从以下几个方面入手:
1、分析执行计划
EXPLAIN PLAN 或者 DBMS_XPLAN.DISPLAY 查看 SQL 语句的执行计划,了解每个步骤的耗时、数据访问方法(如全表扫描、索引扫描等)及其成本。2、创建和优化索引
3、使用分区表
4、调整统计信息
DBMS_STATS.GATHER_TABLE_STATS 和 DBMS_STATS.GATHER_INDEX_STATS 定期收集表和索引的最新统计信息,确保优化器基于最新的数据做出最优决策。5、避免不必要的排序操作
ORDER BY 和 GROUP BY 的使用。6、优化联接和子查询
IN,可以用 EXISTS 或 JOIN 替代以提高性能。7、使用绑定变量
8、使用 Hints
USE_NL(使用嵌套循环)、INDEX(使用索引)等。9、减少网络开销
ROWNUM、分页查询等)。10、分解复杂查询
通过以上方法,可以显著优化慢查询的性能。在具体场景中,可以结合实际需求、数据量以及硬件配置来选择最适合的优化方法。
通过以上回复,我们可以发现 ChatGPT 4o 提供了很多的优化方法:
等等一系列常规优化方法,回答还算是中规中矩。
那如果提供一个慢查询 SQL,是否可以帮忙给出合理的优化方案呢?
在开发过程中,很多人都喜欢用 distinct,in/not in,like/not like,is null/is not null 这些语法,但在性能和效率方面可能存在一些问题。在大数据量环境下,滥用这些操作符可能会导致性能下降。
针对以上情况,这里选几个经典的慢 SQL 案例:
1-- 使用 NOT IN,可能有 NULL 问题2SELECT * FROM orders WHERE customer_id NOT IN (SELECT customer_id FROM vip_customers);34-- 使用 IS NULL,可能无法利用索引5SELECT * FROM employees WHERE manager_id IS NULL;67-- 非前缀匹配,无法利用索引8SELECT * FROM employees WHERE last_name LIKE '%Smith';ChatGPT 4o 给出的优化方式:
1-- 替代为 NOT EXISTS,性能和准确性更高2SELECT * FROM orders o WHERE NOT EXISTS (SELECT 1 FROM vip_customers v WHERE v.customer_id = o.customer_id);34-- 使用函数索引后的查询5CREATE INDEX idx_col_is_null ON table_name (NVL(column, 'NO_NULL'));6SELECT * FROM employees WHERE NVL(manager_id, -1) = -1;78-- 前缀匹配,可以使用索引9SELECT * FROM employees WHERE last_name LIKE 'Smith%';对于 GPT 给出的回复,大家觉得优化的如何?
这里我使用的是 Plus 版本的 GPT 探索功能:

可以发现有很多关于 SQL 优化的 GPT 可供使用。