Sql优化索引优化脚本优化Sql性能优化

对于数据库的sql脚本优化的一些笔记

以下使用的sql脚本为Sql Server的语法。

  1. 尽量避免隐式转换
    避免使用不一致的类型去匹配查询字段,而应该使用与数据库字段一致的类型去匹配查询。
    如:字段是varchar类型,而使用的是数字类型的值去匹配,否则可能导致不会走索引。
select * from userTest where idNo = '58714582698575';--字段类型一致
select * from userTest where idNo = 58714582698575; --字段类型不一致

在程序编码过程中,要在参数传入之前就转换好数据类型,而不是到了运行时依赖于数据库的隐式转换。

  1. 尽量避免对字段使用函数或表达式
    在sql操作时,应尽量避免对字段使用函数等表达式来限制匹配。
    如:
---匹配证件号码idNo的前四位为”3625”的数据
select * from userTest where left(idNo,4) = '3624'; --避免使用这种方式,不会走索引
select * from userTest where idNo like '3624%'; --可以改用这种方式,走索引

---找到分数的一半等于20分的所有信息
select * from userTest where score/2 = 20;  --避免使用这种方式,不会走索引
select * from userTest where score = 20*2;  --可以改用这种方式,走索引
  1. 使用非运算不走索引
    尽量避免使用 != 、<>、is null 、is not null、in、not in操作符。
    如:
---找到证件号码不是'58714582698575'的信息
select * from userTest where idNo <> '58714582698575';
--找到有证件号码的数据
select * from userTest where idNo is not null;
此中方式不是不能用,只是用了不会走该字段的索引。
  1. 避免字段类型与需求字段类型不一致
    在工作当中,有的开发人员喜欢将数字类型、金额类型设计成字符varchar类型,以便于它在代码实现过程中,不用做任何字段类型的转换。
    如:本该存放金额的字段decimal类型,确设计成了varchar类型。
    对于数字字段,设计为字符型,会降低查询和连接的性能,增加存储开销。这是因为数据库在查询和连接时会逐个比较字符串中每一个字符,导致性能降低,而对于数字型而言只需要比较一次就可以了,当然这只是其中影响之一,对于类型不一致的情况,还会带来其他很多不便,不如sum金额的时候,排序金额的时候。
  2. 尽量避免使用子查询
select * from userTest1 a where (select count(*) from userTest2 b where a.userId=b.userId)>0;
select * from userTest1 a where EXISTS (select top 1 1 from userTest2 b where a.userId=b.userId);

很明显第一句的性能比第二句的性能低,因为第一句会产生大量锁定的表扫描或是索引扫描。

  1. 尽量避免使用count(*)
    在开发过程中,会存在很多的boolean的判断。
如:判断”张三”是否存在,然后很多的开发人员会这么做
select count(*) from userTest1 where name = '张三';

根据这条sql查询出的值,判断是否大于0来判断是否存在”张三”。
然后我们完全可以如下做,

select top 1 1 from userTest1 where name = '张三';--sql server的语法

只查询出一条记录,拿到结果集,只需要判断结果是否为’1’即可。
假如:该表有很多的’张三’,然后在存储中,存放在相距很远的内存块中,使用count(
)的话是要找到所有的内容汇总后才 返回结果,而top 1 1 的话只需要找到一条就返回结果。后者性能当然比前者高。*

  1. 尽量避免索引字段用前缀通配符
select * from userTest where username like '_小二'; --查询所有单姓,名字叫小二的数据
select * from userTest where username like '%小二'; --查询所有单姓,名字叫小二的数据

以上两种均不会走索引,应该如下使用。

select * from userTest where username like '王%'; --查询王姓数据,走索引
  1. 联合索引最左匹配原则
    给userTest建立一个联合索引index1:(userId,username, birthDate).
select * from userTest where username = '王小二'; ---不走index1索引
select * from userTest where birthDate = '2020-01-01'; ---不走index1索引
select * from userTest where userId = '0000001'; ---走index1索引

使用全是最优做法:

select * from userTest where userId='000001' and username = '王小二' and birthDate = '2020-01-01'; ---走index1索引
  1. 尽量避免使用or、in、not in

    userId与birthDate均创建了索引

select  roleId,birthDate from userTest where birthDate = '2021-11-21' or (roleId = '000001' and birthDate > '2020-01-01');

可以优化成

select  roleId,birthDate from userTest where birthDate = '2021-11-21'
union all
select  roleId,birthDate from userTest where roleId = '000001' and birthDate > '2020-01-01';

但并不是所有的索引都适合这样优化,可通过查询计划找出原因进行优化。

  1. 在使用union all 能满足时就不要使用union

    Union all 是将多个结果集拼成一个结果集
    Union 是将多个结果集去重后拼成一个结果集

  2. 其他
    索引的建立,加快了数据的查询速度,但是同时也降低了update、insert、delete的效率,每次的update等操作,不仅需更新数,同时也会去更新索引,索引不是越多越好。很多的开发人员喜欢无脑的创建索引,我见过最多的是,一个表36个字段,确建立了16个索引,这是极其不可取的。
    科学索引一般3个为宜,万般无奈的情况下不要超过7个。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SQL注入的原理 什么SQL注入 将SQL代码插入到应用程序的输入参数中,之后,SQL代码被传递到数据库执行。从而达到对应用程序的攻击目的。 注入原理 常见攻击方法 检测是否可以注入【检测注入点】 示例:http://192.168.0.1/temp.aspx?id=a or 1=1-- 如果上面语句可以执行说明可以实现注入,则可以 利用系统过程、系统表注入数据库 示例【给系统添加一个用户,黑客可以实现远程登录控制服务器】:http://192.168.0.1/temp.aspx?id=1;exec xp_cmdshell 'net user admin 123456 /add' 绕过程序的限制 示例:程序中往往限制单引号的数据,但是黑客传入单引号的ASCII码 跨站点注入 在Web页面挂某些恶意的HTML、JavaScript代码 防范SQL注入 限制错误信息的输出,避免错误信息的输出使得黑客知道网站的技术实现采用什么数据库,采用什么平台 示例:在Web.config文件中设置 限制访问数据库账号的权限 在开发应用系统的时候就应该限制,给程序最小访问数据库的权限 使用参数命令传递参数 不要使用拼接字符串的方式构造SQL语句而采用参数命令 使用存储过程 存储过程在数据库中 只能执行存储过程中固定的代码 限制输入长度 防止黑客输入超大字符串,导致服务器瘫痪 防止黑客输入较长的恶意脚本等 实现方法:文本框的MaxLength属性 URL重写技术 示例: http://testWeb/news.aspx?id=111 重写成:http://testWeb/10101111.html 传递参数尽量不用字符串 http://testWeb/news.aspx?id=111 and 1=1【黑色部分给了SQL注入的机会】 SQL优化 为什么要优化 开发是对性能考虑不多【技术差、项目工期紧等原因没有考虑性能问题】 系统运行中,数据量扩大,访问量增多,蹩脚的SQL危害开始显露 低效SQL的危害 系统响应变慢,软件开发中的8秒定律,当打开一个软件或网页超过8秒时间还没有显示,则响应太慢。 死锁,当不同用户都访问某些资源的时候SQL语句不当导致死锁 客户失去信心,软件失败 低效SQL低效在哪里?  性能低下的根源  硬件原因,数据库的配置不合理,数据库的数据文件和日志文件没有分磁盘存放,会极大影响IO性能  没有建立索引,或者SQL没有走索引。在千万级数据的表上建索引是很有必要的。  SQL过于复杂,过长的SQL语句满足程序需求但是影响性能。子查询嵌套过多对性能有影响,查询关联的表特别多也影响性能  频繁访问数据等等 SQL如何被SQLServer执行的 SQL执行原理  解释:首先解释SQL语句【语法是否正确】  解析:检验语句的出现的对象是否有效【进行一个解析,要检查对象所有权的权限】  优化:【检查SQL语句是否能够使用索引SQL语句如何执行效率高,制定一个执行计划】  编译:  执行SQL语句:【把编译过的查询要求提交并进行处理】 如何优化SQL 完善开发的管理 完善代码审核、测试机制,软件开发是艺术! 检测SQL查询的效率 语法【对IO和Time对SQL执行进行统计】: SET STATISTICS IO ON SET STATISTICS TIME ON ------------SQL代码--------- SET STATISTICS IO OFF SET STATISTICS TIME OFF 注意:在检测之前要清理缓存,因为当我们执行SQL语句的时候查出的数据会在数据库中进行缓存,重新查询会返回缓存中的信息。 DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE 经验:使用子查询嵌套不要过多,尽量使用表连接查询代替子查询,因为表连接查询效率稍高一点。 SQL优化工具 使用报表服务 通过Reporting Service查找低效SQL 选择 性能 - 批处理执行统计信息和性能相关的几个报表服务: 性能 - 对象执行统计信息 性能 - 按平均CPU时间排在前面的查询 性能 - 按平均IO次数排在前面的查询 性能 - 按总CPU时间排在前面的查询 性能 - 按IO总次数排在前面的查询 操作示范: 1. 数据引擎上点击右键—报表—标准报表—关心的
第1章 全局在胸——用工具对SQL整体优化 1 1.1 都有哪些性能工具 1 1.1.1 不同调优场景分析 2 1.1.2 不同场景对应工具 2 1.2 整体性能工具的要点 4 1.2.1 五大性能报告的获取 5 1.2.2 五大报告关注的要点 10 1.3 案例的分享与交流 18 1.3.1 和并行等待有关的案例 18 1.3.2 和热块竞争有关的案例 19 1.3.3 和日志等待有关的案例 20 1.3.4 新疆某系统的前台优化 20 1.3.5 浙江某系统的调优案例 21 1.4 本章总结延伸与习题 21 1.4.1 总结延伸 21 1.4.2 习题训练 23 第2章 风驰电掣——有效缩短SQL优化过程 24 2.1 SQL调优时间都去哪儿了 25 2.1.1 不善于批处理频频忙交互 25 2.1.2 无法抓住主要矛盾瞎折腾 25 2.1.3 未能明确需求目标白费劲 26 2.1.4 没有分析操作难度乱调优 26 2.2 如何缩短SQL调优时间 27 2.2.1 先获取有助调优的数据库整体信息 27 2.2.2 快速获取SQL运行台前信息 27 2.2.3 快速拿到SQL关联幕后信息 28 2.3 从案例看快速SQL调优 29 2.3.1 获取数据库整体的运行情况 29 2.3.2 获取SQL的各种详细信息 29 2.4 本章总结延伸与习题 32 2.4.1 总结延伸 32 2.4.2 习题训练 33 第3章 循规蹈矩——如何读懂SQL执行计划 34 3.1 执行计划分析概述 35 3.1.1 SQL执行计划是什么 35 3.1.2 统计信息用来做什么 36 3.1.3 数据库统计信息的收集 37 3.1.4 数据库的动态采样 37 3.1.5 获取执行计划的方法(6种武器) 40 3.2 读懂执行计划的关键 48 3.2.1 解释经典执行计划方法 49 3.2.2 总结说明 55 3.3 从案例辨别低效SQL 55 3.3.1 从执行计划读出效率 56 3.3.2 执行计划效率总结 60 3.4 本章习题、总结与延伸 60 第4章 运筹帷幄——左右SQL执行计划妙招 62 4.1 控制执行计划的方法综述 63 4.1.1 控制执行计划的意义 63 4.1.2 控制执行计划的思路 64 4.2 从案例探索其方法及意义 65 4.2.1 HINT的思路 65 4.2.2 非HINT方式的执行计划改变 72 4.2.3 执行计划的固定 100 4.3 本章习题、总结与延伸 102 第5章 且慢,感受体系结构让SQL飞 103 5.1 体系结构知识 104 5.1.1 组成 104 5.1.2 原理 104 5.1.3 体会 105 5.2 体系与SQL优化 106 5.2.1 与共享池相关 107 5.2.2 数据缓冲相关 111 5.2.3 日志归档相关 116 5.3 扩展优化案例 118 5.3.1 与共享池相关 118 5.3.2 数据缓冲相关 122 5.3.3 日志归档相关 126 5.4 本章习题、总结与延伸 130 第6章 且慢,体验逻辑结构让SQL飞 132 6.1 逻辑结构 132 6.2 体系细节与SQL优化 133 6.2.1 Block 133 6.2.2 Segment与extent 137 6.2.3 Tablespace 139 6.2.4 rowid 139 6.3 相关优化案例分析 140 6.3.1 块的相关案例 141 6.3.2 段的相关案例 144 6.3.3 表空间的案例 148 6.3.4 rowid 151 6.4 本章习题、总结与延伸 153 第7章 且慢,探寻表的设计让SQL飞 154 7.1 表设计 154 7.1.1 表的设计 155 7.1.2 其他补充 155 7.2 表设计与SQL优化 156 7.2.1 表的设计 156 7.2.2 其他补充 179 7.3 相关优化案例分析 184 7.3.1 分区表相关案例 185 7.3.2 全局临时表案例 190 7.3.3 监控异常的表设计 195 7.3.4 表设计优化相关案例总结 199 7.4 本章习题、总结与延伸 199 第8章 且慢,学习索引如何让SQL飞 200 8.1 索引知识要点概述 201 8.1.1 索引结构的推理 201 8.1.2 索引特性的提炼 204 8.2 索引SQL优化 206 8.2.1 经典三大特性 207 8.2.2 组合索引选用 217 8.2.3 索引扫描类型的分类与构造 219 8.3 索引相关优化案例 225 8.3.1 三大特性的相关案例 225 8.3.2 组合索引的经典案例 231 8.4 本章习题、总结与延伸 234 第9章 且慢,弄清索引之阻碍让SQL飞 23

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luckjump

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值