【持续更新】上周说的云原生属实是仰望星空了,但同时还得要脚踏实地啊。这周写一段 SQL 的时候发现能力还是有待提高,新年 Flag 再立一个,巩固 SQL 编写技能。
SQL 优化
SELECT 子句中避免使用 *。数据量大的时候选择所有列会导致查询速度变慢,另外在多表连接查询时也会造成更大的开销。
WHERE 子句中比较符号左侧避免出现表达式和函数操作,会导致数据库引擎放弃使用索引进行全表扫描。
WHERE 子句中避免使用 OR 操作符,会导致数据库引擎放弃使用索引进行全表扫描,可以考虑使用 UNION 代替。
WHERE 子句中避免使用 != 和 <> 操作符,会导致数据库引擎放弃使用索引进行全表扫描。
WHERE 子句中避免使用 IN 和 NOT IN 操作符,会导致数据库引擎放弃使用索引进行全表扫描,连续的值可以用 BETWEEN AND 代替,其他情况可以考虑使用 EXISTS 代替。
WHERE 子句中避免使用 LIKE 操作符,会导致数据库引擎放弃使用索引进行全表扫描,可以考虑全文检索。
WHERE 子句中避免使用参数,会导致数据库引擎放弃使用索引进行全表扫描。因为 SQL 只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时,它必须在编译时进行选择,然而如果在编译时建立访问计划,变量的值还是未知的,无法作为索引选择的输入项。可以考虑强制使用索引查询。
WHERE 子句中避免对字段进行 NULL 值判断,会导致数据库引擎放弃使用索引进行全表扫描,可以在 NULL 值的列上设置默认值。
尽量使用数字型字段,因为数据库引擎在处理查询和连接时会逐个比较字符串中每个字符,而对于数字型而言只需要比较一次就够了。
避免查询全表数据
根据实际需求,限制数据返回的行数,尽量避免向客户端返回大量数据。
锁和阻塞
查询目前锁对象信息
SELECT SID, SERIAL#, USERNAME, SCHEMANAME, OSUSER, MACHINE, TERMINAL, PROGRAM, OWNER, OBJECT_NAME, OBJECT_TYPE, O.OBJECT_ID FROM DBA_OBJECTS O, V$LOCKED_OBJECT L, V$SESSION S WHERE O.OBJECT_ID = L.OBJECT_ID AND S.SID = L.SESSION_ID;
Oracle kill session
alter system kill session '&sid,&serial#';
表/分区/索引
尽量避免全表扫描,首先应考虑在 WHERE 子句及 ORDER BY 涉及的列上建立索引。
在使用索引字段作为条件时,如果该索引是复合索引,那么必须用到该索引中的第一个字段作为条件时才能保证系统使用该索引,并且应尽可能地让字段顺序与索引顺序一致。
存储过程
理解代码
干什么的
用到了什么
哪里用到了
分析代码
按照业务逻辑,事务控制等对代码进行分块。
分拆
聚合
改写代码
分好块的代码再进行 SQL 优化。
管理代码
SQL(结构化查询语言)
SQL 是一种编程语言,也是一个标准,不同的数据库服务器在 SQL 的基础上进行不同的调整和扩展,不同数据库的 SQL 语法也会做相应的调整。
This Week:2 hrs 6 mins
Languages:
XML:41 mins
Java:32 mins
protobuf:26 mins
Protocol Buffer:25 mins
Projects:
c5-live:2 hrs 6 mins