一、SQL注入

如果程序中采用sql拼接的方式书写代码,那么很可能存在SQL注入漏洞。避免的方式有两种:

1. 对于用户输入过滤敏感字母;

2. 参数化SQL(推荐)。

二、索引

①索引分类

  • 聚簇索引:数据表的物理顺序和索引顺序相同。每个表只能建立一个聚簇索引,应该在表中经常访问的列或者按顺序访问的列建立聚簇索引。
  • 非聚簇索引:数据表的物理顺序和索引顺序不同。每个表可以建立多个非聚簇索引。

②碎片整理

在删除一条数据项记录时,并不会删除对应的索引项。所以经过一段时间后数据库中会出现索引碎片,降低效率。进行随便整理的办法可以进行索引重建。

例如:

  1. ALTER TABLE [dbo]. [test] DROP CONSTRAINT [DF__bAuto__47A6A41B]
  2. GO
  3.  
  4. ALTER TABLE [dbo]. [test] ADD CONSTRAINT [DF__bAuto__47A6A41B] DEFAULT ((0)) FOR [name]
  5. GO

③全表扫描和索引查找

全表扫描:就是在整个数据表中逐条检索每条记录,当数据量大的时候,性能低下。

索引查找:就是当表中创建了索引并且查询语句符合索引条件时,只对索引进行检索,而不必对每条记录进行筛选,性能大大提高。

三、SQL调优方案十二条

在调优的时候不要追求完美,先用工具追踪到最占资源的SQL进行优化,往往能起到事半功倍的效果。

常用优化方式:

1.创建必要的索引

在经常检索的字段创建索引,能起到非常大的优化效果。

2.避免在索引列上进行计算

如果在索引列上进行计算或者使用函数,那么DBMS优化器将不会使用索引而是使用全表扫描。

  1. SELECT *FROM T_Employee
  2. WHERE FSalary * 12 >25000;
  3. ==>
  4. SELECT *FROM T_Employee
  5. WHERE FSalary >25000/12;

3.参数化SQL

如果SQL是根据用户输入动态生成的,那么可以将用户输入进行参数处理。这样不仅能够避免SQL注入漏洞,而且能提高性能。因为DBMS在第一次执行的时候会进行查询优化和预编译,再次执行的时候可以直接使用预编译结果,从而提高执行效率。

4.调整where子句连接顺序

where子句中尽量把子查询放在其他筛选条件之前,可以提高效率。

例如:

  1. SELECT *
  2. FROM T_Person
  3. WHERE
  4. 25 < (SELECT COUNT(*) FROM T_Manager
  5. WHERE FManagerId=2)
  6. AND FSalary > 50000
  7. AND FPosition= MANAGER ;

5.避免使用*

在SELECT语句中写明需要查询的列名。即使要查询所有列,也不要偷懒使用*查询,因为这样在DBMS执行的过程中仍然要解析出所有列名,浪费性能。

6.列出表名

在使用多表连接查询时,尽量在字段前带上表名前缀,这样既容易理解又能减少查询过程中的解析时间。

7.用WHERE 子句替换HAVING子句

HAVING子句会在查询出所有结果后才对结果进行过滤,一般用于对聚合函数运算的过滤,其它情况进行条件筛选尽量使用WHERE子句。

8. 用EXISTS替换IN

第二种写法要好于第一种写法。

  1. SELECT * FROM T_Employee
  2. WHERE FNumber> 0
  3. AND FDEPTNO IN (SELECT FNumber
  4. FROM T_Department
  5. WHERE FMangerName = 'Tome')
  6. ==>
  7. SELECT * FROM T_Employee
  8. WHERE FNumber > 0
  9. AND EXISTS (SELECT 1
  10. FROM T_Department
  11. WHERE T_Department. FDEPTNO = EMP.FNumber
  12. AND FMangerName = MELB’)

9.用表连接替换EXISTS

一般来说表连接的效率要优于EXISTS。

例如:

  1. SELECT FName FROM T_Employee
  2. WHERE EXISTS
  3. (
  4. SELECT 1 FROM T_Department
  5. WHERE T_Employee.FDepartNo= FNumber
  6. AND FKind='A'
  7. );
  8. ==>
  9. SELECT FName FROM T_Department, T_Employee
  10. WHERE T_Employee. FDepartNo = T_Departmen. FNumber
  11. AND FKind = A ;

10.用UNION ALL替换UNION

如果进行合并的两个表肯定不会重复记录,那么使用UNION ALL会效率高些。因为UNION方法会一直尝试进行合并。

  1. SELECT ACCT_NUM, BALANCE_AMT
  2. FROM DEBIT_TRANSACTIONS1
  3. WHERE TRAN_DATE = ''
  4. UNION
  5. SELECT ACCT_NUM, BALANCE_AMT
  6. FROM DEBIT_TRANSACTIONS2
  7. WHERE TRAN_DATE =''
  8. ==>
  9. SELECT ACCT_NUM, BALANCE_AMT
  10. FROM DEBIT_TRANSACTIONS1
  11. WHERE TRAN_DATE =''
  12. UNION ALL
  13. SELECT ACCT_NUM, BALANCE_AMT
  14. FROM DEBIT_TRANSACTIONS2
  15. WHERE TRAN_DATE = ''

11.避免隐式类型转换

例如FAge字段类型为字符串,但是一般数据库中的数值类型优先级比字符串类型高,因此会进行隐式类型转换。

  1. SELECT FId,FAge,FName
  2. FROM T_Person
  3. WHERE FAge=10
  4. 相当于
  5. SELECT FId,FAge,FName
  6. FROM T_Person
  7. WHERE TO_INT(FAge)=10
  8. ==>
  9. SELECT FId,FAge,FName
  10. FROM T_Person
  11. WHERE FAge=''

12.防止检索范围过宽

如果DBMS优化器认为检索范围过宽,则会使用全表扫描而放弃索引查询。

以下几种情况容易被认为检索范围过宽:

  • 使用IS NOT NULL;
  • 使用不等于判断;
  • 使用LIKE匹配字符串时,使用'a%'可以用到索引,但是使用'%b'或者'a%b'则会使用全表扫描。

读《程序员的SQL金典》[4]--SQL调优的更多相关文章

  1. 快速定位隐蔽的sql性能问题及调优【转载】

    在前几天,有个开发同事问我一个问题,其实也算是技术救援,他说在有个job数据处理的频率比较高,在测试环境中很难定位出在哪有问题,而且速度也还能接 受,但是在生产环境中总是会慢一些,希望我能在测试环境中 ...

  2. 小程序组件化框架 WePY 在性能调优上做出的探究

    作者:龚澄 导语 性能调优是一个亘古不变的话题,无论是在传统H5上还是小程序中.因为实现机制不同,可能导致传统H5中的某些优化方式在小程序上并不适用.因此必须另开辟蹊径找出适合小程序的调估方式. 本文 ...

  3. Java程序员可能犯的3个常见SQL错误

    概述:Java程序员不仅要具备扎实的Java编程能力,在日常的工作当中往往还要涉及到其他语言的基础知识,尤其是SQL.那么哪些常见的SQL错误是程序员们容易犯的呢?让我们一起来看看吧! 你可能看到Ja ...

  4. .Net程序员学用Oracle系列(17):数据库管理工具(SQL Plus)

    1.数据库管理工具概述 2.SQL Plus 实用命令参考 2.1.连接/断开命令 2.2.执行 SQL 语句 2.3.执行 PL/SQL 语句 2.4.文件操作命令 2.5.修改用户密码 2.6.执 ...

  5. SQL Server调优系列玩转篇(如何利用查询提示(Hint)引导语句运行)

    前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...

  6. 阿里P8架构师讲述:3—5年程序员的发展和出路在哪里?

    工作3—5年后,程序员们的成长将迈入一个全新阶段.这既是程序员们的黄金时期同时又是最迷茫的时期,因为大家必须要要思考一下今后的职业方向. 3—5年程序员的发展和出路在哪里? 是继续做技术人,还是向管理 ...

  7. 11g新特性-自动sql调优(Automatic SQL Tuning)

    11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中, ...

  8. SQL Server 调优系列玩转篇一(如何利用查询提示(Hint)引导语句运行)

    前言 前面几篇我们分析了关于SQL Server关于性能调优的一系列内容,我把它分为两个模块. 第一个模块注重基础内容的掌握,共分7篇文章完成,内容涵盖一系列基础运算算法,详细分析了如何查看执行计划. ...

  9. 【Spark深入学习 -14】Spark应用经验与程序调优

    ----本节内容------- 1.遗留问题解答 2.Spark调优初体验 2.1 利用WebUI分析程序瓶颈 2.2 设置合适的资源 2.3 调整任务的并发度 2.4 修改存储格式 3.Spark调 ...

  10. 读《程序员的SQL金典》[1]--基础数据检索

    前言 <程序员的SQL金典>这本书是杨中科老师的,拜读了一下,简单做了读书笔记供以后翻阅.仅供学习分享,要想细读的话推荐购买原版呀! 这次读书的时候用了新的办法把看书计划进行了量化,虽然简 ...

随机推荐

  1. Eclipse定制右键创建文件快捷菜单

    打开窗口“Customize Perspective - Java EE”,切换选项卡到“Shortcuts”: 进行一下配置: “Generate”:如上图勾选方式 "Java" ...

  2. rosetta common sh: mpiCC command not found解决方法

    在执行多线程编译rosetta时执行: python scons.py bin mode=release extras=mpi -j8 编译安装rosetta 会出现错误sh: mpiCC comma ...

  3. 【Selenium】3.介绍Selenium IDE

    本文供学习交流之用,没有商业用途,没有盈利. 完全是我自己为督促自己学习而翻译的.翻译的不好,见谅.来源于:http://www.guru99.com/introduction-selenuim-id ...

  4. opencv的学习笔记2

    继续昨晚的学习总结,昨晚看到轨迹条的创建就没有看下去了,今天继续: 1.轨迹条的创建: 轨迹条往往会和一个回调函数配合使用,当轨迹条发生改变,就调用这个轨迹条的回调函数 int createTrack ...

  5. 推荐使用Wiz笔记发表博客

    一直用Wiz笔记,平时随手记录一些东西,可以自动在多台电脑同步,还支持移动客户端,上下班路上用手机也能看.最近在整理之前工作的一些资料,并把自己觉得可以分享的内容发到博客园上.当然会先在Wiz笔记上编 ...

  6. Java中内存中的Heap、Stack与程序运行的关系

    堆和栈的内存管理 栈的内存管理是顺序分配的,而且定长,不存在内存回收问题:而堆 则是随机分配内存,不定长度,存在内存分配和回收的问题:堆内存和栈内存的区别可以用如下的比喻来看出:使用堆内存就象是自己动 ...

  7. Ninject简介

    1.为什么要用Ninject? Ninject是一个IOC容器用来解决程序中组件的耦合问题,它的目的在于做到最少配置.其他的的IOC工具过于依赖配置文件,需要使用assembly-qualified名 ...

  8. resque 遍历加载job目录下的类

    <?php class resqueTest { public function actionWork() { #require dirname(__DIR__).'/commands/Test ...

  9. Java虚拟机学习(2):垃圾收集算法

    跟踪收集器 跟踪收集器采用的为集中式的管理方式,全局记录对象之间的引用状态,执行时从一些列GC  Roots的对象做为起点,从这些节点向下开始进行搜索所有的引用链,当一个对象到GC  Roots 没有 ...

  10. linux定时执行任务

    (1)Linux下如何定时执行php脚本?(2)Linux下如何设置定时任务?(3)Crontab定时执行程序 核心提示:键入 crontab -e 编辑crontab服务文件 分为两种情况:(还有一 ...