首页 »数据库 » sql查询分析器:SQL查询慢的48个原因分析 »正文
sql查询分析器:SQL查询慢的48个原因分析
来源: 发布时间:星期二, 2009年9月8日 浏览:98次 评论:0
工作小 编写 质量高 并且执行 速度快![](/icons/83249dou2.gif)
28、如果要插入大 2进制值到Image列 使用存储过程 千万不要用内嵌INsert来插入(不知JAVA是否)![](/icons/83249dou2.gif) 这样应用 首先将 2进制值转换成 串(尺寸是它 两倍) 服务器受到 后又将他转换成 2进制值.存储过程就没有这些动作: 思路方法:Create procedure p_insert as insert o table(Fimage) values (@image), 在前台 这个存储过程传入 2进制参数 这样处理速度明显改善![](/icons/83249dou2.gif)
29、Between在某些时候比IN速度更快,Between能够更快地根据索引找到范围 用查询优化器可见到差别 select * from chineseresume where title in ('男','女') Select * from chineseresume where between '男' and '女' 是 样![](/icons/83249de.gif) 由于in会在比较多次 所以有时会慢些![](/icons/83249dou2.gif)
30、在必要是对全局或者局部临时表创建索引 有时能够提高速度 但不是 定会这样![](/icons/83249dou.gif) 索引也耗费大量 资源 他 创建同是实际表 样![](/icons/83249dou2.gif)
31、不要建没有作用 事物例如产生报表时 浪费资源 只有在必要使用事物时使用它![](/icons/83249dou2.gif)
32、用OR 字句可以分解成多个查询 并且通过UNION 连接多个查询 他们 速度只同是否使用索引有关,如果查询需要用到联合索引 用UNION all执行 效率更高.多个OR 字句没有用到索引 改写成UNION 形式再试图和索引匹配![](/icons/83249dou2.gif) 个关键 问题是否用到索引![](/icons/83249dou2.gif)
33、尽量少用视图 它 效率低 对视图操作比直接对表操作慢,可以用stored procedure来代替她 特别 是不要用视图嵌套,嵌套视图增加了寻找原始资料 难度 我们看视图 本质:它是存放在服务器上 被优化好了 已经产生了查询规划 SQL 对单个表检索数据时 不要使用指向多个表 视图 直接从表检索或者仅仅包含这个表 视图上读 否则增加了不必要 开销,查询受到干扰.为了加快视图 查询 MsSQL增加了视图索引 功能![](/icons/83249dou2.gif)
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后面值 列表中 将出现最频繁 值放在最前面 出现得最少 放在最后面 减少判断 次数![](/icons/83249dou2.gif)
36、当用SELECT INTO时 它会锁住系统表(sysobjects sysindexes等等) 阻塞其他 连接 存取 创建临时表时用显示申明语句 而不是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 也会锁系统表(不管是临时表还是系统表) 所以千万不要在事物内使用它!!!这样 话如果是经常要用 临时表请使用实表 或者临时表变量![](/icons/83249dou2.gif)
=top11>
37、 般在GROUP BY 个HAVING字句的前就能剔除多余 行 所以尽量不要用它们来做剔除行 工作 他们 执行顺序应该如下最优:select Where字句选择所有合适 行 Group By用来分组个统计行 Having字句用来剔除多余 分组 这样Group By 个Having 开销小 查询快.对于大 数据行进行分组和Having十分消耗资源 如果Group BY 目 不包括计算 只是分组 那么用Distinct更快
38、 次更新多条记录比分多次更新每次 条快,就是说批处理好
39、少用临时表 尽量用结果集和Table类性 变量来代替它,Table 类型 变量比临时表好
40、在SQL2000下 计算字段是可以索引![](/icons/83249de.gif) 需要满足 条件如下:
a、计算字段 表达是确定![](/icons/83249de.gif)
b、不能用在
TEXT,Ntext Image数据类型
c、必须配制如下选项 ANSI_NULLS = _disibledevent=> 41、尽量将数据 处理工作放在服务器上 减少网络 开销 如使用存储过程 存储过程是编译好、优化过、并且被组织到 个执行规划里、且存储在数据库中 SQL语句 是控制流语言 集合 速度当然快 反复执行 动态SQL,可以使用临时存储过程 该过程(临时表)被放在Tempdb中 以前由于SQL SERVER对复杂 数学计算不支持 所以不得不将这个工作放在其他 层上而增加网络 开销 SQL2000支持UDFs,现在支持复杂 数学计算![](/icons/83249dou.gif) ![](/icons/83249hanshu.gif) 返回值不要太大 这样 开销很大 用户自定义 象光标 样执行 消耗大量 资源 如果返回大 结果采用存储过程
42、不要在 句话里再 3 使用相同![](/icons/83249de.gif) ![](/icons/83249hanshu.gif) 浪费资源,将结果放在变量里再 更快
43、SELECT COUNT(*) 效率教低 尽量变通他 写法 而EXISTS快.同时请注意区别: select count(Field of null) from Table 和 select count(Field of NOT null) from Table 返回值是区别 !!!
44、当服务器 内存够多时 配制线程数量 = 最大连接数+5 这样能发挥最大 效率;否则使用 配制线程数量<最大连接数启用SQL SERVER 线程池来解决,如果还是数量 = 最大连接数+5 严重 损害服务器 性能![](/icons/83249dou2.gif)
45、按照 定 次序来访问你 表 如果你先锁住表A 再锁住表B 那么在所有 存储过程中都要按照这个顺序来锁定它们 如果你(不经意 )某个存储过程中先锁定表B 再锁定表A 这可能就会导致 个死锁 如果锁定顺序没有被预先详细 设计好 死锁很难被发现
46、通过SQL Server Performance Monitor监视相应硬件 负载 Memory: Page Faults / sec计数器如果该值偶尔走高 表明当时有线程竞争内存 如果持续很高 则内存可能是瓶颈 Process:
1、% DPC Time 指在范例间隔期间处理器用在缓延![](/icons/83249chengxu.gif) (DPC)接收和提供服务 百分比 (DPC 正在运行 为比标准间隔优先权低 间隔) 由于 DPC 是以特权模式执行![](/icons/83249de.gif) DPC 时间 百分比为特权时间 百分比![](/icons/83249de.gif) 部分 这些时间单独计算并且不属于间隔计算总数![](/icons/83249de.gif) 部 分 这个总数显示了作为例子时间百分比 平均忙时![](/icons/83249dou2.gif)
2、%Processor Time计数器 如果该参数值持续超过95% 表明瓶颈是CPU 可以考虑增加 个处理器或换 个更快 处理器![](/icons/83249dou2.gif)
3、% Privileged Time 指非闲置处理器时间用于特权模式 百分比 (特权模式是为操作系统组件和操纵硬件驱动 而设计![](/icons/83249de.gif) 种处理模式 它允许直接访问硬件和所有内存 另 种模式为用户模式 它是 种为应用 、环境分系统和整数分系统设计![](/icons/83249de.gif) 种有限处理模式 操作系统将应用 线程转换成特权模式以访问操作系统服务) 特权时间 % 包括为间断和 DPC 提供服务 时间 特权时间比率高可能是由于失败设备产生 大数量 间隔而引起![](/icons/83249de.gif) 这个计数器将平均忙时作为样本时间![](/icons/83249de.gif) 部分显示![](/icons/83249dou2.gif)
4、% User Time表示耗费CPU 数据库操作 如排序 执行aggregate functions等 如果该值很高 可考虑增加索引 尽量使用简单 表联接 水平分割大表格等思路方法来降低该值 Physical Disk: Curretn Disk Queue Length计数器该值应不超过磁盘数 1.5~2倍 要提高性能 可增加磁盘 SQLServer:Cache Hit Ratio计数器该值越高越好 如果持续低于80% 应考虑增加内存 注意该参数值是从SQL Server启动后 就 直累加记数 所以运行经过 段时间后 该值将不能反映系统当前值![](/icons/83249dou2.gif)
47、分析select emp_name form employee where salary >
3000 在此语句中若salary是Float类型![](/icons/83249de.gif) 则优化器对其进行优化为Convert(float,3000)![](/icons/83249dou.gif) 3000是个整数 我们应在编程时使用3000.0而不要等运行时让DBMS进行转化 同样 和整型数据 转换![](/icons/83249dou2.gif)
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
查询
相关文章
读者评论
发表评论
|
|