首页
学习
活动
专区
工具
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

    我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务。 项目背景 这是给某数据中心做的一个项目,项目难度之大令人发指,这个项目真正的让我感觉到了,商场如战场,而我只是其中的一个小兵,太多的战术,太多的高层之间的较量,太多的内幕了。具体这个项目的情况,我有空再写相关的博文出来。 这个项目是要求做环境监控,我们暂且把受监控的设备称为采集设备,采集设备的属性称为监控指标

    013

    PET SHOP 4.0 初学者分析(项目分解)

    我一共把系统分了五大块,最后一块命名为"其他", 缓存依赖相关 CacheDependencyFactory    缓存依赖类的工厂类  ICacheDependency             缓存依赖类接口  TableCacheDependency      缓存依赖实现类 数据相关 DALFactory                        数据层的抽象工厂  IDAL                                 数据访问层接口定义  SQLServerDAL                   SQLServer数据访问层  OracleDAL                         Oracle数据访问层  DBUtility                            数据库访问组件基础类 消息相关 IBLLStrategy                     同步/异步处理策略接口(实现在bll根据配置反射选择)  MessagingFactory              异时处理消息队列的抽象工厂  IMessaging                       异时处理消息队列接口定义  MSMQMessaging                异时处理消息队列的实现 OrderProcessor                 后台处理进程,处理订单队列 profile相关 Profile                          Profile的数据访问层  ProfileDALFactory          ProfileDAL的工厂类(反射创建ProfileDAL)  IProfileDAL                   Profile的数据访问层接口定义  OracleProfileDAL           Oracle的Profile Providers 做用户状态管理  SQLProfileDAL              SQL Server 的Profile Providers 做用户状态管理 其他 Membership                 Membership认证和授权管理  WEB                           表示层  Model                          业务实体  BLL                             业务逻辑层 下面解释一下各个大块的作用 1.缓存依赖相关 缓存依赖在petshop4.0中就是把页面输出缓存和数据库中的表关联起来,如果数据库中的表有任何改动的话,缓存失效。 缓存的作用就相当大了,再加上个缓存依赖作用就相当“暴力”了。具体强到哪里,等我以后分析了这块就明白了 2.profile相关 有个前辈在介绍profile的时候说:以人为本的profile.作用是让用户可以做一些个性化的选择.比如让用户选择所喜欢的网站风格,让用户选择是否弹出消息提醒等, 在petshop4.0中主要是记录用户的购物车信息和意向清单. profile设置分为针对登陆用户和非登陆用户的.具体的设置办法将在后面分析 3.消息相关 消息队列在企业级应用程序中非常多见,以petshop4.0为例,消息队列的好处 1.如果后台订单数据库出现故障,订单就全部插入到消息队列当中,等数据库恢复之后立即处理他们. 2.因为涉及到windows控制台程序,所以多线程处理订单,就非常容易搞定 3.因为是异步,所以对系统的性能有很大提升 消息相关这一块我准备放在最后来讲 数据访问层和其他的就先不说了还是看下面的分块分析吧

    01
    领券