SQL查詢語句中,用肉眼怎么分析SQL語句的查詢快慢
 那位高手能幫忙下在線等謝謝
   

解决方案 »

  1.   

    看看SQL优化的语句 对上即可!
      

  2.   

    set statistics time on 
      

  3.   

    可以使用SQL自带的执行计划!
      

  4.   

    select 语句后尽量用字段名不用*
    用where代替having
    多用别名
    多用系统自带内部函数
      

  5.   

    按CTRL+L -》自带的执行计划!
      

  6.   

    例句1:SELECT a.pl_id,a.pl_license,a.pp_id,a.pp_name,a.pl_num,a.pl_lock,ple.ple_name,ple.ple_time,ple.ple_register from  (SELECT pl.pl_id,pl.pl_license,pl.pp_id,pp.pp_name,pl.pl_num,pl.pl_lock from pay_license pl INNER JOIN pay_product pp ON pp.pp_id = pl.pp_id  WHERE 1   AND pp.pp_type = 'ENT') a left JOIN pay_license_ent ple ON ple.pl_id = a.pl_id  order by ple.ple_time desc 例句2:SELECT pl.pl_id,pl.pl_license,pp.pp_id,pp.pp_name,pl.pl_num,pl.pl_lock,ple.ple_name,ple.ple_time,ple.ple_register FROM pay_license pl INNER JOIN pay_product  pp ON pp.pp_id = pl.pp_id left JOIN  pay_license_ent ple ON ple.pl_id = pl.pl_id  WHERE 1   AND pp.pp_type = 'ENT'  order by ple.ple_time desc如以上2個例句,表pay_license中有40W條記錄。。表pay_license_ent和表pay_product 中分別都有100條記錄檔不用查詢分析器的時候,用肉眼怎么判斷這兩句SQL的執行速度。
      

  7.   

    按CTRL+L -》自带的执行计划!这样可以看一下!!
    楼主的那两条语句好像一样啊,
    那个只是先将前两个连接,再与后一个连接,
    后面那条就是连接!!
      

  8.   

    当把SQL语句优化做的很熟练的时候   一看就知道语句哪里可以改进了
      

  9.   

    我用肉眼发现,
    LZ给的句子有语法错误:...where 1 AND ...
      

  10.   

    1. 例句1写法不地道,那个子查询没有必要,理论上肯定比例句2效率低。2. order by子句也可能比较耗时,并影响索引的使用,你可以把它去掉再比较下。3. 由于pay_license_ent和pay_product 两个表数据量很小,可以考虑先联这两个表。--try:
    SELECT pl.pl_id,pl.pl_license,pp.pp_id,pp.pp_name,pl.pl_num,pl.pl_lock
    ,ple.ple_name,ple.ple_time,ple.ple_register 
    FROM pay_product  pp 
    left JOIN  pay_license_ent ple ON ple.pl_id = pl.pl_id   
    INNER JOIN  pay_license pl ON pp.pp_id = pl.pp_id 
    WHERE pp.pp_type = 'ENT'  
    order by ple.ple_time desc 
      

  11.   

    其實2個句子執行起來都沒錯誤的
    例句1:
    SELECT a.pl_id,a.pl_license,a.pp_id,a.pp_name,a.pl_num,a.pl_lock,ple.ple_name,ple.ple_time,ple.ple_register from  (SELECT pl.pl_id,pl.pl_license,pl.pp_id,pp.pp_name,pl.pl_num,pl.pl_lock from pay_license pl INNER JOIN pay_product pp ON pp.pp_id = pl.pp_id  WHERE 1  AND pp.pp_type = 'ENT' limit 0,10) a left JOIN pay_license_ent ple ON ple.pl_id = a.pl_id  order by ple.ple_time desc 這樣執行起來比例句2效率要高很多我現在想要的結果是 當我不執行例句1和例句2,只是單單的靠肉眼分析的話,時候能判斷出什麽的語句快什麽樣的語句慢
      

  12.   

    看连接,left join 肯定没 inner join 效率高!
      

  13.   

    set statistics time on
    set statistics io on
    ==
    +执行计划
      

  14.   


    問題是現在這邊只能用 left join 
      

  15.   

    我感觉Oracle中用IN 查询比较慢,或着是子查询,我们现在规定不让用IN 与过多的子查询了
      

  16.   

    如果只能用left join那就不考虑性能问题了咯
      

  17.   

    在执行SQL访问操作前后设定时间,获得时间差
      

  18.   

    针对情况不同采取不同的方式,在数据比较少时有索引就不见得快,还有就是子查询在执行按条件进行筛选数据时,要比连接查询时要好得多的。如果还有其他的个人看法,希望各位也能及时通知我,Thank you。
      

  19.   

    可以使用SQL执行计划,分析SQL语句执行的情况。
    多多的了解一些SQL语句优化的知识,在日常的开发中很重要。
      

  20.   

    看执行计划啊。MySQL和MS SQLServer都有这个功能吧。是Oracle的话,用这个命令打开执行计划查看功能。在使用之前可能你要初始化环境;如果不会,联系你的DBA;再不行,你就Google吧。set autotrace on
    下面是一个例子12:40:13 SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss' ) nowNOW
    -------------------
    2009-07-03 12:40:46已用时间:  00: 00: 00.00Execution Plan
    ----------------------------------------------------------
       0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=2 Card=1)
       1    0   FAST DUAL (Cost=2 Card=1)
    Statistics
    ----------------------------------------------------------
              1  recursive calls
              0  db block gets
              0  consistent gets
              0  physical reads
              0  redo size
            238  bytes sent via SQL*Net to client
            277  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed12:40:46 SQL>
      

  21.   

    以下几种99.99%的能用性, 特殊情况下可能会有例外嘛1. 一看见带 not in的语句, 就知道慢
    2. 一看见带 cursor的游标就知道占用资源, 速度自然不快
    3. 一看见一个语句用了三层以上的子查询就知道效率不行
    4. 一看见字段参与的计算表达式放在where条件后的等式左边就知道速度差
    5. 一看见where条件后的等式有getdate()就知道不严格, 因为如果有N条记录其实此时getdate()函数是调用N次, 当次没有调用一次快哟
    6. 一看动态执行语句(在查询分析器里是红瞎瞎的一片)就知道非常的没有效率,因为根本没有索引优化, 也没有预编译的好处, 有时候的确不得不用动态执行, 尽量用在数据量非常小的场合
      

  22.   

    使用Profiler可以知道你的SQL语句的start date和end date,它是以毫秒计算的。
      

  23.   

    set statistics time on 
    1 加索引
    2 少有排序
    3 慎用in
      

  24.   

    sql查询性能调试,用SET STATISTICS IO和SET STATISTICS TIME set statistics profile on set statistics io on set statistics time on一个查询需要的CPU、IO资源越多,查询运行的速度就越慢,因此,描述查询性能调节任务的另一种方式是,应该以一种使用更少的CPU、IO资源的方式重写查询命令,如果能够以这样一种方式完成查询,查询的性能就会有所提高。    如果调节查询性能的目的是让它使用尽可能少的服务器资源,而不是查询运行的时间最短,那么就更容易测试你采取的措施是提高了查询的性能还是降低了查询的性 能。尤其是在资源利用不断变化的服务器上更是如此。首先,需要搞清楚在对查询进行调节时,如何测试我们的服务器的资源使用情况。    在开始我们的例子前,先运行下面的这二条命令(不要在正在使用的服务器上执行),这二条命令将清除SQL Server的数据和过程缓冲区,这样能够使我们在每次执行查询时在同一个起点上,否则,每次执行查询得到的结果就不具有可比性了:DBCC DROPCLEANBUFFERS和DBCC FREEPROCCACHE输入并运行下面的Transact-SQL命令:SET STATISTICS IO ON  SET STATISTICS TIME ON一旦上面的准备工作完成后,运行下面的查询:SELECT * FROM [order details]显示结果:SQL Server parse and compile time: (SQL Server解析和编译时间:)CPU time = 10 ms, elapsed time = 61 ms. ……(1) SQL Server parse and compile time: (SQL Server解析和编译时间:)CPU time = 0 ms, elapsed time = 0 ms. ……(2) (所影响的行数为 2155 行) ……(3) Table 'Order Details'. Scan count 1, logical reads 10, physical reads 1, read-ahead reads 9.(表:Order Details,扫描次数 1,逻辑读 10,物理读 1,提前读取 9) ……(4) SQL Server Execution Times:(SQL Server执行时间:)CPU time = 30 ms, elapsed time = 387 ms. ……(5)标志(1)表示SQL Server解析“ELECT * FROM [order details]”命令并将解析的结果放到SQL Server的过程缓冲区中供SQL Server使用所需要的CPU运行时间和总的时间。标志(2)表示SQL Server从过程缓冲区中取出解析结果供执行的时间,大多数情况下这二个值都会是0,因为这个过程执行得相当地快。标志(5)表 示执行这次查询使用了多少CPU运行时间和运行查询使用了多少时间。CPU运行时间是对运行查询所需要的CPU资源的一种相对稳定的测量方法,与CPU的 忙闲程度没有关系。但是,每次运行查询时这一数字也会有所不同,只是变化的范围没有总时间变化大。总时间是对查询执行所需要的时间(不计算阻塞或读数据的 时间),由于服务器上的负载是在不断变化的,因此这一数据的变化范围有时会相当地大。(由于CPU占用时间是相对稳定的,因此可以使用这一数据作为衡量你的调节措施是提高了查询性能还是降低了查询的性能的一种方法。)标志(4)是SET STATISTICS IO的效果 Scan Count:在查询中涉及到的表被访问的次数。在我们的例子中,其中的表只被访问了1次,由于查询中不包括连接命令,这一信息并不是十分有用,但如果查询中包含有一个或多个连接,则这一信息是十分有用的。(一 个循环外部的表的Scan Count值为1,但对于一个循环内的表而言,其值为循环的次数。可以想象得到,对于一个循环内的表而言,其Scan Count值越小,它所使用的资源越少,查询的性能也就越高。因此在调节一个带连接的查询的性能时,需要关注Scan Count的值,在进行调节时,注意观察它是增加还是减少了。)Logical Reads: 这是SET STATISTICS IO或SET STATISTICS TIME命令提供的最有用的 数据。我们知道,SQL Server在可以对任何数据进行操作前,必须首先把数据读取到其数据缓冲区中。此外,我们也知道SQL Server何时会从数据缓冲区中读取数据,并把数据读取到大小为8K字节的页中。那么Logical Reads的意义是什么呢?Logical Reads是指SQL Server为得到查询中的结果而必须从数据缓冲区读取的页数。在执行查询时,SQL Server不会读取比实际需求多或少的数据,因此,当在相同的数据集上执行同一个查询,得到的Logical Reads的数字总是相同的。(SQL Server执行查询时的Logical Reads值每一次这个数值是不会变化的。因此,在进行查询性能的调节时,这是一个可以用来衡量你的调节措施是否成功的一个很好的标准。如果 Logical Reads值下降,就表明查询使用的服务器资源减少,查询的性能有所提高。如果Logical Reads值增加,则表示调节措施降低了查询的性能。在其他条件不变的情况下,一个查询使用的逻辑读越少,其效率就越高,查询的速度就越快。)Physical Reads:物 理读,在执行真正的查询操作前,SQL Server必须从磁盘上向数据缓冲区中读取它所需要的数据。在SQL Server开始执行查询前,它要作的第一件事就是检查它所需要的数据是否在数据缓冲区中,如果在,就从中读取,如果不在,SQL Server必须首先将它需要的数据从磁盘上读到数据缓冲区中。我们可以想象得到,SQL Server在执行物理读时比执行逻辑读需要更多的服务器资源。因此,在理想情况下,我们应当尽量避免物理读操作。下面的这一部分听起来让人容易感到糊涂 了。在对查询的性能进行调节时,可以忽略物理读而只专注于逻辑读。你一定会纳闷儿,刚才不是还说物理读比逻辑读需要更多的服务器资源吗?情况确实是这样, SQL Server在执行查询时所需要的物理读次数不可能通过性能调节而减少的。减少物理读的次数是DBA的一项重要工作,但它涉及到整个服务器性能的调节,而 不仅仅是查询性能的调节。在进行查询性能调节时,我们不能控制数据缓冲区的大小或服务器的忙碌程度以及完成查询所需要的数据是在数据缓冲区中还是在磁盘 上,唯一我们能够控制的数据是得到查询结果所需要执行的逻辑读的次数。 因此,在查询性能的调节中,我们可以心安理得地不理会SET STATISTICS IO命令提供的Physical Read的值。(减少物理读次数、加快SQL Server运行速度的一种方式是确保服务器的物理内存足够多。)Read-Ahead Reads: 与Physical Reads一样,这个值在查询性能调节中也没有什么用。Read-Ahead Reads表示SQL Server在执行预读机制时读取的物理页。为了优化其性能,SQL Server在认为它需要数据之前预先读取一部分数据,根据SQL Server对数据需求预测的准确程度,预读的数据页可能有用,也可能没用。 在本例中,Read-Ahead Reads的值为9,Physical Read的值为1,而Logical Reads的值为10,它们之间存在着简单的相加关系。那么我在服务器上执行查询时的过程是怎么样的呢?首先,SQL Server会开始检查完成查询所需要的数据是否在数据缓冲区中,它会很快地发现这些数据不在数据缓冲区中,并启动预读机制将它所需要的10个数据页中的 前9个读取到数据缓冲区。当SQL Server检查是否所需要的全部数据都已经在数据缓冲区时,会发现已经有9个数据页在数据缓冲区中,还有一个不在,它就会立即再次读取磁盘,将所需要的 页读到数据缓冲区。一旦所有的数据都在数据缓冲区后,SQL Server就可以处理查询了。总结:在对查询的性能进行调节时用一些科学的标准来测量你的调节措施是否有效是十分重要的。问题是,SQL Servers的负载是动态变化的,使用查询总的运行时间来衡量你正在调节性能的查询的性能是提高了还是没有,并不是一个合理的方法。更好的方法是比较多个数据,例如逻辑读的次数或者查询所使用的CPU时间。因此在对查询的性能进行调节时,需要首先使用SET STATISTICS IO和SET STATISTICS TIME命令向你提供一些必要的数据,以便确定你对查询性能进行调节的措施是否真正地得到了目的。======================1.测试前用二条命令清除SQL Server的数据和过程缓冲区,以保证测试条件相同:DBCC DROPCLEANBUFFERS和DBCC FREEPROCCACHE2.SET STATISTICS TIME:看cpu时间   3.SET STATISTICS IO:关注scan count(计数)------查询读取的表数量   logical read( 逻辑读)次数
      

  25.   

    对你使用到的条件字段建立索引就会提高SQL语句的查询速度.
      

  26.   

    记得查询语句中少用*号.如果有必要的话,多用Top
      

  27.   

    优化数据库的思想:
    ================
    1、关键字段建立索引。
    2、使用存储过程,它使SQL变得更加灵活和高效。
    3、备份数据库和清除垃圾数据。
    4、SQL语句语法的优化。(可以用Sybase的SQL Expert,可惜我没找到unexpired的
    序列号)
    5、清理删除日志。SQL语句优化的原则:
    ==================
    1、使用索引来更快地遍历表。
       缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引
    下,数据在物理上随机存放在数据页上。合理的索引设计要建立在
    对各种查询的分析和预测上。一般来说:①.有大量重复值、且经常有范围查询
    (between, > ,<  ,> =,<  =)和order by、group by发生的列,可考
    虑建立群集索引;②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引
    ;③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定
    是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好,恰好相反过多的索
    引会导致系统低效。用户在表中每加进一个索引,维护索引集
    合就要做相应的更新工作。
    2、IS NULL 与 IS NOT NULL
       不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有
    多列这样的情况下,只要这些列中有一列含有null,该列就会从
    索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任何
    在where子句中使用is null或is not null的语句优化器是不允
    许使用索引的。
    3、IN和EXISTS
       EXISTS要远比IN的效率高。里面关系到full table scan和range scan。几乎将所
    有的IN操作符子查询改写为使用EXISTS的子查询。
    4、在海量查询时尽量少用格式转换。
    5、当在SQL SERVER 2000中,如果存储过程只有一个参数,并且是OUTPUT类型的,必
    须在调用这个存储过程的时候给这个参数一个初始的值,否则
    会出现调用错误。
    6、ORDER BY和GROPU BY
       使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。注意
    如果索引列里面有NULL值,Optimizer将无法优化。
    7、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时
    要尽可能将操作移至等号右边。
    8、IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把
    子句拆开。拆开的子句中应该包含索引。
    9、SET SHOWPLAN_ALL ON 查看执行方案。DBCC检查数据库数据完整性。
    DBCC(DataBase Consistency Checker)是一组用于验证 SQL Server 数据
    库完整性的程序。
    10、慎用游标
       在某些必须使用游标的场合,可考虑将符合条件的数据行转入临时表中,再对临
    时表定义游标进行操作,这样可使性能得到明显提高。
    总结:所谓优化即WHERE子句利用了索引,不可优化即发生了表扫描或额外开销。经
    验显示,SQL Server性能的最大改进得益于逻辑的数据库设计、
    索引设计和查询设计方面。反过来说,最大的性能问题常常是由其中这些相同方面中
    的不足引起的。其实SQL优化的实质就是在结果正确的前提下,
    用优化器可以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索
    的发生。其实SQL的性能优化是一个复杂的过程,上述这些只是
    在应用层次的一种体现,深入研究还会涉及数据库层的资源配置、网络层的流量控制
    以及操作系统层的总体设计。
      

  28.   

    我是菜鸟,方法:
    先闭上左眼,用右眼看;
    再闭上右眼,用左眼看;
    哪个舒服那个速度快!
    还看不出来,就闭上双眼。
    hehe!
      

  29.   

    靠  这个问题   太简单啦 
    select getdate()selct * form where  ````````select getdate()
    这2个getdate的时间差就是你的速度,基本误差不过0.1毫秒   很简单
    简单的问题复杂话了你们
      

  30.   


    declare @t1 datetime,@t2 datetimeset @t1=getdate()select............./*你的查询语句*/set @t2=getdate()select datediff(ms,@t1,@t2)
    这个简单办法可以吗?
      

  31.   

    select * from a inner join b where b.c=1
    select * from a inner join b where a.c=1
    速度差很多,请自己测试
      

  32.   

    有两种方法,自己研究一下吧:1.
    SET STATISTICS PROFILE ON
    SET STATISTICS IO ON
    SET STATISTICS TIME ON
    GO
    --你的SQL脚本
    GO
    SET STATISTICS PROFILE OFF
    SET STATISTICS IO OFF
    SET STATISTICS TIME OFF
     2. SET SHOWPLAN_ALL ON;
    GO
    --你的SQL脚本
    GO
    SET SHOWPLAN_ALL OFF;
      

  33.   

    Please see the execution plan