数据库|快速提升性能的SQL语句,建议收藏( 三 )


SELECT * FROM record WHERE amount/30 < 1000 --11秒
SELECT * FROM record WHERE convert(char(10) date 112) = '19991201' --10秒

分析:
WHERE 子句中对列的任何操作结果都是在 SQL 运行时逐列计算得到的 , 因此它不得不进行表搜索 , 而没有使用该列上面的索引 。
如果这些结果在查询编译时就能得到 , 那么就可以被 SQL 优化器优化 , 使用索引 , 避免表搜索 , 因此将 SQL 重写成下面这样:
SELECT * FROM record WHERE card_no like '5378%' -- < 1秒
SELECT * FROM record WHERE amount < 1000*30 -- < 1秒
SELECT * FROM record WHERE date = '1999/12/01' -- < 1秒

30、当有一批处理的插入或更新时 , 用批量插入或批量更新 , 绝不会一条条记录的去更新 。
31、在所有的存储过程中 , 能够用 SQL 语句的 , 我绝不会用循环去实现 。
例如:列出上个月的每一天 , 我会用 connect by 去递归查询一下 , 绝不会去用循环从上个月第一天到最后一天 。



**【需要Java面试题或者技能提升资料的小伙伴点赞+转发 , 关注我之后私信【666】或【888】后 , 即可获取】**)
32、选择最有效率的表名顺序(只在基于规则的优化器中有效):
Oracle 的解析器按照从右到左的顺序处理 FROM 子句中的表名 , FROM 子句中写在最后的表(基础表 driving table)将被最先处理 , 在 FROM 子句中包含多个表的情况下 , 你必须选择记录条数最少的表作为基础表 。
如果有 3 个以上的表连接查询 , 那就需要选择交叉表(intersection table)作为基础表 , 交叉表是指那个被其他表所引用的表 。
33、提高 GROUP BY 语句的效率 , 可以通过将不需要的记录在 GROUP BY 之前过滤掉 。 下面两个查询返回相同结果 , 但第二个明显就快了许多 。
低效:
SELECT JOB AVG(SAL)
FROM EMP
GROUP BY JOB
HAVING JOB = 'PRESIDENT'
OR JOB = 'MANAGER'

高效:
SELECT JOB AVG(SAL)
FROM EMP
WHERE JOB = 'PRESIDENT'
OR JOB = 'MANAGER'
GROUP BY JOB

34、SQL 语句用大写 , 因为 Oracle 总是先解析 SQL 语句 , 把小写的字母转换成大写的再执行 。
35、别名的使用 , 别名是大型数据库的应用技巧 , 就是表名、列名在查询中以一个字母为别名 , 查询速度要比建连接表快 1.5 倍 。
36、避免死锁 , 在你的存储过程和触发器中访问同一个表时总是以相同的顺序;事务应经可能地缩短 , 在一个事务中应尽可能减少涉及到的数据量;永远不要在事务中等待用户输入 。
37、避免使用临时表 , 除非却有需要 , 否则应尽量避免使用临时表 , 相反 , 可以使用表变量代替 。 大多数时候(99%) , 表变量驻扎在内存中 , 因此速度比临时表更快 , 临时表驻扎在 TempDb 数据库中 , 因此临时表上的操作需要跨数据库通信 , 速度自然慢 。
38、最好不要使用触发器:

  • 触发一个触发器 , 执行一个触发器事件本身就是一个耗费资源的过程;
  • 如果能够使用约束实现的 , 尽量不要使用触发器;
  • 不要为不同的触发事件(Insert、Update 和 Delete)使用相同的触发器;
  • 不要在触发器中使用事务型代码 。
39、索引创建规则: