漫游测试之性能测试(5.5-查询设计)
查询设计
13.1. 原则1——在小的结果集上操作
限制选择列表中的列数
在select语句的选择列表中使用最小的列集,不要使用输出结果集中不需要的列。如不要使用select*,select*语句使覆盖索引无效,并且也增加了网络传输量。
使用高选择性的Where子句
应该设计数据应用程序随着用户浏览数据而增量地请求数据。对于依靠大量数据进行分析或报告的应用程序,考虑使用数据分析解决方案如Analysis Services(分析服务)。
13.2. 原则2——有效使用索引
避免不可参数化的搜索条件
类型 |
搜索条件 |
不可参数化 |
<>、!=、!>、!<、NOT Exists、NOT IN、NOT Like IN、OR以及一些LIKE条件,如LIKE ‘%<literal>’ |
可参数化 |
=、>、>=、<、<=、Between以及一些LIKE条件,如LIKE ‘<literal>%’ |
避免Where子句列上的算术运算符
在Where子句中的列上使用算术运算符可以阻止优化器使用该列上的索引。
避免Where子句列上的函数
在Where子句中的列上使用函数可以阻止优化器使用该列上的索引。
13.3. 原则3——避免优化器提示
连接提示
提示阻止了自动参数化;阻止优化器动态决定表的连接范围。
一般语法为:
select * from table option(LOOP JOIN)
select * from table option(MERGE JOIN)
select * from table option(HASH JOIN)
索引提示(即强制使用某个索引)
一般情况,让优化器为查询选择最佳的索引策略,不要使用索引提示来忽略优化器的行为,而且不使用索引提示使优化器能够动态地随着数据的随时变化而确定最佳的索引策略。
即一般不要用此语法:
select * from table where (index (indexName)) where condtion
13.4. 原则4——使用域和参照完整性
非空约束
定义非空列约束帮助优化器在查询中该列上使用ISNULL函数时生成一个有效的处理策略。当不可避免地要处理Null值时,可以使用过滤索引来从索引中删除NULL值,从而改进索引的性能。
声明参照完整性
声明参照完整性用于定义父表和子表之间的参照完整性,它确保子表中的记录只当父表中存在对应记录时存在。在SQLServer中DRI使用父表上的PRIMARY KEY和子表上的FOREIGN KEY约束实现。
域和参照完整性,它们不仅确保数据的完整性而且还改进性能,他们为优化器提供更多生成高成本效益执行计划并改进性能的选择。注意,子表上的外键列应该非空。
13.5. 原则5——避免资源密集型的查询
避免数据类型转换
当两种不同的数据类型进行比较的时候,隐含数据类型将会自动起作用,但是它增加了查询优化器的开销。少数据的时候也许看不出来,但数据量较多的时候比较明显。
使用exists代替count(*)来验证数据的存在
使用count*验证数据存在是高度资源密集型的,它必须扫描表中所有的数据。
使用UNION ALL代表UNION
如果允许最终结果集中有重复的列,使用UNION ALL避免了侦测和删除重复的开销,这将改进性能。
为聚合和排序操作使用索引
在order by/group by子句中引用的列上创建索引帮助优化器快速地组织结果集,因为在索引中列值被预先安排好。
避免批查询中的局部变量
在批中的查询的where子句使用局部变量(Declare)使优化器不能生成有效的执行计划。不要使用局部变量作为批中的一个过滤条件,为批创建一个存储过程。
如Declare @id int=1;
select * from s>@id;
小心地命名存储过程
不应该使用SP_开头的存储过程,带有这个存储过程开头的名称,SQL Server会自动判断从master数据库开始。
13.6. 原则6——减少网络传输数量
将一组查询作为批或存储过程同时提交,可以减少网络传输量,提高性能和管理。
SET NOCOUNT ON
<SQL queries>
SET NOCOUNT OFF
这样将会去除掉服务器报告所影响的行数。也就是<Number> row(s) affected>的提示信息。
13.7. 原则7——减少事务开销
减少日志开销
如果每个查询分别维护原子性,那么在事务日志磁盘上要进行较多的磁盘写入操作以维护每个原子操作的持久性,而过多的磁盘活动将增加数据功能的执行时间。
DBCC SQLERF(Logspace) 显示日志比例
减少日志磁盘写操作数量的一个简单方法是将操作查询包含在一个明确的日志当中,最佳的方法是在事务中处理数据集而不是单行。(说白了就是一次最好能够集中插入很多行)
如
begin transaction
SQL语句
commit
减少锁请求的数量或降低锁请求的时间,也将提高性能
默认情况下,SQL Server可以提供行级锁,对于工作于大量行的查询,在所有单独的行上请求行锁为锁管理进程增加了很大的开销,可以通过减小锁的粒度来减少锁开销,比如使用页面或者表级别的锁。阻止select语句使用锁也是一个办法来降低锁开销。
漫游测试之性能测试(5.5-查询设计)相关推荐
- 漫游测试之性能测试(5.3-索引分析)
11.1.自动索引分析 优点:数据库引擎调整顾问,是用来分析已有索引的有效性并且为SQL的索引建立提供参考意见. 缺点:只能针对查询语句起作用. 步骤一:启动数据库引擎调整顾问 步骤二:设置配置选项 ...
- 漫游测试之性能测试(5.4-执行计划)
12. 执行计划 SQL Server动态控制过程缓冲中执行计划的存储,保留最常用的执行计划并放弃在一段时间中不使用的计划,当SQL Server在内存压力增加到没有足够的空闲内存以服务新的请求时,从 ...
- 【性能测试】性能测试之性能测试指标详解(详细)
目录:导读 前言 一.Python编程入门到精通 二.接口自动化项目实战 三.Web自动化项目实战 四.App自动化项目实战 五.一线大厂简历 六.测试开发DevOps体系 七.常用自动化测试工具 八 ...
- 软件测试之性能测试面试题合集
软件测试之性能测试面试题合集 1.描述一下你们公司的性能测试流程? 1)分析性能需求(用户使用最频繁的场景进行测试),确定性能指标(例如:事务通过率100%,top99%是5秒,最大并发是2000,C ...
- 性能测试 架构层(二) 从性能测试层面了解架构设计 分布式项目实施过程中的常见难点,测试架构层面思考性能测试应该如何做?自行思考解决方案是什么?
目录 前言 架构预览 小节 一.访问层架构设计 1.LVS 2.Nginx 二.API 网关层架构设计 1.分布式会话管理 2.接入层控制 Filter过滤器 三.核心服务层架构设计 1.核心服务 ...
- mysql数据库实验3查询_MySQL数据库实验:任务三 数据库的单表查询设计
任务三 数据库的单表查询设计 文章目录任务三 数据库的单表查询设计[实训目的与要求][实训原理][实训步骤]一.简单查询二.按条件查询1.比较大小查询2.带in关键字的查询(确定集合)3.带BETWE ...
- 使用Q查询设计搜索框
1 # 使用Q查询设计搜索框 2 3 # 使用stark时,用户可以自定义搜索字段配置,而配置的字段是一个列表,因此要使用到方法二 4 from django.db.models import Q 5 ...
- t–sql pl–sql_糟糕SQL查询设计– SQL查询性能的杀手–基本知识
t–sql pl–sql Depending on the performance problem cause, fixing poor SQL query design can be quick o ...
- access查询设计sol视图_选择查询-在access中如何建立一个选择查询只查询一个信?在access 爱问知识人...
在ACCESS中创建查询 像表向导.窗体向导等其他向导一样,Access查询向导能够有效地指导用户顺利地 进行创建查询的工作,详细地解释在创建过程中需要做出的选择,并能以图形的方式显示结果. Acce ...
最新文章
- 驱动保护中的ObjectType_Callback探索
- SasSHRM中基于shiro的认证授权:系统微服务配置shiro
- 『软件工程13』浅谈面向对象方法,统一建模语言UML
- 【CodeForces - 304B】Calendar (前缀和,水题)
- 基于JAVA+SpringMVC+Mybatis+MYSQL的养老社区管理系统
- 2017-2018-1 20155322 20155327 实验一 开发环境的熟悉
- android之在java代码引用res资源
- diskgenius创建efi分区_无损分区大小调整
- @Zabbix配置snmptrap及使用snmptt解析格式化输出
- c语言红外解码程序,红外线遥控器软件解码原理和程序(C语言)
- Python与数据库之学员管理系统
- 突发!阿里巴巴大调整
- 了解到的生二孩最好的理由
- GDOI2021自闭记
- 抖音高贵气质的签名_这些抖音直播注意事项,不注意很可能被封号!
- jackson的·入门
- 苹果个人开发者账号申请+获取证书+上架应用商城
- Python有什么用?Python 的 10 个实际用途
- vue 项目 前端 模拟后端接口数据(vue2,vue3)
- Unity用Mesh画多边形、圆形
热门文章
- HDFS性能压测工具
- 微信公众平台开发__导航
- 2010-2011-...-2016
- 和大于等于target的最短子数组 | 循序递进---@二十一画
- 做了个多语种网站 不能被GOOGLE,yahoo收录,baidu可以收录 终于找到问题
- 思科《计算机网络》第一章测试答案
- Game Programming with DirectX -- 08[Mesh]
- 《软件工程》网上书店项目设计活动
- android8.1- Show virtual keyboard 默认打开
- 第4套 从零到商业实战篇 斗战神篇