首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据库查询优化

1 使用SET NOCOUNT ON 选项: 缺省地,每次执行SQL语句时,一个消息会从服务端发给客户端以显示SQL语句影响的行数。这些信息对客户端来说很少有用。通过关闭这个缺省值,你能减少在服务端和客户端的网络流量,帮助全面提升服务器和应用程序的性能。为了关闭存储过程级的这个特点,在每个存储过程的开头包含“SET NOCOUNT ON”语句。 2 正确使用UNION和UNION ALL: 许多人没完全理解UNION和UNION SELECT是怎样工作的,因此,结果浪费了大量不必要的SQLServer资源。当使用UNION时,它相当于在结果集上执行SELECT DISTINCT。换句话说,UNION将联合两个相类似的记录集,然后搜索重复的记录并排除。如果这是你的目的,那么使用UNION是正确的。但如果你使用UNION联合的两个记录集没有重复记录,那么使用UNION会浪费资源,因为它要寻找重复记录,即使你确定它们不存在。 所以如果你知道你要联合的记录集里没有重复,那么你要使用UNION ALL,而不是UNION。UNION ALL联合记录集,但不搜索重复记录,这样减少SQLServer资源的使用,从而提升性能。 3 尽量不用SELECT * : 绝大多数情况下,不要用 * 来代替查询返回的字段列表,用 * 的好处是代码量少、就算是表结构或视图的列发生变化,编写的查询SQL语句也不用变,都返回所有的字段。但数据库服务器在解析时,如果碰到 *,则会先分析表的结构,然后把表的所有字段名再罗列出来。这就增加了分析的时间。 4 慎用SELECT DISTINCT: DISTINCT子句仅在特定功能的时候使用,即从记录集中排除重复记录的时候。这是因为DISTINCT子句先获取结果集然后去重,这样增加SQLServer有用资源的使用。当然,如果你需要去做,那就只有去做了。 当如果你知道SELECT语句将从不返回重复记录,那么使用DISTINCT语句对SQLServer资源不必要的浪费。 5 少用游标: 任何一种游标都会降低SQLServer性能。有些情况不能避免,大多数情况可以避免。所以如果你的应用程序目前正在使用TSQL游标,看看这些代码是否能够重写以避免它们。如果你需要一行一行的执行操作,考虑下边这些选项中的一个或多个来代替游标的使用: 使用临时表 使用WHILE循环 使用派生表 使用相关子查询 使用CASE语句 使用多个查询 上面每一个都能取代游标并且执行更快。 如果你不能避免使用游标,至少试着提高它们的速度,找出加速游标的方法。 6 选择最有效率的表名顺序: SQLSERVER的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包含多个表的情况下,必须选择记录条数最少的表作为基础表,当SQLSERVER处理多个表时,会运用排序及合并的方式连接它们。首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行排序;然后扫描第二个表(FROM子句中最后第二个表);最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并。 例如: 表 TAB1有 16384 条记录,表 TAB2 有5条记录,选择TAB2作为基础表 (最好的方法): select count(*) from TAB1 a, TAB2 b 选择TAB1作为基础表 (不佳的方法): select count(*) from TAB2 a, TAB1 b 如果有3个以上的表连接查询,那就需要选择交叉表(intersection table)作为基础表,交叉表是指那个被其他表所引用的表。 7 使用表的别名(Alias): 当在SQL语句中连接多个表时,请使用表的别名并把别名前缀于每个Column上,这样可以减少解析的时间并减少那些由Column歧义引起的语法错误。 8 SARG你的WHERE条件: ARGE来源于"Search Argument"(搜索参数)的首字母拼成的"SARG",它是指WHERE子句里,列和常量的比较。如果WHERE子句是sargable(可SARG的),这意味着它能利用索引加速查询的完成。如果WHERE子句不是可SARG的,这意味着WHERE子句不能利用索引(或至少部分不能利用),执行的是全表或索引扫描,这会引起查询的性能下降。 在WHERE子句里不可SARG的搜索条件如"IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE"和"LIKE '%500'",通常(但不总是)会阻止查询优

02
您找到你想要的搜索结果了吗?
是的
没有找到

技术阅读-《MySQL 必知必会》

第一章 了解SQL第二章 MySQL 介绍第三章 使用 MySQL第四章 检索数据第五章 排序检索数据第六章 过滤数据第七章 数据过滤第八章 通配符过滤第九章 正则搜索第十章 创建计算字段第十一章 数据处理函数第十二章 汇总数据第十三章 数据分组第十四章 使用子查询第十五章 联结表第十六章 高级联结第十七章 组合查询第十八章 全文本搜索第十九章 插入数据第二十章 更新和删除数据第二十一章 表的增删改第二十二章 视图第二十三章 存储过程第二十四章 游标第二十五章 使用触发器第二十六章 事务处理第二十七章 全球化和本地化第二十八章 安全管理第二十九 数据库维护第三十章 改善性能

02

T-SQL学习笔记(索引贴)

没有涉及高级话题 适合有一点T-SQL知识 但想深入了解T-SQL的人看 我觉得例子有很大的借鉴意义 如果对哪篇文章有疑问, 可以在文章下留言 我会尽快回复的 真诚的希望能和朋友们讨论也希望高人多批评 一:简单的语法知识   1:定义变量给变量赋值   2:if和else    3:begin和end    4:两种case语句   5:循环   http://www.cnblogs.com/liulun/articles/1359567.html 二:简单的增 删 改 查和一些相关子句    1:update    2:insert    3:select    4:delete    5:where子句   6:order by子句   7:distinct关键字   8:group by 聚集函数 和 having子句   http://www.cnblogs.com/liulun/articles/1343417.html 三:复杂一点的查询   1:inner join    2:outer join    3:full join cross join    4:union    5:子查询返回单个值   6:子查询返回多个值   7:any some 和 all    8:外部查询和内部查询   9:派生表   http://www.cnblogs.com/liulun/articles/1346166.html 四:约束   1:类型   2:命名   3:主键约束   4:外键约束   5:unique约束   6:check约束   7:default约束   8:禁用约束   9:规则   10:默认值   http://www.cnblogs.com/liulun/articles/1343466.html 五:create drop alter    1:create    2:drop    3:alter    http://www.cnblogs.com/liulun/articles/1343451.html 六:视图   1:创建视图   2:删除和修改视图   3:视图加密   http://www.cnblogs.com/liulun/articles/1373449.html 七:存储过程与用户自定义函数   1:存储过程的简单创建\修改与删除   2:存储过程的输入参数和输出参数   3:用户定义函数   http://www.cnblogs.com/liulun/articles/1362542.html 八:触发器   1:什么是触发器   2:一个简单的触发器   3:针对触发器的相关操作   4:使用触发器记录操作情况   5:视图上的触发器   6:触发器相关函数   http://www.cnblogs.com/liulun/articles/1372964.html 九:全文索引   1:简要介绍全文索引   2:全文索引的相关操作   3:全文目录的相关操作   4:全文查询语法   5:综合实例   http://www.cnblogs.com/liulun/articles/1368655.html 十:游标   1:什么是游标   2:创建一个简单的游标   3:游标的作用域   4:游标的滚动   5:静态游标   6:键驱动的游标   7:动态游标   http://www.cnblogs.com/liulun/articles/1373352.html 附件: T-SQL中常用的函数 http://www.cnblogs.com/liulun/articles/1346212.html T-SQL学习笔记CHM版 https://files.cnblogs.com/liulun/T-SQL学习笔记.rar

01
领券