0

これらのクエリ(パフォーマンスなど)でどちらが優れているのか興味があります。

    SELECT some_column,
    CASE case_column
         WHEN 1 THEN 'a'
         WHEN 2 THEN 'a'
         WHEN 3 THEN 'a'
         WHEN 5 THEN 'b'
         WHEN 6 THEN 'b'
         ...
    END AS case_column_str
    FROM some_table ORDER BY case_column_str

また

    SELECT some_column,
    CASE 
         WHEN case_column=1 OR case_column=2 OR case_column=3 THEN 'a'
         WHEN case_column=5 OR case_column=6 THEN 'b'
         ...
    END AS case_column_str
    FROM some_table ORDER BY case_column_str

これらのクエリのいずれかには、他のクエリよりも利点がありますか?2つ目が他のフィールドを使用してさらにフィルタリングできることを除いて、2つの間に大きな違いはありますか?単一の列をフィルタリングする場合はどうなりますか?

4

5 に答える 5

3

それらは同じように解析されます。

13:41:48 SYSTEM@oars_sandbox> create table t as select mod(rownum,5) val from dual connect by rownum <= 1e5;

Table created.                                                                                              

Elapsed: 00:00:00.21                                                                                        

「列の投影情報」に注意してください。最初のケース:

13:43:51 SYSTEM@oars_sandbox> ed                                                    
Wrote file S:\\tools\buffer.sql                                                     

  1  SELECT CASE val                                                                
  2           WHEN 1 THEN 'a'                                                       
  3           WHEN 2 THEN 'a'                                                       
  4           WHEN 3 THEN 'a'                                                       
  5           WHEN 5 THEN 'b'                                                       
  6         END AS case_column_str                                                  
  7    FROM t                                                                       
  8*  ORDER BY case_column_str                                                      
13:44:32 SYSTEM@oars_sandbox> @xplan                                                

PLAN_TABLE_OUTPUT                                                                   
------------------------------------------------------------------------------------
Plan hash value: 961378228                                                          

----------------------------------------------------------------------------------- 
| Id  | Operation          | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | 
----------------------------------------------------------------------------------- 
|   0 | SELECT STATEMENT   |      |   114K|  1450K|       |   591   (2)| 00:00:08 | 
|   1 |  SORT ORDER BY     |      |   114K|  1450K|  2256K|   591   (2)| 00:00:08 | 
|   2 |   TABLE ACCESS FULL| T    |   114K|  1450K|       |    44   (3)| 00:00:01 | 
----------------------------------------------------------------------------------- 

Query Block Name / Object Alias (identified by operation id):                       
-------------------------------------------------------------                       

   1 - SEL$1                                                                        
   2 - SEL$1 / T@SEL$1                                                              

Column Projection Information (identified by operation id):                         
-----------------------------------------------------------                         

   1 - (#keys=1) CASE "VAL" WHEN 1 THEN 'a' WHEN 2 THEN 'a' WHEN 3 THEN             
       'a' WHEN 5 THEN 'b' END [1]                                                  
   2 - "VAL"[NUMBER,22]                                                             

Note                                                                                
-----                                                                               
   - dynamic sampling used for this statement (level=2)                             

2番目のケース:

13:44:36 SYSTEM@oars_sandbox> ed                                                    
Wrote file S:\\tools\buffer.sql                                                     

  1  SELECT CASE WHEN val=1 OR val=2 OR val=3 THEN 'a'                              
  2           WHEN val=5 OR val=6 THEN 'b'                                          
  3    END AS case_column_str                                                       
  4    FROM t                                                              
  5*  ORDER BY case_column_str                                                      
13:45:53   6                                                                        
13:45:55 SYSTEM@oars_sandbox> @xplan                                                

PLAN_TABLE_OUTPUT                                                                   
------------------------------------------------------------------------------------
Plan hash value: 961378228                                                          

----------------------------------------------------------------------------------- 
| Id  | Operation          | Name | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | 
----------------------------------------------------------------------------------- 
|   0 | SELECT STATEMENT   |      |   114K|  1450K|       |   591   (2)| 00:00:08 | 
|   1 |  SORT ORDER BY     |      |   114K|  1450K|  2256K|   591   (2)| 00:00:08 | 
|   2 |   TABLE ACCESS FULL| T    |   114K|  1450K|       |    44   (3)| 00:00:01 | 
----------------------------------------------------------------------------------- 

Query Block Name / Object Alias (identified by operation id):                       
-------------------------------------------------------------                       

   1 - SEL$1                                                                        
   2 - SEL$1 / T@SEL$1                                                              

Column Projection Information (identified by operation id):                         
-----------------------------------------------------------                         

   1 - (#keys=1) CASE "VAL" WHEN 1 THEN 'a' WHEN 2 THEN 'a' WHEN 3 THEN             
       'a' WHEN 5 THEN 'b' END [1]                                                  
   2 - "VAL"[NUMBER,22]                                                             

Note                                                                                
-----                                                                               
   - dynamic sampling used for this statement (level=2)                             

プランクエリの説明:

  select * from table(dbms_xplan.display(null, null, 'all'));  
于 2012-11-22T05:49:03.997 に答える
3

適切なオプティマイザは、この2つを本質的に同一として扱います。パフォーマンスの違いを測定できる可能性はほとんどありません。Oracleには十分なオプティマイザがあり、違いを測定するのは難しいでしょう。クエリプランを見ることができますが、それらが同一であっても驚かないでください。

于 2012-11-22T04:25:14.070 に答える
1

CASE構文の2つの形式では、異なる条件を使用できます。

最初の形式は、単一の列でのフィルタリングにのみ関連しますが、それでもかなり厳密です。あなたの例のルールを考えると、私はまだ2番目のバリアントを使用することを選択しますが、より冗長な定式化では...

CASE
    WHEN case_column in (1,2,3) THEN 'a'
    WHEN case_column in (5,6) THEN 'b'
    ELSE 'c'
END CASE

... 多分 ...

CASE
    WHEN case_column <= 3 THEN 'a'
    WHEN case_column between 5 and 6 THEN 'b'
    ELSE 'c'
END CASE
于 2012-11-23T06:01:37.077 に答える
0

ここでは、2種類のケースステートメントについて説明しました。最初の例は通常のcaseステートメントです。 2番目の例は、検索されたcaseステートメントです。

最初の形式は、oracleのデコード関数とほぼ同じです。したがって、このタイプのケースの特定の使用法は見当たりません。

一方、2番目の形式は、他のコーディングパラダイムのようなものです。これにより、第1の形式では確認できない複数の条件を確認できます。

パフォーマンスの観点からは、2つの方法に違いはありません。両方のクエリがSQLDEVELOPERで実行されると、両方のクエリが同じコスト値を示します。

お役に立てれば。!!

于 2015-03-25T04:15:40.457 に答える
-1
SELECT some_column,
CASE 
     WHEN case_column=1 or case_column=2 or case_column=3 THEN 'a'
     WHEN case_column=5 or case_column=6 THEN 'b'
     ...
END as case_column_str
FROM some_table order by case_column_str

これは、それらのいずれかがケースに当てはまるかのようにはるかに優れており、残りの条件をチェックする必要はありません

これは最初のオプションには当てはまりません。そこでは、個々の条件を1つずつ通過する必要があります。

于 2012-11-22T03:53:28.127 に答える