zoukankan      html  css  js  c++  java
  • SQL語句優化

    用IN的時候
    SELECT * FROM [hcempno] where empno in(SELECT [empno] FROM [compemp])

    改用EXISTS
    SELECT * FROM [hcempno] where exists(SELECT 1 FROM [compemp] where empno=[hcempno].empno )


    數據量大的時候有明顯區別,但我的測試時和實際操作中並非如此。
    以下方法得出測試時間:

    select语句前加:
    declare @d datetime
    set @d=getdate()
    并在select语句后加:
    select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())  

    yy 1753-9999 年份

    qq 1-4 刻

    mm 1-12 月

    dy 1-366 日

    dd 1-31 日

    wk 1-54 週

    dw 1-7 週幾

    hh 0-23 小時

    mi 0-59 分種

    ss 0-59 秒

    ms 0-999 毫秒

    速度的快慢與數據結構有關,比如索引,還有就是實際情況。
    但是exists 只會返回true或者false兩個值

    以下網上找到的:
    exists()后面的子查询被称做相关子查询 他是不返回列表的值的.只是返回一个ture或false的结果(这也是为什么子查询里是"select 1"的原因 当然也可以select任何东西)
    其运行方式是先运行主查询一次 再去子查询里查询与其对应的结果 如果是ture则输出,反之则不输出.再根据主查询中的每一行去子查询里去查询.

    in()后面的子查询 是返回结果集的,换句话说执行次序和exists()不一样.子查询先产生结果集,然后主查询再去结果集里去找符合要求的字段列表去.符合要求的输出,反之则不输出.


    执行顺序如下:
    1.首先执行一次外部查询
    2.对于外部查询中的每一行分别执行一次子查询,而且每次执行子查询时都会引用外部查询中当前行的值。
    3.使用子查询的结果来确定外部查询的结果集。
    如果外部查询返回100行,SQL 就将执行101次查询,一次执行外部查询,然后为外部查询返回的每一行执行一次子查询。但实际上,SQL的查询
    优化器有可能会找到一种更好的方法来执行相关子查询,而不需要实际执行101次查询。

    in()里面的子查询是返回一个结果集,如下语句
    select a.code,a.name from table a
    where a.code in(select b.code from table b where a.name like 'A')

    select b.code from table b where a.name like 'A'这名返回的是一个结果集,在执行上面的语句时,首先从TABLE表中取一条记录,再看这条记录的CODE记录是否在子查询返回的结果集中。如当前取得是‘001’,子查询返回的结果集是
    001
    002
    003
    则条件条件。

    而exists()返回是一个逻辑值,如果子查询有结果值则返回TRUE,否则返回FALSE
    主查询检查返回的结果值决定是否要当前的记录行。

    一般EXISTS的执行效率高一些
    -----------------------------------------------------------------
    Procedure中優化:
    当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。

    如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性

  • 相关阅读:
    android使用广播退出应用程序
    Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW _TASK flag.
    Android获取屏幕尺寸大小
    onActivityResult不被执行的问题。
    ADB操作多台设备
    在Eclipse的DDMS中查看手机data文件夹中的内容
    JDK版本过高,导致Eclipse报错
    Android colors.xml
    Eclipse智能提示
    在配置IIS负载均衡时,引起的一系列问题
  • 原文地址:https://www.cnblogs.com/cnaspnet/p/548686.html
Copyright © 2011-2022 走看看