高效SQL语句必杀技

  1. 18) 尽可能避免使用函数,函数会导致更多的 recursive calls       

二、合理使用索引以提高性能
       索引依赖于表而存在,是真实表的一个缩影,类似于一本书的目录,通过目录以更快获得所需的结果。Oracle使用了一个复杂的自平衡
B数据结构。即任意记录的DML操作将打破索引的平衡,而定期重构索引使得索引重新获得平衡。通常,通过索引查找数据比全表扫描更高效。
任意的DQL或DML操作,SQL优化引擎优先使用索引来计算当前操作的成本以生成最佳的执行计划。一旦使用索引操出参数optimizer_index_cost_adj
设定的值才使用全表扫描。同样对于多表连接使用索引也可以提高效率。同时索引也提供主键(primary key)的唯一性验证。

       除了那些LONG或LONG RAW数据类型,你可以索引几乎所有的列.通常,在大型表中使用索引特别有效.当然,你也会发现,在扫描小表时,使用索
引同样能提高效率。

       虽然使用索引能得到查询效率的提高,但是索引需要空间来存储,需要定期维护.尤其是在有大量DML操作的表上,任意的DML操作都将引起索
引的变更这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,
那些不必要的索引反而会使查询反应时间变慢。

DML操作使用索引上存在碎片而失去高度均衡,因此定期的重构索引是有必要的.

  1. 1) 避免基于索引列的计算                                                                                                          
  2. where 子句中的谓词上存在索引,而此时基于该列的计算将使得索引失效                                                                 
  3.                                                                                                                                  
  4. -->低效:                     
  5. SELECT employee_id, first_name                                                                                                   
  6. FROM   employees                                                                                                                 
  7. WHERE  employee_id + 10 > 150;        -->索引列上使用了计算,因此索引失效,走全表扫描方式                                        
  8.                                                                                                                                  
  9. -->高效:                             
  10. SELECT employee_id, first_name                                                                                                   
  11. FROM   employees                                                                                                                 
  12. WHERE  employee_id > 160;    -->走索引范围扫描方式                                                                               
  13.                         
  14. 例外情形     
  15. 上述规则不适用于SQL中的MINMAX函数                                                                                              
  16. hr@CNMMBO> SELECT MAX( employee_id ) max_id                                                                                      
  17.   2  FROM   employees                                                                                                            
  18.   3  WHERE  employee_id                                                                                                          
  19.   4         + 10 > 150;                                                                                                          
  20.                                                                                                                                  
  21. 1 row selected.                                                                                                                  
  22.                                                                                                                                  
  23. Execution Plan                                                                                                                   
  24. ----------------------------------------------------------        
  25. Plan hash value: 1481384439                                
  26. ---------------------------------------------------------------------------------------------               
  27. | Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |                 
  28. ---------------------------------------------------------------------------------------------                
  29. |   0 | SELECT STATEMENT            |               |     1 |     4 |     1   (0)| 00:00:01 |                 
  30. |   1 |  SORT AGGREGATE             |               |     1 |     4 |            |          |                  
  31. |   2 |   FIRST ROW                 |               |     5 |    20 |     1   (0)| 00:00:01 |          
  32. |*  3 |    INDEX FULL SCAN (MIN/MAX)| EMP_EMP_ID_PK |     5 |    20 |     1   (0)| 00:00:01 |         
  33. ---------------------------------------------------------------------------------------------             
  34.                                                                                                                                  
  35. 2) 避免在索引列上使用NOT运算或不等于运算(<>,!=)                                                                                  
  36. 通常,我们要避免在索引列上使用NOT或<>,两者会产生在和在索引列上使用函数相同的影响。 当ORACLE遇到NOT或不等运算时,他就会停止       
  37. 使用索引转而执行全表扫描。                                                                                                       
  38.                                                                                                                                  
  39. -->低效:                                                                                
  40. SELECT *                                                                                                                         
  41. FROM   emp                                                                                                                       
  42. WHERE  NOT ( deptno = 20 );   -->实际上NOT ( deptno = 20 )等同于deptno <> 20,即deptno <>同样会限制索引                           
  43.                                                                                                                                  
  44. -->高效:                                                                          
  45. SELECT *                                                                                                                         
  46. FROM   emp                                                                                                                       
  47. WHERE  deptno > 20 OR deptno < 20;                                                                                               
  48. -->尽管此方式可以替换且实现上述结果,但依然走全表扫描,如果是单纯的 > 或 < 运算,则此时为索引范围扫描                            
  49.                                                                                                                                  
  50. 需要注意的是,在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符                                                       
  51. 其次如果是下列运算符进行NOT运算,依然有可能选择走索引, 仅仅除了NOT = 之外,因为 NOT = 等价于 <>                                    
  52.                                                                                                                                  
  53. NOT >”   to <=                                                                                                                
  54. NOT >=”  to <                                                                                                                 
  55. NOT <”   to >=                                                                                                                
  56. NOT <=”  to >                                                                                                                 
  57.                                                                                                                                  
  58. 来看一个实际的例子                                                                                                               
  59. hr@CNMMBO> SELECT *                                                                                                              
  60.   2  FROM   employees                                                                                                            
  61.   3  where not employee_id<100; -->索引列上使用了not,但是该查询返回了所有的记录,即107条,因此此时选择走全表扫描                 
  62.                                                                                                                                  
  63. 107 rows selected.                                                                                                               
  64.                                                                                                                                  
  65. Execution Plan                                                                                                                   
  66. ----------------------------------------------------------   
  67. Plan hash value: 1445457117                                                                                                      
  68. -------------------------------------------------------------------------------            
  69. | Id  | Operation         | Name      | Rows  | Bytes | Cost (%CPU)| Time     |         
  70. -------------------------------------------------------------------------------      
  71. |   0 | SELECT STATEMENT  |           |   107 |  7276 |     3   (0)| 00:00:01 |   
  72. |*  1 |  TABLE ACCESS FULL| EMPLOYEES |   107 |  7276 |     3   (0)| 00:00:01 | -->执行计划中使用了走全表扫描方式       
  73. -------------------------------------------------------------------------------                                           
  74. Predicate Information (identified by operation id):                                               
  75. ---------------------------------------------------      
  76.       
  77.    1 - filter("EMPLOYEE_ID">=100)           -->查看这里的谓词信息被自动转换为 >= 运算符                   
  78.                                                                                                                                  
  79. hr@CNMMBO> SELECT *                                                                                                              
  80.   2  FROM   employees                                                                                                            
  81.   3  where not employee_id<140; -->此例与上面的语句相同,仅仅是查询范围不同返回67条记录,而此时选择了索引范围扫描                  
  82.                                                                                                                                  
  83. 67 rows selected.                                                                                                                
  84.                                                                                                                                  
  85. Execution Plan                                                                                                                   
  86. ----------------------------------------------------------         
  87. Plan hash value: 603312277                                                                                                       
  88.                                                                                                                                  
  89. ---------------------------------------------------------------------------------------------              
  90. | Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |            
  91. ---------------------------------------------------------------------------------------------           
  92. |   0 | SELECT STATEMENT            |               |    68 |  4624 |     3   (0)| 00:00:01 |          
  93. |   1 |  TABLE ACCESS BY INDEX ROWID| EMPLOYEES     |    68 |  4624 |     3   (0)| 00:00:01 |              
  94. |*  2 |   INDEX RANGE SCAN          | EMP_EMP_ID_PK |    68 |       |     1   (0)| 00:00:01 | -->索引范围扫描方式   
  95. ---------------------------------------------------------------------------------------------                          
  96. Predicate Information (identified by operation id):                                               
  97. ---------------------------------------------------                               
  98.     2 - access("EMPLOYEE_ID">=140)                                       
  99.                                                                                                                                  
  100. 3) 用UNION 替换OR(适用于索引列)                                                                                                  
  101.     通常情况下,使用UNION 替换WHERE子句中的OR将会起到较好的效果.基于索引列使用OR使得优化器倾向于使用全表扫描,而不是扫描索引.     
  102.     注意,以上规则仅适用于多个索引列有效。 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低。                        
  103. -->低效:                            
  104. SELECT deptno, dname                                                                                                             
  105. FROM   dept                                                                                                                      
  106. WHERE  loc = 'DALLAS' OR deptno = 20;                                                                                            
  107.                                                                                                                                  
  108. -->高效:                                      
  109. SELECT deptno, dname                                                                                                             
  110. FROM   dept                                                                                                                      
  111. WHERE  loc = 'DALLAS'                                                                                                            
  112. UNION                                                                                                                            
  113. SELECT deptno, dname                                                                                                             
  114. FROM   dept                                                                                                                      
  115. WHERE  deptno = 30                                                                                                               
  116.                                                                                                                                  
  117. -->经测试,由于数据量较少,此时where子句中的谓词上都存在索引列时,两者性能相当.                                                   
  118. -->假定where子句中存在两列     
  119. scott@CNMMBO> create table t6 as select object_id,owner,object_name from dba_objects where owner='SYS' and rownum<1001;          
  120.                                                                                                                                  
  121. scott@CNMMBO> insert into t6 select object_id,owner,object_name from dba_objects where owner='SCOTT' and rownum<6;               
  122.                                                                                                                                  
  123. scott@CNMMBO> create index i_t6_object_id on t6(object_id);                                                 
  124.                                                                                                                                  
  125. scott@CNMMBO> create index i_t6_owner on t6(owner);                                               
  126.                                                                                                                                  
  127. scott@CNMMBO> insert into t6 select object_id,owner,object_name from dba_objects where owner='SYSTEM' and rownum<=300;           
  128.                                                                                                                                  
  129. scott@CNMMBO> commit;                                                                                                            
  130.                                                                                                                                  
  131. scott@CNMMBO> exec dbms_stats.gather_table_stats('SCOTT','T6',cascade=>true);   
  132.                                                                                                                                  
  133. scott@CNMMBO> select owner,count(*) from t6 group by owner;       
  134.                                                              
  135. OWNER                  COUNT(*)                                                 
  136. -------------------- ----------                                                   
  137. SCOTT                         5                                                        
  138. SYSTEM                      300                                                          
  139. SYS                        1000                                                         
  140.                                                                                                                                  
  141. scott@CNMMBO> select * from t6 where owner='SCOTT' and rownum<2;                                                                 
  142.                                                                            
  143. OBJECT_ID OWNER                OBJECT_NAME                                                
  144. ---------- -------------------- --------------------                                           
  145.      69450 SCOTT                T_TEST                                                        
  146.                                                                                
  147. scott@CNMMBO> select * from t6 where object_id=69450 or owner='SYSTEM';                                                          
  148.                                                                                                                                  
  149. 301 rows selected.                                                                                                               
  150.                                                                                                                                  
  151. Execution Plan                                                                                                                   
  152. ----------------------------------------------------------      
  153. Plan hash value: 238853296                                                                                                      
  154. -----------------------------------------------------------------------------------------------           
  155. | Id  | Operation                    | Name           | Rows  | Bytes | Cost (%CPU)| Time     |          
  156. -----------------------------------------------------------------------------------------------       
  157. |   0 | SELECT STATEMENT             |                |   300 |  7200 |     5   (0)| 00:00:01 |        
  158. |   1 |  CONCATENATION               |                |       |       |            |          |     
  159. |   2 |   TABLE ACCESS BY INDEX ROWID| T6             |     1 |    24 |     2   (0)| 00:00:01 |             
  160. |*  3 |    INDEX RANGE SCAN          | I_T6_OBJECT_ID |     1 |       |     1   (0)| 00:00:01 |            
  161. |*  4 |   TABLE ACCESS BY INDEX ROWID| T6             |   299 |  7176 |     3   (0)| 00:00:01 |            
  162. |*  5 |    INDEX RANGE SCAN          | I_T6_OWNER     |   300 |       |     1   (0)| 00:00:01 |               
  163. -----------------------------------------------------------------------------------------------               
  164.                                                                                                                                  
  165. Predicate Information (identified by operation id):                                                                              
  166. ---------------------------------------------------                                
  167.    3 - access("OBJECT_ID"=69450)                   
  168.    4 - filter(LNNVL("OBJECT_ID"=69450))            
  169.    5 - access("OWNER"='SYSTEM')                 
  170.                                                                                                                                  
  171. Statistics                                                                                                                       
  172. ----------------------------------------------------------   
  173.           0  recursive calls                                                                                                     
  174.           0  db block gets                                                                                                       
  175.          46  consistent gets                                                                                                     
  176.           0  physical reads                                                                                                      
  177.           0  redo size                                                                                                           
  178.       11383  bytes sent via SQL*Net to client                                                                                    
  179.         712  bytes received via SQL*Net from client                                                                              
  180.          22  SQL*Net roundtrips to/from client                                                                                   
  181.           0  sorts (memory)                                                                                                      
  182.           0  sorts (disk)                                                                                                        
  183.         301  rows processed                                                                                                      
  184.                                                                                                                                  
  185. scott@CNMMBO> select * from t6 where owner='SYSTEM' or object_id=69450;                                                          
  186.                                                                                                                                  
  187. 301 rows selected.                                                                                                               
  188.                                                                                                                                  
  189. Execution Plan                                                                                                                   
  190. ----------------------------------------------------------   
  191. Plan hash value: 238853296                                                                                                       
  192. -----------------------------------------------------------------------------------------------             
  193. | Id  | Operation                    | Name           | Rows  | Bytes | Cost (%CPU)| Time     |              
  194. -----------------------------------------------------------------------------------------------           
  195. |   0 | SELECT STATEMENT             |                |   300 |  7200 |     5   (0)| 00:00:01 |             
  196. |   1 |  CONCATENATION               |                |       |       |            |          |               
  197. |   2 |   TABLE ACCESS BY INDEX ROWID| T6             |     1 |    24 |     2   (0)| 00:00:01 |               
  198. |*  3 |    INDEX RANGE SCAN          | I_T6_OBJECT_ID |     1 |       |     1   (0)| 00:00:01 |                 
  199. |*  4 |   TABLE ACCESS BY INDEX ROWID| T6             |   299 |  7176 |     3   (0)| 00:00:01 |         
  200. |*  5 |    INDEX RANGE SCAN          | I_T6_OWNER     |   300 |       |     1   (0)| 00:00:01 |         
  201. -----------------------------------------------------------------------------------------------             
  202.                                                                                                                                  
  203. Predicate Information (identified by operation id):                                                                              
  204. ---------------------------------------------------     
  205.    3 - access("OBJECT_ID"=69450)                                      
  206.    4 - filter(LNNVL("OBJECT_ID"=69450))                                  
  207.    5 - access("OWNER"='SYSTEM')                                    
  208.                                                                                                                                  
  209. Statistics                                                             
  210. ----------------------------------------------------------                  
  211.           1  recursive calls                                                                                                     
  212.           0  db block gets                                                                                                       
  213.          46  consistent gets                                                                                                     
  214.           0  physical reads                                                                                                      
  215.           0  redo size                                                                                                           
  216.       11383  bytes sent via SQL*Net to client                                                                                    
  217.         712  bytes received via SQL*Net from client                                                                              
  218.          22  SQL*Net roundtrips to/from client                                                                                   
  219.           0  sorts (memory)                                                                                                      
  220.           0  sorts (disk)                                                                                                        
  221.         301  rows processed                                                                                                      
  222.                                                                                                                                  
  223. scott@CNMMBO> select * from t6                                                                                                   
  224.   2  where object_id=69450                                                                                                       
  225.   3  union                                                                                                                       
  226.   4  select * from t6                                                                                                            
  227.   5  where owner='SYSTEM';                                                                                                       
  228.                                                                                                                                  
  229. 301 rows selected.                                                                                                               
  230.                                                                                                                                  
  231. Execution Plan                                                                                                                   
  232. ----------------------------------------------------------   
  233. Plan hash value: 370530636                                                                                                       
  234. ------------------------------------------------------------------------------------------------          
  235. | Id  | Operation                     | Name           | Rows  | Bytes | Cost (%CPU)| Time     |          
  236. ------------------------------------------------------------------------------------------------         
  237. |   0 | SELECT STATEMENT              |                |   301 |  7224 |     7  (72)| 00:00:01 |          
  238. |   1 |  SORT UNIQUE                  |                |   301 |  7224 |     7  (72)| 00:00:01 |        
  239. |   2 |   UNION-ALL                   |                |       |       |            |          |        
  240. |   3 |    TABLE ACCESS BY INDEX ROWID| T6             |     1 |    24 |     2   (0)| 00:00:01 |         
  241. |*  4 |     INDEX RANGE SCAN          | I_T6_OBJECT_ID |     1 |       |     1   (0)| 00:00:01 |     
  242. |   5 |    TABLE ACCESS BY INDEX ROWID| T6             |   300 |  7200 |     3   (0)| 00:00:01 |        
  243. |*  6 |     INDEX RANGE SCAN          | I_T6_OWNER     |   300 |       |     1   (0)| 00:00:01 |     
  244. ------------------------------------------------------------------------------------------------               
  245.                                                                                                                                  
  246. Predicate Information (identified by operation id):                                                                              
  247. ---------------------------------------------------                                                                              
  248.    4 - access("OBJECT_ID"=69450)                        
  249.    6 - access("OWNER"='SYSTEM')                                     
  250.                                                                                                                                  
  251. Statistics                                                                                                                       
  252. ----------------------------------------------------------                                                                       
  253.           1  recursive calls                                                                                                     
  254.           0  db block gets                                                                                                       
  255.           7  consistent gets                                                                                                     
  256.           0  physical reads                                                                                                      
  257.           0  redo size                                                                                                           
  258.       11383  bytes sent via SQL*Net to client                                                                                    
  259.         712  bytes received via SQL*Net from client                                                                              
  260.          22  SQL*Net roundtrips to/from client                                                                                   
  261.           1  sorts (memory)                                                                                                      
  262.           0  sorts (disk)                                                                                                        
  263.         301  rows processed                                                                                                      
  264.                                                                                                                                  
  265. -->从上面的统计信息可知,consistent gets由46下降为7,故当where子句中谓词上存在索引时,使用union替换or更高效                      
  266. -->即使当列object_id与owner上不存在索引时,使用union仍然比or更高效(在Oracle 10g R2与Oracle 11g R2测试)                           
  267.                                                                                                                                  
  268. 4) 避免索引列上使用函数                                                                                                          
  269. -->下面是一个来自实际生产环境的例子                                                                                              
  270. -->表acc_pos_int_tbl上business_date列存在索引,由于使用了SUBSTR函数,此时索引失效,使用全表扫描                                   
  271. SELECT acc_num                                                                                                                   
  272.      , curr_cd                                                                                                                   
  273.      , DECODE( '20110728'                                               
  274.              , ( SELECT TO_CHAR( LAST_DAY( TO_DATE( '20110728', 'YYYYMMDD' ) ), 'YYYYMMDD' ) FROM dual ), 0      
  275.              ,   adj_credit_int_lv1_amt                     
  276.                + adj_credit_int_lv2_amt                           
  277.                - adj_debit_int_lv1_amt                              
  278.                - adj_debit_int_lv2_amt )                                 
  279.           AS interest                                              
  280. FROM   acc_pos_int_tbl                                         
  281. WHERE  SUBSTR( business_date, 1, 6 ) = SUBSTR( '20110728', 1, 6 ) AND business_date <= '20110728';      
  282.                                                                                                                                  
  283. -->改进的办法            
  284. SELECT acc_num                                            
  285.      , curr_cd                                          
  286.      , DECODE( '20110728'                                 
  287.              , ( SELECT TO_CHAR( LAST_DAY( TO_DATE( '20110728', 'YYYYMMDD' ) ), 'YYYYMMDD' ) FROM dual ), 0   
  288.              ,   adj_credit_int_lv1_amt                     
  289.                + adj_credit_int_lv2_amt                        
  290.                - adj_debit_int_lv1_amt                           
  291.                - adj_debit_int_lv2_amt )                            
  292.           AS interest                                      
  293. FROM   acc_pos_int_tbl acc_pos_int_tbl                                              
  294. WHERE  business_date >= TO_CHAR( LAST_DAY( ADD_MONTHS( TO_DATE( '20110728', 'yyyymmdd' ), -1 ) )   
  295.                                 + 1, 'yyyymmdd' )                       
  296.        AND business_date <= '20110728';                  
  297.                                                                                                                                  
  298. -->下面的例子虽然没有使用函数,但字符串连接同样导致索引失效                                                                      
  299. -->低效:                     
  300. SELECT account_name, amount                                                                                                      
  301. FROM   transaction                                                                                                               
  302. WHERE  account_name                                                                                                              
  303.        || account_type = 'AMEXA';                                                                                                
  304.                                                                                                                                  
  305. -->高效:                         
  306. SELECT account_name, amount                                                                                                      
  307. FROM   transaction                                                                                                               
  308. WHERE  account_name = 'AMEX' AND account_type = 'A';                                                                             
  309.                                                                                                                                  
  310. 5) 比较不匹配的数据类型                                                                                                          
  311. -->下面的查询中business_date列上存在索引,且为字符型,这种                                                                         
  312. -->低效:                                   
  313. SELECT *                                                                                                                         
  314. FROM   acc_pos_int_tbl                                                                                                           
  315. WHERE  business_date = 20090201;                                                                                                
  316.                                                                                                                                  
  317. Execution Plan                                                                                                                   
  318. ----------------------------------------------------------       
  319. Plan hash value: 2335235465                     
  320.                                                 
  321. -------------------------------------------------------------------------------------                
  322. | Id  | Operation         | Name            | Rows  | Bytes | Cost (%CPU)| Time     |                        
  323. -------------------------------------------------------------------------------------                       
  324. |   0 | SELECT STATEMENT  |                 | 37516 |  2857K|   106K  (1)| 00:21:17 |                     
  325. |*  1 |  TABLE ACCESS FULL| ACC_POS_INT_TBL | 37516 |  2857K|   106K  (1)| 00:21:17 |                
  326. -------------------------------------------------------------------------------------                   
  327.                                                                                                                                  
  328. Predicate Information (identified by operation id):                         
  329. ---------------------------------------------------        
  330.      1 - filter(TO_NUMBER("BUSINESS_DATE")=20090201)    -->这里可以看到产生了类型转换            
  331.                                                                                                                                  
  332. -->高效:                                       
  333. SELECT *                                                                                                                         
  334. FROM   acc_pos_int_tbl                                                                                                           
  335. WHERE  business_date = '20090201'                                                                                                
  336.                                                                                                                                  
  337. 6) 索引列上使用 NULL 值            
  338.     IS NULLIS NOT NULL会限制索引的使用,因为数据中没有值等于NULL值,即便是NULL值也不等于NULL值.且NULL值不存储在于索引之中   
  339. 因此应尽可能避免在索引类上使用NULL值                                                                                             
  340.                                                                                                                                  
  341. SELECT acc_num                                                                                                                   
  342.      , pl_cd                                                                                                                     
  343.      , order_qty                                                                                                                 
  344.      , trade_date                                                                                                                
  345. FROM   trade_client_tbl                                                                                                          
  346. WHERE  input_date IS NOT NULL;                                                                                                   
  347.                                                                                                                                  
  348. Execution Plan                                             
  349. ----------------------------------------------------------                         
  350. Plan hash value: 901462645                                       
  351. --------------------------------------------------------------------------------------                  
  352. | Id  | Operation         | Name             | Rows  | Bytes | Cost (%CPU)| Time     |                    
  353. --------------------------------------------------------------------------------------                  
  354. |   0 | SELECT STATEMENT  |                  |     1 |    44 |    15   (0)| 00:00:01 |               
  355. |*  1 |  TABLE ACCESS FULL| TRADE_CLIENT_TBL |     1 |    44 |    15   (0)| 00:00:01 |                    
  356. --------------------------------------------------------------------------------------                  
  357.                                            
  358. alter table trade_client_tbl modify (input_date not null);           
  359.                                                                     
  360. 不推荐使用的查询方式                                       
  361. SELECT * FROM table_name WHERE col IS NOT NULL                       
  362.                                                                  
  363. SELECT * FROM table_name WHERE col IS NULL                                
  364.                                                                                                                                  
  365. 推荐使用的方式                       
  366. SELECT * FROM table_name WHERE col >= 0 --尽可能的使用 =, >=, <=, like 等运算符      
  367. -->Author: Robinson Cheng               
  368. -->Blog: http://blog.csdn.net/robinson_0612      

三、总结
1、尽可能最小化基表数据以及中间结果集(通过过滤条件避免后续产生不必要的计算与聚合)
2、为where子句中的谓词信息提供最佳的访问路径(rowid访问,索引访问)
3、使用合理的SQL写法来避免过多的Oracle内部开销以提高性能
4、合理的使用提示以提高表之间的连接来提高连接效率(如避免迪卡尔集,将不合理的嵌套连接改为hash连接等)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值