读《程序员的SQL金典》[4]--SQL调优
一、SQL注入
如果程序中采用sql拼接的方式书写代码,那么很可能存在SQL注入漏洞。避免的方式有两种:
1. 对于用户输入过滤敏感字母;
2. 参数化SQL(推荐)。
二、索引
①索引分类
- 聚簇索引:数据表的物理顺序和索引顺序相同。每个表只能建立一个聚簇索引,应该在表中经常访问的列或者按顺序访问的列建立聚簇索引。
- 非聚簇索引:数据表的物理顺序和索引顺序不同。每个表可以建立多个非聚簇索引。
②碎片整理
在删除一条数据项记录时,并不会删除对应的索引项。所以经过一段时间后数据库中会出现索引碎片,降低效率。进行随便整理的办法可以进行索引重建。
例如:
ALTER TABLE [dbo]. [test] DROP CONSTRAINT [DF__bAuto__47A6A41B] GOALTER TABLE [dbo]. [test] ADD CONSTRAINT [DF__bAuto__47A6A41B] DEFAULT ((0)) FOR [name] GO
③全表扫描和索引查找
全表扫描:就是在整个数据表中逐条检索每条记录,当数据量大的时候,性能低下。
索引查找:就是当表中创建了索引并且查询语句符合索引条件时,只对索引进行检索,而不必对每条记录进行筛选,性能大大提高。
三、SQL调优方案十二条
在调优的时候不要追求完美,先用工具追踪到最占资源的SQL进行优化,往往能起到事半功倍的效果。
常用优化方式:
1.创建必要的索引
在经常检索的字段创建索引,能起到非常大的优化效果。
2.避免在索引列上进行计算
如果在索引列上进行计算或者使用函数,那么DBMS优化器将不会使用索引而是使用全表扫描。
SELECT *FROM T_Employee WHERE FSalary * 12 >25000; ==> SELECT *FROM T_Employee WHERE FSalary >25000/12;
3.参数化SQL
如果SQL是根据用户输入动态生成的,那么可以将用户输入进行参数处理。这样不仅能够避免SQL注入漏洞,而且能提高性能。因为DBMS在第一次执行的时候会进行查询优化和预编译,再次执行的时候可以直接使用预编译结果,从而提高执行效率。
4.调整where子句连接顺序
where子句中尽量把子查询放在其他筛选条件之前,可以提高效率。
例如:
SELECT * FROM T_Person WHERE 25 < (SELECT COUNT(*) FROM T_Manager WHERE FManagerId=2) AND FSalary > 50000 AND FPosition= ‘MANAGER’ ;
5.避免使用*
在SELECT语句中写明需要查询的列名。即使要查询所有列,也不要偷懒使用*查询,因为这样在DBMS执行的过程中仍然要解析出所有列名,浪费性能。
6.列出表名
在使用多表连接查询时,尽量在字段前带上表名前缀,这样既容易理解又能减少查询过程中的解析时间。
7.用WHERE 子句替换HAVING子句
HAVING子句会在查询出所有结果后才对结果进行过滤,一般用于对聚合函数运算的过滤,其它情况进行条件筛选尽量使用WHERE子句。
8. 用EXISTS替换IN
第二种写法要好于第一种写法。
SELECT * FROM T_Employee WHERE FNumber> 0 AND FDEPTNO IN (SELECT FNumber FROM T_Department WHERE FMangerName = 'Tome') ==> SELECT * FROM T_Employee WHERE FNumber > 0 AND EXISTS (SELECT 1 FROM T_Department WHERE T_Department. FDEPTNO = EMP.FNumber AND FMangerName = ‘MELB’)
9.用表连接替换EXISTS
一般来说表连接的效率要优于EXISTS。
例如:
SELECT FName FROM T_Employee WHERE EXISTS ( SELECT 1 FROM T_Department WHERE T_Employee.FDepartNo= FNumber AND FKind='A' ); ==> SELECT FName FROM T_Department, T_Employee WHERE T_Employee. FDepartNo = T_Departmen. FNumber AND FKind = ‘A’ ;
10.用UNION ALL替换UNION
如果进行合并的两个表肯定不会重复记录,那么使用UNION ALL会效率高些。因为UNION方法会一直尝试进行合并。
SELECT ACCT_NUM, BALANCE_AMTFROM DEBIT_TRANSACTIONS1WHERE TRAN_DATE = '20010101'UNIONSELECT ACCT_NUM, BALANCE_AMTFROM DEBIT_TRANSACTIONS2WHERE TRAN_DATE ='20010102' ==>SELECT ACCT_NUM, BALANCE_AMTFROM DEBIT_TRANSACTIONS1WHERE TRAN_DATE ='20010101'UNION ALLSELECT ACCT_NUM, BALANCE_AMTFROM DEBIT_TRANSACTIONS2WHERE TRAN_DATE = '20010102'
11.避免隐式类型转换
例如FAge字段类型为字符串,但是一般数据库中的数值类型优先级比字符串类型高,因此会进行隐式类型转换。
SELECT FId,FAge,FName FROM T_Person WHERE FAge=10 相当于 SELECT FId,FAge,FName FROM T_Person WHERE TO_INT(FAge)=10 ==> SELECT FId,FAge,FName FROM T_Person WHERE FAge='10'
12.防止检索范围过宽
如果DBMS优化器认为检索范围过宽,则会使用全表扫描而放弃索引查询。
以下几种情况容易被认为检索范围过宽:
- 使用IS NOT NULL;
- 使用不等于判断;
- 使用LIKE匹配字符串时,使用'a%'可以用到索引,但是使用'%b'或者'a%b'则会使用全表扫描。
读《程序员的SQL金典》[4]--SQL调优相关推荐
- Java程序员涨薪必备的性能调优知识点,收好了!
Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器负载高.并发数低,数据库频繁死锁等.尤其是在"糙快猛"的互联网开发模式大行其道的今天,随着系 ...
- 程序员精进之路:性能调优利器--火焰图
作者:厉辉,腾讯 CSIG 后台开发工程师 本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解. 让我们回想一 ...
- 参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图
本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解. 让我们回想一下,曾经作为编程新手的我们是如何调优程序的? ...
- Java程序员必须了解的JVM性能调优知识,全都在这里了
来自:IT大咖说 1.Java 中是值传递还是引用传递? 传引用的错觉是如何造成的呢?在运行栈中,基本类型和引用的处理是一样的,都是传值,所以,如果是传引用的方法调用,也同时可以理解为"传引 ...
- 好程序员Java分享MySQL之SQL入门(一)
好程序员Java分享MySQL之SQL入门(一)前言:各种版本的数据库中,有一种通用的语言用于管理数据库中的数据,它就是SQL,本章我们将学习基本的SQL语句. SQL的概述 Structured Q ...
- TDH sql及plsql的调优
TDH sql及plsql的调优 3.1.1 表类型的优化 3.1.2表分桶分区的优化 3.1.3 临时表的使用 3.2.1 列裁剪 3.2.2 条件下压 3.2.3 DISTINCT的优化 3.2. ...
- 程序员的mysql金典pdf_程序员的SQL金典
第一本专门为程序员编写的数据库图书 <程序员的SQL金典> l 将子查询.表连接.数据库语法差异等用通俗易懂.诙谐幽默的语言讲解出来 l 配合大量真实案例,学了就能用,在短时间内成为数据库 ...
- 程序员的mysql金典pdf_《程序员sql金典》pdf(完整)
[实例简介] [实例截图] [核心代码] 第 1 章 数据库入门 1 1.1 数据库概述 1 1.1.1 数据库与数据库管理系统 1 1.1.2 数据库能做什么 2 1.1.3 主流数据库管理系统介绍 ...
- 公司招聘软件研发程序员的一道考题--MS SQL Server数据库数据文件页面头部结构...
有一次在招聘C++程序员时,出的一道考题,内容其实就是MS SQL Server数据库数据文件页面头部结构,如下: 有个file.a文件,这个文件以16sec[sec是扇区,每个sec包含512个By ...
- 读程序员技术练级攻略有感
原文如下,感想在后面,文中指的博客是我csdn上的博客: ----------------------------------------------------------------------- ...
最新文章
- oracle 11g数据库以管理员身份登录不上
- 【CF671D】 Roads in Yusland(对偶问题,左偏树)
- linux用unzip解压.zip文件失败解决方案
- Apache Beam是什么?
- 使用simple transformation查找xml file内某个节点的attribute是否存在指定value
- C#中Monitor和Lock的用法区别
- 领域驱动设计的简略设计步骤
- POJ 1639 Picnic Planning:最小度限制生成树
- python三层设计_推荐3个Python实现算法和设计模式的工具
- Raspberry Pi 的新用法:检测家中的漏水情况
- [原创]MYSQL周期备份shell脚本
- Unity图片优化-Dither算法(RGBA16优化)
- 黑马程序员传智播客 python 迭代器学习笔记
- 个人微信公众号做外卖优惠券怎么弄?
- 谷歌自动广告导致网站样式出错 影响布局
- table——caption
- 【Ubuntu】普通用户修改了/etc/sudoers文件权限导致的问题
- 计算机c盘空间被虚拟占满,C盘空间总是莫名其妙的满了,又不想重装系统,5招教你如何瘦身...
- 智能扭矩系统——SunTorque智能扭矩系统,引领拧紧工艺新变革!
- 解决docker启动错误 error creating overlay mount to /var/lib/docker/overlay2