一、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调优相关推荐

  1. Java程序员涨薪必备的性能调优知识点,收好了!

    Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢.接口超时,服务器负载高.并发数低,数据库频繁死锁等.尤其是在"糙快猛"的互联网开发模式大行其道的今天,随着系 ...

  2. 程序员精进之路:性能调优利器--火焰图

    作者:厉辉,腾讯 CSIG 后台开发工程师 本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解. 让我们回想一 ...

  3. 参数调优为什么要采样_程序员精进之路:性能调优利器--火焰图

    本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解. 让我们回想一下,曾经作为编程新手的我们是如何调优程序的? ...

  4. Java程序员必须了解的JVM性能调优知识,全都在这里了

    来自:IT大咖说 1.Java 中是值传递还是引用传递? 传引用的错觉是如何造成的呢?在运行栈中,基本类型和引用的处理是一样的,都是传值,所以,如果是传引用的方法调用,也同时可以理解为"传引 ...

  5. 好程序员Java分享MySQL之SQL入门(一)

    好程序员Java分享MySQL之SQL入门(一)前言:各种版本的数据库中,有一种通用的语言用于管理数据库中的数据,它就是SQL,本章我们将学习基本的SQL语句. SQL的概述 Structured Q ...

  6. 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. ...

  7. 程序员的mysql金典pdf_程序员的SQL金典

    第一本专门为程序员编写的数据库图书 <程序员的SQL金典> l 将子查询.表连接.数据库语法差异等用通俗易懂.诙谐幽默的语言讲解出来 l 配合大量真实案例,学了就能用,在短时间内成为数据库 ...

  8. 程序员的mysql金典pdf_《程序员sql金典》pdf(完整)

    [实例简介] [实例截图] [核心代码] 第 1 章 数据库入门 1 1.1 数据库概述 1 1.1.1 数据库与数据库管理系统 1 1.1.2 数据库能做什么 2 1.1.3 主流数据库管理系统介绍 ...

  9. 公司招聘软件研发程序员的一道考题--MS SQL Server数据库数据文件页面头部结构...

    有一次在招聘C++程序员时,出的一道考题,内容其实就是MS SQL Server数据库数据文件页面头部结构,如下: 有个file.a文件,这个文件以16sec[sec是扇区,每个sec包含512个By ...

  10. 读程序员技术练级攻略有感

    原文如下,感想在后面,文中指的博客是我csdn上的博客: ----------------------------------------------------------------------- ...

最新文章

  1. oracle 11g数据库以管理员身份登录不上
  2. 【CF671D】 Roads in Yusland(对偶问题,左偏树)
  3. linux用unzip解压.zip文件失败解决方案
  4. Apache Beam是什么?
  5. 使用simple transformation查找xml file内某个节点的attribute是否存在指定value
  6. C#中Monitor和Lock的用法区别
  7. 领域驱动设计的简略设计步骤
  8. POJ 1639 Picnic Planning:最小度限制生成树
  9. python三层设计_推荐3个Python实现算法和设计模式的工具
  10. Raspberry Pi 的新用法:检测家中的漏水情况
  11. [原创]MYSQL周期备份shell脚本
  12. Unity图片优化-Dither算法(RGBA16优化)
  13. 黑马程序员传智播客 python 迭代器学习笔记
  14. 个人微信公众号做外卖优惠券怎么弄?
  15. 谷歌自动广告导致网站样式出错 影响布局
  16. table——caption
  17. 【Ubuntu】普通用户修改了/etc/sudoers文件权限导致的问题
  18. 计算机c盘空间被虚拟占满,C盘空间总是莫名其妙的满了,又不想重装系统,5招教你如何瘦身...
  19. 智能扭矩系统——SunTorque智能扭矩系统,引领拧紧工艺新变革!
  20. 解决docker启动错误 error creating overlay mount to /var/lib/docker/overlay2

热门文章

  1. (0036) iOS 开发之HTTPS、SSL验证
  2. 一种可以穿透还原卡和还原软件的代码
  3. AcWing P164 可达性统计 题解
  4. 同步和异步的区别和联系以及一般在什么情况下使用它们
  5. MySQL免安装版,遇到MSVCR120.dll文件丢失错误的解决方案
  6. [Codeforces50C]Happy Farm 5 凸包
  7. onethink的熟悉
  8. 百度js库tangram开源
  9. C#仿QQ皮肤-主窗体MainForm和Main的实现
  10. 在一个有返回值的方法中,用block回传的解决方法