专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » sql查询分析器:SQL查询慢的48个原因分析 »正文

sql查询分析器:SQL查询慢的48个原因分析

来源: 发布时间:星期二, 2009年9月8日 浏览:98次 评论:0
工作小编写质量高并且执行速度快

  28、如果要插入大 2进制值到Image列使用存储过程千万不要用内嵌INsert来插入(不知JAVA是否)这样应用首先将 2进制值转换成串(尺寸是它两倍)服务器受到后又将他转换成 2进制值.存储过程就没有这些动作: 思路方法:Create procedure p_insert as insert o table(Fimage) values (@image), 在前台这个存储过程传入 2进制参数这样处理速度明显改善

  29、Between在某些时候比IN速度更快,Between能够更快地根据索引找到范围用查询优化器可见到差别 select * from chineseresume where title in ('男','女') Select * from chineseresume where between '男' and '女' 是由于in会在比较多次所以有时会慢些

  30、在必要是对全局或者局部临时表创建索引有时能够提高速度但不是定会这样索引也耗费大量资源创建同是实际表

  31、不要建没有作用事物例如产生报表时浪费资源只有在必要使用事物时使用它

  32、用OR字句可以分解成多个查询并且通过UNION 连接多个查询他们速度只同是否使用索引有关,如果查询需要用到联合索引用UNION all执行效率更高.多个OR字句没有用到索引改写成UNION形式再试图和索引匹配个关键问题是否用到索引

  33、尽量少用视图效率低对视图操作比直接对表操作慢,可以用stored procedure来代替她特别是不要用视图嵌套,嵌套视图增加了寻找原始资料难度我们看视图本质:它是存放在服务器上被优化好了已经产生了查询规划SQL对单个表检索数据时不要使用指向多个表视图直接从表检索或者仅仅包含这个表视图上读否则增加了不必要开销,查询受到干扰.为了加快视图查询MsSQL增加了视图索引功能

  34、没有必要时不要用DISTINCT和ORDER BY这些动作可以改在客户端执行它们增加了额外开销这同UNION 和UNION ALL道理 SELECT top 20 ad.companyname,comid,position,ad.referenceid,worklocation, convert(varchar(10),ad.postDate,120) as postDate1,workyear,degreedescription FROM jobcn_query.dbo.COMPANYAD_query ad where referenceID in('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345','JCNAD00333138','JCNAD00303570', 'JCNAD00303569','JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933','JCNAD00254567', 'JCNAD00254585','JCNAD00254608','JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618', 'JCNAD00279196','JCNAD00268613') order by postdate desc

  35、在IN后面值列表中将出现最频繁值放在最前面出现得最少放在最后面减少判断次数

  36、当用SELECT INTO时它会锁住系统表(sysobjectssysindexes等等)阻塞其他连接存取创建临时表时用显示申明语句而不是select INTO. drop table t_lxh begin tran select * o t_lxh from chineseresume where name = 'XYZ' --commit 在另个连接中SELECT * from sysobjects可以看到 SELECT INTO 会锁住系统表Create table 也会锁系统表(不管是临时表还是系统表)所以千万不要在事物内使用它!!!这样话如果是经常要用临时表请使用实表或者临时表变量

=top11>



  37、般在GROUP BY 个HAVING字句的前就能剔除多余所以尽量不要用它们来做剔除行工作他们执行顺序应该如下最优:select Where字句选择所有合适Group By用来分组个统计行Having字句用来剔除多余分组这样Group By 个Having开销小查询快.对于大数据行进行分组和Having十分消耗资源如果Group BY不包括计算只是分组那么用Distinct更快

38、次更新多条记录比分多次更新每次条快,就是说批处理好

  39、少用临时表尽量用结果集和Table类性变量来代替它,Table 类型变量比临时表好

  40、在SQL2000下计算字段是可以索引需要满足条件如下:

  a、计算字段表达是确定

  b、不能用在

TEXT,NtextImage数据类型

  c、必须配制如下选项 ANSI_NULLS = _disibledevent=>  41、尽量将数据处理工作放在服务器上减少网络开销如使用存储过程存储过程是编译好、优化过、并且被组织到个执行规划里、且存储在数据库中SQL语句是控制流语言集合速度当然快反复执行动态SQL,可以使用临时存储过程该过程(临时表)被放在Tempdb中以前由于SQL SERVER对复杂数学计算不支持所以不得不将这个工作放在其他层上而增加网络开销SQL2000支持UDFs,现在支持复杂数学计算返回值不要太大这样开销很大用户自定义象光标样执行消耗大量资源如果返回大结果采用存储过程

  42、不要在句话里再 3使用相同浪费资源,将结果放在变量里再更快

  43、SELECT COUNT(*)效率教低尽量变通他写法而EXISTS快.同时请注意区别: select count(Field of null) from Table 和 select count(Field of NOT null) from Table 返回值是区别!!!

  44、当服务器内存够多时配制线程数量 = 最大连接数+5这样能发挥最大效率;否则使用 配制线程数量<最大连接数启用SQL SERVER线程池来解决,如果还是数量 = 最大连接数+5严重损害服务器性能

  45、按照次序来访问你如果你先锁住表A再锁住表B那么在所有存储过程中都要按照这个顺序来锁定它们如果你(不经意)某个存储过程中先锁定表B再锁定表A这可能就会导致个死锁如果锁定顺序没有被预先详细设计好死锁很难被发现

  46、通过SQL Server Performance Monitor监视相应硬件负载 Memory: Page Faults / sec计数器如果该值偶尔走高表明当时有线程竞争内存如果持续很高则内存可能是瓶颈 Process:

  1、% DPC Time 指在范例间隔期间处理器用在缓延(DPC)接收和提供服务百分比(DPC 正在运行为比标准间隔优先权低间隔) 由于 DPC 是以特权模式执行DPC 时间百分比为特权时间 百分比部分这些时间单独计算并且不属于间隔计算总数部 分这个总数显示了作为例子时间百分比平均忙时

  2、%Processor Time计数器 如果该参数值持续超过95%表明瓶颈是CPU可以考虑增加个处理器或换个更快处理器

  3、% Privileged Time 指非闲置处理器时间用于特权模式百分比(特权模式是为操作系统组件和操纵硬件驱动而设计种处理模式它允许直接访问硬件和所有内存种模式为用户模式它是种为应用、环境分系统和整数分系统设计种有限处理模式操作系统将应用线程转换成特权模式以访问操作系统服务) 特权时间 % 包括为间断和 DPC 提供服务时间特权时间比率高可能是由于失败设备产生大数量间隔而引起这个计数器将平均忙时作为样本时间部分显示

  4、% User Time表示耗费CPU数据库操作如排序执行aggregate functions等如果该值很高可考虑增加索引尽量使用简单表联接水平分割大表格等思路方法来降低该值 Physical Disk: Curretn Disk Queue Length计数器该值应不超过磁盘数1.5~2倍要提高性能可增加磁盘 SQLServer:Cache Hit Ratio计数器该值越高越好如果持续低于80%应考虑增加内存 注意该参数值是从SQL Server启动后直累加记数所以运行经过段时间后该值将不能反映系统当前值

  47、分析select emp_name form employee where salary >

3000 在此语句中若salary是Float类型则优化器对其进行优化为Convert(float,3000)3000是个整数我们应在编程时使用3000.0而不要等运行时让DBMS进行转化同样和整型数据转换

  48、查询关联同写顺序 select a.personMemberID, * from chineseresume a,personmember b where personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' (A = B ,B = ‘号码') select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681' (A = B ,B = ‘号码' A = ‘号码') select a.personMemberID, * from chineseresume a,personmember b where b.referenceid = 'JCNPRH39681' and a.personMemberID = 'JCNPRH39681' (B = ‘号码' A = ‘号码') TAG: SQL sql 查询


0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: