在where条件中如果某字段名与变量都是全匹配的话,用like和=有区别吗?

解决方案 »

  1.   

    有区别,最主要就是在索引的使用上SQL> select * from test2;                                                                            EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
          7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30
          7521 WARD       SALESMAN        7698 1981-02-22 00:00:00       1250        500         30
          7566 JONES      MANAGER         7839 1981-04-02 00:00:00       2975                    20
          7654 MARTIN     SALESMAN        7698 1981-09-28 00:00:00       1250       1400         30
          7698 BLAKE      MANAGER         7839 1981-05-01 00:00:00       2850                    30
          7782 CLARK      MANAGER         7839 1981-06-09 00:00:00       2450                    10
          7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20
          7839 KING       PRESIDENT            1981-11-17 00:00:00       5000                    10
          7844 TURNER     SALESMAN        7698 1981-09-08 00:00:00       1500          0         30
          7876 ADAMS      CLERK           7788 1987-05-23 00:00:00       1100                    20
          7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30
          7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20
          7934 MILLER     CLERK           7782 1982-01-23 00:00:00       1300                    1014 rows selected.
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 300966803---------------------------------------------------------------------------
    | Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |       |    14 |  1218 |     3   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS FULL| TEST2 |    14 |  1218 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------Note
    -----
       - dynamic sampling used for this statement
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              4  consistent gets
              0  physical reads
              0  redo size
           1415  bytes sent via SQL*Net to client
            385  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
             14  rows processedSQL> select * from test2                                                                        
      2  where ename = 'SMITH';                                                                          EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 300966803---------------------------------------------------------------------------
    | Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |       |     1 |    87 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| TEST2 |     1 |    87 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------Predicate Information (identified by operation id):
    ---------------------------------------------------   1 - filter("ENAME"='SMITH')Note
    -----
       - dynamic sampling used for this statement
    Statistics
    ----------------------------------------------------------
              5  recursive calls
              0  db block gets
              8  consistent gets
              0  physical reads
              0  redo size
            822  bytes sent via SQL*Net to client
            385  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processedSQL> create index ind_ename_test2 on test2(ename);                                              Index created.SQL> select * from test2                                                                        
      2  where ename = 'SMITH';                                                                          EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 923399397-----------------------------------------------------------------------------------------------
    | Id  | Operation                   | Name            | Rows  | Bytes | Cost (%CPU)| Time     |
    -----------------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |                 |     1 |    87 |     2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| TEST2           |     1 |    87 |     2   (0)| 00:00:01 |
    |*  2 |   INDEX RANGE SCAN          | IND_ENAME_TEST2 |     1 |       |     1   (0)| 00:00:01 |
    -----------------------------------------------------------------------------------------------Predicate Information (identified by operation id):
    ---------------------------------------------------   2 - access("ENAME"='SMITH')Note
    -----
       - dynamic sampling used for this statement
    Statistics
    ----------------------------------------------------------
              9  recursive calls
              0  db block gets
              9  consistent gets
              0  physical reads
              0  redo size
            826  bytes sent via SQL*Net to client
            385  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processedSQL> select * from test2                                                                        
      2  where ename like '%SMITH';                                                                      EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
    ---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
          7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 300966803---------------------------------------------------------------------------
    | Id  | Operation         | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |       |     1 |    87 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| TEST2 |     1 |    87 |     3   (0)| 00:00:01 |
    ---------------------------------------------------------------------------Predicate Information (identified by operation id):
    ---------------------------------------------------   1 - filter("ENAME" LIKE '%SMITH')Note
    -----
       - dynamic sampling used for this statement
    Statistics
    ----------------------------------------------------------
              5  recursive calls
              0  db block gets
              8  consistent gets
              0  physical reads
              0  redo size
            822  bytes sent via SQL*Net to client
            385  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed这是一个简单的例子,只是说明区别,实际上索引的使用条件还有很多影响
      

  2.   

    like的效率要比=低很多,不是一个数量级的。
      

  3.   

    #3楼用like时加了通配符,这样肯定会破坏索引,从这个例子还是不能看出哪个快啊