Ad-hoc 查询以及动态SQL的罪恶[译]
前言
在硬件资源非常有限的SQLServer服务器上进行开发,有一大优势,就是错误是可视化的,即你很快就会因为你的错误而受到惩罚。譬如,应用中过多使用ad-hoc动态查询的产生的问题会很快暴露出来。开发者可能会向你抱怨,数据库运行的越来越慢。你也将会发现服务器CPU的使用率非常高,甚至接近100%,但是在性能较差的时段,却没有阻塞的发生。
在极端的情况下,你甚至可能接受到如下的错误:
Error: 701, Severity: 17, State: 1
There is insufficient system memory to run this query.
或者
Msg 8645, Level 17, State 1, Procedure , Line 1
A time out occurred while waiting for memory resources to execute the query. Re-run the query.
分析
你会发现运行过多的ad-hoc查询所有造成的不良影响。CPU利用率高是因为查询优化器需要编译大量的ad-hoc查询。内存压力是因为一些内存用来缓存ad-hoc查询生成的执行计划。换句话说,开发者使用了Ad-hoc查询,而不是使用存储过程或者参数化的查询。这是非常愚蠢的。
一个编译好的执行计划大约占用70KB的空间,而一个存储过程的执行计划,根据其复杂度,大约占用2到3倍的空间。区别是每个存储过程只有一个执行计划。使用Ad-hoc查询,你将冒着每个查询都有一个单独的执行计划的风险。
执行计划缓存起来是为了被重用的,SQLServer需要占用内存来存储执行计划,这部分内存按照申请方式称为StolenPages。其他占用StolenPages的对象包括了Connections、Locks 和 Transaction Context等一些内存Consumer以及线程和第三方代码消耗的内存。这是一个简单的日常任务分配内存的方式,但是当数据库接受到非常多的Ad-hoc查询时,将会产生麻烦。除非SQLServer可以确定查询可以自动的参数化或者说新的查询和已缓存的查询一致,否则SQLServer就会重新生成一个执行计划。可能不长时间,你就会看到数据缓存产生瓶颈
那么如何确定系统是否存在这种问题
1. 检查编译查询计划的数量。SQLServer性能监视器将会显示 SQL Compilations/sec 有比较高的数值。理论上,SQL Recompilations/sec 和 Batch Requests/sec 的比率应该会非常低
2. DBCC MemoryStatus 也会显示出stolen pages的数量会上升
确定问题后,如何解决
1. 使用存储过程来执行
2. 使用参数化查询
实例演示 略 具体见原网址
如有不对的地方,欢迎拍砖,谢谢!O(∩_∩)O
Ad-hoc 查询以及动态SQL的罪恶[译]的更多相关文章
- MyBatis学习总结(三)——多表关联查询与动态SQL
在上一章中我们学习了<MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射>,这一章主要是介绍一对一关联查询.一对多关联查询与动态SQL等内容. 一.多表关联查询 表与 ...
- Mybatis之关联查询及动态SQL
前言 实际开发项目中,很少是针对单表操作,基本都会联查多表进行操作,尤其是出一些报表的内容.此时,就可以使用Mybatis的关联查询还有动态SQL.前几篇文章已经介绍过了怎么调用及相关内容,因此这里只 ...
- MyBatis中的条件查询(动态sql)
本文将介绍使用MyBatis框架,编写DAO层接口类和接口类对应的sql映射文件,使用动态sql查询满足条件的用户集合. 首先,需要创建一个实体类User,供封装数据使用: package com.x ...
- Mybatis分页查询与动态SQL
一.Mybatis的分页查询 由于第一二节较为详细讲述了Mybatis的环境搭建,文件配置,SQL编写和Java代码实现,所以接下来的讲述都将只抽取关键代码和mapper文件中的关键sql,详细的流程 ...
- Jfinal适用于条件查询的动态SQL语句生成工具
条件查询是可能有为空字段,拼接SQL语句时候要屏蔽掉这些字段. package cn.pangpython.utils; import java.util.Iterator; import java. ...
- Mybatis.net与MVC入门配置及联合查询动态SQL拼接和简单事务
第一次学习Mybatis.net,在博客园也找到好多资料,但是在配置成功之后也遇到了一些问题,尤其是在动态SQl拼接时候,这里把遇到的问题还有自己写的一个Demo贴出来,希望能帮到新手,有不适合的地方 ...
- SQL Server-聚焦深入理解动态SQL查询(三十二)
前言 之前有园友一直关注着我快点出SQL Server性能优化系列,博主我也对性能优化系列也有点小期待,本来打算利用周末写死锁以及避免死锁系列的接着进入SQL Server优化系列,但是在工作中长时间 ...
- .Net程序员学用Oracle系列(28):PLSQL 之SQL分类和动态SQL
1.SQL 语句分类 1.1.分类方法及类型 1.2.数据定义语言 1.3.数据操纵语言 1.4.其它语句 2.动态 SQL 理论 2.1.动态 SQL 的用途 2.2.动态 SQL 的语法 2.3. ...
- Mybatis第三篇【动态SQL】
动态SQL 何为动态SQL??回顾一下我们之前写的SSH项目中,有多条件查询的情况,如下图 我们当时刚开始做的时候,是需要在Controller中判断SQL是否已经有条件了,因为SQL语句需要拼接起来 ...
随机推荐
- Vue的Computed的使用
Vue的Computed的使用 相关Html: <!DOCTYPE html> <html lang="en"> <head> <meta ...
- spring boot启动加载数据
实际应用中,我们会有在项目服务启动的时候就去加载一些数据或做一些事情这样的需求.为了解决这样的问题,spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRunner 来实 ...
- 如何虚拟机里安装Win10操作系统
不多说,直接上干货! Windows Server 2003.2008.2012系统的安装 推荐网址:打开MSDN网站(http://msdn.itellyou.cn ) 关于给电脑换系统,很多人会花 ...
- 关于符号Symbol第二篇
来看一下继承自Symbol的具体实现类. 1.TypeSymbol /** A class for type symbols. * Type variables are represented by ...
- centos7防暴力破解五种方法
什么是暴力破解,简单来说就是对一个服务器进行无数次尝试登陆,并用不同的密码进行登陆直到可以登陆成功.暴力破解的基本步骤可以分为以下几步: 1. 找到对应的linux服务器 Ip地址 2.扫描端口 ...
- java面试②基础部分
2.1.3 讲一下java中int数据占几个字节 java中有几种基本数据类型? 2.1.4. 面向对象的特征有哪些方面 有四大基本特征:封装.抽象.继承.多态 1)封装,即将对象封装成一个高度自治和 ...
- .Net Core全球化多语言
参照:ASP.NET Core 全球化和本地化 步骤如下: 后台中的本地化. Startup.cs中注册服务并制定Resource文件的位置.注意:这里的位置不仅仅应用到Web层,如Infrastru ...
- I/O模式总结
进程读取数据时要经过两个阶段: 1.等待内核准备数据: 2.将内核缓冲区中的数据复制到进程缓冲区中. 一.阻塞IO 进程会阻塞在等待内核准备数据和数据从内核空间复制到用户空间这两个阶段. 二.非阻塞I ...
- visual studio 不能进入调试状态
解决Windows操作系统在处理回环地址 1. 第一种解决方案是禁用环回检查. 步骤如下 a) 依次单击“开始”和“运行”,键入 regedit,然后单击“确定” b) 在注册表编辑器中,找到并单击下 ...
- python可视化基础
常用的python可视化工具包是matplotlib,seaborn是在matplotlib基础上做的进一步封装.入坑python可视化,对有些人来说如同望山跑死马,心气上早输了一节.其实学习一门新知 ...