当前位置: 首页 > 编程日记 > 正文

SQL优化整理。

其实SQL能力很差劲,简单查询还成,复杂查询以及优化,基本脑子里没有概念。了解一下概念,然后打算找本理论书好好看看。

先到处找了些优化的sql,整理出来,记录一下。

  1、对查询进行优化,应尽量避免全表扫描,首先应考虑在where order by 涉及的列上建立索引。

  2、应尽量避免在where 子句中对字段进行null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:

  select id from t where num is null

  可以在num上设置默认值,确保表中num列没有null值,然后这样查询:

  select id from t where num=0

 3 、应尽量避免在where 子句中使用!=<>操作符,否则将引擎放弃使用索引而进行全表扫描。

 4、应尽量避免在where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

  select id from t where num=10 or num=20

  可以改为如下的查询:

  select id from t where num=10

  union all

  select id from t where num=20

5 、in not in 也要慎用,否则会导致全表扫描,如:

  select id from t where num in(1,2,3)

  对于连续的数值,能用between 就不要用in

  select id from t where num between 1 and 3

6 、下面的查询也将导致全表扫描:

  select id from t where name like '%abc%'

  若要提高效率,可以考虑全文检索。

 7 、如果在where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:

  select id from t where num=@num

  可以改为强制查询使用索引:

  select id from t with(index(索引名)) where num=@num

 8 、应尽量避免在where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

  select id from t where num/2=100

  应改为:

  select id from t where num=100*2

 9 、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:

  select id from t where substring(name,1,3)='abc'--nameabc开头的id

  select id from t where datediff(day,createdate,'2010-11-30')=0--‘-11-30’生成的id

  应改为:

  select id from t where name like 'abc%'

  select id from t where createdate>='2010-11-30' and createdate<'2010-12-1'

 10 、不要在where 子句中的=左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

  、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

 11 、不要写一些没有意义的查询,如需要生成一个空表结构

  select col1,col2 into #t from t where 1=0

  这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:

  create table #t(...)

 12 、很多时候用exists 代替in 是一个好的选择

 select num from a where num in(select num from b)

  用下面的语句替换:

select num from a where exists(select 1 from b where num=a.num)

13如果你想校验表里是否存在某条纪录,不要用count(*)那样效率很低,而且浪费服务器资源。可以用EXISTS代替

if (select COUNT(*) from table_name where column_name = 'xxx')

可以写成:

if exists (select * from table_name where column_name = 'xxx')

 13 、并不是所有索引对查询都有效SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sexmalefemale几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

 14 、索引并不是越多越好,索引固然可以提高相应的select 的效率,但同时也降低了insert update 的效率,因为insert update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

 15 、应尽可能的避免更新clustered 索引数据列,因为clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新clustered 索引数据列,那么需要考虑是否应将该索引建为clustered 索引。

 16尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

 17 、尽可能的使用varchar/nvarchar 代替char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

 18 、任何地方都不要使用select * from t ,用具体的字段名称代替*,不要返回用不到的任何字段。

 19 、尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

 20 、避免频繁创建和删除临时表,以减少系统表资源的消耗。

 21 、临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使用导出表。

 22 、在新建临时表时,如果一次性插入数据量很大,那么可以使用select into 代替create table,避免造成大量log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert

 23 、如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先truncate table ,然后drop table ,这样可以避免系统表的较长时间锁定。

24truncate table delete

 

truncate table delete 都是删除表

truncate table 是删除表内容,对表结构没有影响,也没有where语句,所以是整表内容删除。

delete 删除是一行一行删除,并且写日志。所以相对来说较慢一些

truncate table delete 有效率(在删除整表的时候)

25分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,这时在WHERE 子句中将连接条件完整的写上,有可能大大提高查询速度。

例:

 

SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO   SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO AND A.ACCOUNT_NO=B.ACCOUNT_NO

第二句将比第一句执行快得多。

转载于:https://www.cnblogs.com/yiranleguan/archive/2012/01/11/2318744.html

相关文章:

PHP开发框架之YII框架学习——碾压ThinkPHP不是梦

前 言 JRedu 程序猿是一种慵懒的生物&#xff01;能少敲一行代码&#xff0c;绝对不会多敲一个字符&#xff01;所以&#xff0c;越来越多的开发框架应运而生&#xff0c;在帮助我们完成功能的同时&#xff0c;极大程度上也帮我们节省了人力物力&#xff0c;而且也提高了系统的…

刻意练习:LeetCode实战 -- 二叉树的前序遍历

背景 今天&#xff0c;第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务是二叉树的中序遍历&#xff0c;由于二叉树的遍历方式通常来说有四种&#xff1a;前序遍历、中序遍历、后序遍历以及层次遍历&#xff0c;而LeetCode也有二叉树的前序遍历题目&…

接口测试要如何做数据准备

数据准备是接口测试过程中不可或缺的一步&#xff0c;也是花费时间很长的工作&#xff0c;因为程序的功能就是处理数据。那么在接口测试中&#xff0c;我们要怎样来准备数据呢?小编整理了以下一些关于数据准备的方法&#xff0c;希望对大家能有所帮助。 数据准备分为两种类型&…

刻意练习:LeetCode实战 -- 二叉树的后序遍历

背景 今天&#xff0c;第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务是二叉树的中序遍历&#xff0c;由于二叉树的遍历方式通常来说有四种&#xff1a;前序遍历、中序遍历、后序遍历以及层次遍历&#xff0c;而LeetCode也有二叉树的后序遍历题目&…

数据库加锁(转)

1 如何锁一个表的某一行 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM table ROWLOCK WHERE id 1 2 锁定数据库的一个表 SELECT * FROM table WITH (HOLDLOCK) 加锁语句&#xff1a; sybase: update 表 set col1col1 where 10 ; MSSQL: select col1 from …

学好web前端开发要注意哪些问题

web前端学起来是比较困难的&#xff0c;当然想要学好web前端技术&#xff0c;那么有一些注意事项一定是要看的&#xff0c;下面小编就为大家详细的介绍一下学好web前端开发要注意哪些问题? ​  学好web前端开发要注意哪些问题? 基础&#xff1a;无论做什么都一定要有扎实的…

Android include 标签

android中include标签是为了便于控件的覆用的一个很好解决方案。 但是也有一些需要注意的地方&#xff0c;下面是本人在项目中碰到过的一个问题&#xff0c;做此记录&#xff0c;便于以后查看。 include标签用法。 1.新建一个xml文件&#xff0c;命名 head.xml head.xml文件内容…

刻意练习:LeetCode实战 -- 不同的二叉搜索树

背景 今天&#xff0c;第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务是“不同的二叉搜索树 II”&#xff0c;而LeetCode也有“不同的二叉搜索树”题目&#xff0c;故一起写了。 题目 题号&#xff1a;96难度&#xff1a;中等https://leetcode-cn.…

15. Python 函数

1. 函数的写法&#xff0c;函数的调用【函数的一般形式】定义一个函数要有以下规则&#xff1a;&#xff08;1&#xff09;函数代码块以 def 关键词开头&#xff0c;后接函数标识符名称和小括号&#xff08;&#xff09;&#xff1b;&#xff08;2&#xff09;任何传入参数和自…

Java培训找什么样的机构比较好

​ Java培训找什么样的机构比较好?很多人都比较关注java技术&#xff0c;想要学习java技术&#xff0c;参加相关工作&#xff0c;但如今市面上的java培训机构那么多&#xff0c;怎么样选择比较靠谱呢?来看看下面的详细介绍吧。 ​  Java培训找什么样的机构比较好?小编这里…

刻意练习:LeetCode实战 -- Task23. 不同的二叉搜索树 II

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式&#xff0c;即选择了五个知识点&#xff08;数组、链表、字符串、树、贪心算法&#xff09;&#xff0c;每个知识点选择了…

windows phone 越狱教程:利用学生帐号解锁并部署软件教程(图文并茂)

之前老是看到有学生帐号可以越狱,但一直以来都觉得比较复杂,不想下手.近日,TX微信出来了,很多人都想装,可是装不了,所以下决心研究一下学生帐号越狱.网上看教程,发现很多都是不全面,有些只有一半,最后还是决定按我自己申请学生帐号时的流程写一个教程,希望对大家有所帮助. 学生…

基于web创建逼真的3D图形 | CSS技巧

在成为一名web开发者之前&#xff0c;我从事于视觉设计行业&#xff0c;创造屡获殊荣&#xff0c;电影和电视节目等高端3D效果&#xff0c;例如 Tron, The Thing, Resident Evil,和 Vikings 。为了能够创造这些效果&#xff0c;我们需要使用高度复杂的动画软件&#xff0c;例如…

jQuery元素内容操作的方法有多少种?

jQuery中操作元素内容的方法&#xff0c;主要包括html()方法、text()方法和val()方法。html()方法用于获取或设置元素的HTML内容&#xff0c;text()方法用于获取或设置元素的文本内容&#xff0c;val()方法用来获取或设置表单元素的value值。具体使用说明如表1所示。 表1 元素内…

获取SQLServer数据库中所有表

对于获取SQLSERVER数据库中所有表&#xff0c;首先第一步引有SQLDMO.dll 找到文件路径: C:\Program Files\Microsoft SQL Server\80\Tools\Binn\SQLDMO.dll 找到SQLDOM.DLL //在后台写方法 using System;using System.Collections.Generic;using System.Linq;using Syst…

刻意练习:LeetCode实战 -- Task24. 恢复二叉搜索树

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式&#xff0c;即选择了五个知识点&#xff08;数组、链表、字符串、树、贪心算法&#xff09;&#xff0c;每个知识点选择了…

Solaris下ftp配置(初稿-待补充)

1.自带ftp版本 Version wu-2.6.2 2.ftp启动与停止 启动并启用ftp: svcadm enable network/ftp 停止并禁用ftp: svcadm disable network/ftp 3.使某个系统用户无法使用ftp或者恢复使用ftp vi /etc/ftpd/ftpusers 向其中添加要禁止使用ftp的…

女生参加web前端培训可以吗

​ 近几年&#xff0c;web前端被视为互联网行业最热门编程语言技术之一&#xff0c;越来越多的人开始想要学习web前端技术&#xff0c;其中不乏有一些女性学习&#xff0c;那么很多人就要问了&#xff0c;女生参加web前端培训可以吗?我们来看看下面的详细介绍吧。 ​  女生参…

春节期间停止更新

非常抱歉地跟各位说一下&#xff0c;因为老家并没有拉宽带&#xff0c;所以春节期间无法进行更新。虽然说我可以背着笔记本回家&#xff0c;然后再到朋友处蹭一下网络。但想到一年365天&#xff0c;能回家的就那么几天&#xff0c;只是想好好陪陪父母&#xff0c;伴伴自己的老婆…

刻意练习:LeetCode实战 -- Task26.判断子序列

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式&#xff0c;即选择了五个知识点&#xff08;数组、链表、字符串、树、贪心算法&#xff09;&#xff0c;每个知识点选择了…

spring @component的作用

转自&#xff1a;https://www.cnblogs.com/lyjing/p/8427832.html1、controller 控制器&#xff08;注入服务&#xff09; 2、service 服务&#xff08;注入dao&#xff09; 3、repository dao&#xff08;实现dao访问&#xff09; 4、component &#xff08;把普通pojo实例化到…

使用JavaScript变量需要注意哪些语法细节?

使用JavaScript变量需要注意哪些语法细节?JavaScript在很多地方经常会涉及到&#xff0c;尤其是JavaScript变量这方面&#xff0c;在使用变量时&#xff0c;还有一些值得注意的语法细节&#xff0c;下面进行详细讲解。 使用JavaScript变量需要注意哪些语法细节? 1. 更新变量的…

手把手教你搭建一个学习Python好看的 Jupyter 环境

又到摆脱重复工作&#xff0c;换个心情&#xff0c;然而并没有软用的时间了。这次&#xff0c;教大家如何搭建一个好看的jupyter环境。安装Jupyter先来展示一下我的环境python: 3.5.*macos: 10.12.4安装Jupyter的过程只需安装Anaconda即可。测试一下初始设置&#xff1a;jupyte…

刻意练习:LeetCode实战 -- Task27.分发饼干

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式&#xff0c;即选择了五个知识点&#xff08;数组、链表、字符串、树、贪心算法&#xff09;&#xff0c;每个知识点选择了…

祝贺《WCF邮件通信系统》在高阳市场研究汇编第五期发表

上次给公司的市场研究汇编投稿&#xff0c;只写了一个PPT格式的《WCF邮件通信系统》&#xff0c;编辑把它整理成了PDF格式的内容&#xff0c;感觉很好&#xff0c;所以我把PDF原文中的有关内容存储成了图片&#xff0c;发表在这里&#xff0c;庆贺一下。PDF原文地址&#xff1a…

学软件测试有前途吗

学软件测试有前途吗?很多人都关心这个问题&#xff0c;最近几年&#xff0c;软件测试这个行业在很多企业都是非常刚需的&#xff0c;随着互联网的飞快发展&#xff0c;IT行业出现日新月异的变化&#xff0c;企业的大量需求&#xff0c;人才的严重匮乏&#xff0c;导致IT行业&a…

Active Directory 账号迁移配置介绍

首先介绍一下环境: 生产域环境: example.cn 测试域环境: fengdian.info 系统平台: 2K08 R2 林、域功能级别&#xff1a;Windows Server 2008 要求: 测试域环境“fengdian.info”同步生产域环境所有用户账号&#xff0c;实现测试环境和生产环境的基本统 一&#xff0c;方便功能测…

VIM命令快速记忆(转自杰哥)

因为自己也是个linuxer 熟练运用VIM是必须的&#xff0c;恰好学长杰哥对此有研究&#xff0c; 转来给大家分享。对此表达对杰哥的敬意。 有好东西分享给大家才能相互学习是吧。 要做个Linuxer&#xff0c;VIM的操作是必须就跟手指头盲打键盘那么熟练。 首先说下Vim的两种最常用…

刻意练习:LeetCode实战 -- Task28.跳跃游戏

背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法&#xff08;Leetcode&#xff09;刻意练习训练营 的打卡任务。本期训练营采用分类别练习的模式&#xff0c;即选择了五个知识点&#xff08;数组、链表、字符串、树、贪心算法&#xff09;&#xff0c;每个知识点选择了…

类操作是什么意思?jQuery的类操作教程

类操作就是通过操作元素的类名进行元素样式操作&#xff0c;当元素样式比较复杂时&#xff0c;如果通过css()方法实现&#xff0c;需要在CSS里编写很长的代码&#xff0c;既不美观也不方便。而通过写一个类名&#xff0c;把类名加上或去掉就会显得很方便。下面通过代码演示类的…