zoukankan      html  css  js  c++  java
  • sql 查询慢的48个原因分析

     
    1. sql 查询慢的48个原因分析。  
    2.   
    3.  server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。  
    4.   
    5.  字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作,还不能并行处理。  
    6.   
    7. likeindex  使用索引   不使用索引用   查询时,查询耗时和字段值总长度成正比,所以不能用类型,而是。对于字段的值很长的建全文索引。  
    8.   
    9. )  
    10.   
    11. Commitrollback:回滚所有的事物。 :提交当前的事物. 没有必要在动态SQL里写事物,如果要写请写在外面如:  tran (@s)  trans 或者将动态SQL 写成函数或者存储过程。  
    12.   
    13. SelectWhere byTableCase  是唯一允许的提取操作,也是默认方式。可滚动性 可以在游标中任何地方随机提取任意行。游标的技术在SQL2000下变得功能很强大,他的目的是支持循环。有四个并发选项 READ_ONLY:不允许通过游标定位更新(),且在组成结果集的行中没有锁。 OPTIMISTIC  :乐观并发控制是事务控制理论的一个标准部分。乐观并发控制用于这样的情形,即在打开游标及更新行的间隔中,只有很小的机会让第二个用户更新某一行。当某个游标以此选项打开时,没有锁控制其中的行,这将有助于最大化其处理能力。  
    14.   
    15.  ROW VERSIONING:此乐观并发控制选项基于行版本控制。使用行版本控制,其中的表必须具有某种版本标识符,服务器可用它来确定该行在读入游标后是否有所更改。在 SQL Server 中,这个性能由  数据类型提供,它是一个二进制数字,表示数据库中更改的相对顺序。每个数据库都有一个全局当前时间戳值:@@DBTS。每次以任何方式更改带有  列的行时,SQL Server 先在时间戳列中存储当前的 @@DBTS 值,然后增加 @@DBTS 的值。如果某 个表具有  列,则时间戳会被记到行级。服务器就可以比较某行的当前时间戳值和上次提取时所存储的时间戳值,从而确定该行是否已更新。服务器不必比较所有列的值,只需比较  列即可。如果应用程序对没有  列的表要求基于行版本控制的乐观并发,则游标默认为基于数值的乐观并发控制。  LOCKS 这个选项实现悲观并发控制。在悲观并发控制中,在把数据库的行读入游标结果集时,应用程序将试图锁定数据库行。在使用服务器游标时,将行读入游标时会在其上放置一个更新锁。如果在事务内打开游标,则该事务更新锁将一直保持到事务被提交或回滚;当提取下一行时,将除去游标锁。如果在事务外打开游标,则提取下一行时,锁就被丢弃。因此,每当用户需要完全的悲观并发控制时,游标都应在事务内打开。更新锁将阻止任何其它任务获取更新锁或排它锁,从而阻止其它任务更新该行。然而,更新锁并不阻止共享锁,所以它不会阻止其它任务读取行,除非第二个任务也在要求带更新锁的读取。滚动锁根据在游标定义的  语句中指定的锁提示,这些游标并发选项可以生成滚动锁。滚动锁在提取时在每行上获取,并保持到下次提取或者游标关闭,以先发生者为准。下次提取时,服务器为新提取中的行获取滚动锁,并释放上次提取中行的滚动锁。滚动锁独立于事务锁,并可以保持到一个提交或回滚操作之后。如果提交时关闭游标的选项为关,则  语句并不关闭任何打开的游标,而且滚动锁被保留到提交之后,以维护对所提取数据的隔离。所获取滚动锁的类型取决于游标并发选项和游标  语句中的锁提示。锁提示 只读 乐观数值 乐观行版本控制 锁定无提示 未锁定 未锁定 未锁定 更新 NOLOCK 未锁定 未锁定 未锁定 未锁定 HOLDLOCK 共享 共享 共享 更新 UPDLOCK 错误 更新 更新 更新 TABLOCKX 错误 未锁定 未锁定 更新其它 未锁定 未锁定 未锁定 更新 *指定 NOLOCK 提示将使指定了该提示的表在游标内是只读的。  
    16. UNionUNion 的区别。 好  
    17. DISTINCTUNION 或者 QUERY_GOVERNOR_COST_LIMIT来限制查询消耗的资源。当评估查询消耗的资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。 LOCKTIME设置锁的时间  
    18. select 100 / 10 Percent 来限制用户返回的行数或者 ROWCOUNT来限制操作的行  
    19.  WHereConvertsubstringWHERE(firstname,1,1) = 改为 firstname  (索引扫描),一定要将函数和列名分开。并且索引不能建得太多和太大。 会多次扫描表,使用EXISTS、 EXISTS , ,    来替代,特别是左连接,而Exists比更快,最慢的是操作.如果列的值含有空,以前它的索引不起作用,现在2000的优化器能够处理了。相同的是 ,“", " EXISTS "能优化她,而”<>”等还是不能优化,用不到索引。  
    20. INOR *  PersonMember ( = IX_Title)  processid  (‘男)  
    21. SELECT MIN()能使用到合适的索引。  
    22.   
    23. Default(约束如外健主健CheckUNIQUE……,数据类型的最大长度等等都是约束),.这样不仅维护工作小,编写程序质量高,并且执行的速度快。  
    24.   
    25. INsert  p_insert    (Fimage)  (@image), 在前台调用这个存储过程传入二进制参数,这样处理速度明显改善。  
    26.   
    27. BetweenINBetween *  chineseresume  title  (, *  chineseresume      是一样的。由于会在比较多次,所以有时会慢些。  
    28.   
    29. ORUNION 执行的效率更高.多个的字句没有用到索引,改写成的形式再试图与索引匹配。一个关键的问题是否用到索引。  
    30.   
    31. 来代替她。特别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质:它是存放在服务器上的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时,不要使用指向多个表的视图,直接从表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。  
    32.   
    33. DISTINCTORDER,这些动作可以改在客户端执行。它们增加了额外的开销。这同 和 一样的道理。   20 ad.companyname,comid,position,ad.referenceid,worklocation, ((10),ad.postDate,120)  postDate1,workyear,degreedescription  jobcn_query.dbo.COMPANYAD_query ad  referenceID (,,,,,,,,,,,,,,,,  postdate   
    34.   
    35. IN SELECT时,它会锁住系统表(sysobjects,sysindexes等等),阻塞其他的连接的存取。创建临时表时用显示申明语句,而不是   t_lxh  tran  *  t_lxh  chineseresume   =    
    36.   
    37. GROUP 个字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优: 的字句选择所有合适的行, 用来分组个统计行,字句用来剔除多余的分组。这样  个的开销小,查询快.对于大的数据行进行分组和十分消耗资源。如果 的目的不包括计算,只是分组,那么用更快  
    38. 38、一次更新多条记录比分多次更新每次一条快,就是说批处理好  
    39. TableTable , ANSI_PADDINGS = , …….  
    40. SELECT(*)的效率教低,尽量变通他的写法,而EXISTS快.同时请注意区别:  (Field    和  (Field     的返回值是不同的!!!  
    41.  指在范例间隔期间处理器用在缓延程序调用(DPC)接收和提供服务的百分比。(DPC 正在运行的为比标准间隔优先权低的间隔)。 由于 DPC 是以特权模式执行的,DPC 时间的百分比为特权时间 百分比的一部分。这些时间单独计算并且不属于间隔计算总数的一部 分。这个总数显示了作为实例时间百分比的平均忙时。  
    42. 计数器 如果该参数值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。  
    43.  指非闲置处理器时间用于特权模式的百分比。(特权模式是为操作系统组件和操纵硬件驱动程序而设计的一种处理模式。它允许直接访问硬件和所有内存。另一种模式为用户模式,它是一种为应用程序、环境分系统和整数分系统设计的一种有限处理模式。操作系统将应用程序线程转换成特权模式以访问操作系统服务)。 特权时间的 % 包括为间断和 DPC 提供服务的时间。特权时间比率高可能是由于失败设备产生的大数量的间隔而引起的。这个计数器将平均忙时作为样本时间的一部分显示。  
    44.  表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。 Physical Disk: Curretn Disk Queue Length计数器该值应不超过磁盘数的1.5~2倍。要提高性能,可增加磁盘。 SQLServer:Cache Hit Ratio计数器该值越高越好。如果持续低于80%,应考虑增加内存。 注意该参数值是从SQL Server启动后,就一直累加记数,所以运行经过一段时间后,该值将不能反映系统当前值。  
    45. select salary > 3000 在此语句中若salary是类型的,则优化器对其进行优化为(,3000),因为3000是个整数,我们应在编程时使用3000.0而不要等运行时让DBMS进行转化。同样字符和整型数据的转换。  
    46.  a.personMemberID, *  chineseresume a,personmember b  personMemberID = b.referenceid  a.personMemberID =  (A = B ,B = ‘号码JCNPRH39681JCNPRH39681, A = ‘号码JCNPRH39681JCNPRH39681, A = ‘号码')  
  • 相关阅读:
    terminator shortcut
    支付宝集成错误
    null与DBNULL
    linode接连出问题,我也没看懂英文
    ruby 日期 好函数
    ruby datetime
    act as tree插件
    ruby 时间
    ruby规则引擎
    on ,type等关键词,使用
  • 原文地址:https://www.cnblogs.com/lcword/p/8243670.html
Copyright © 2011-2022 走看看