`
abalone
  • 浏览: 131303 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle table name

    博客分类:
  • DB
阅读更多
select * From all_objects
where object_type='TABLE'

select * From all_tables
where owner='DBS_MAJ'
and table_name like '%SOM%'

desc  som_rr_detail

insert into som_onhand select * from som_onhand@CNDBS1T5


1.Excution Plan
     Excution Plan是最基本的调优概念,不管你的调优吹得如何天花乱堕,结果还是要由Excution plan来显示Oracle 最终用什么索引、按什么顺序连接各表,Full Table Scan还是Access by Rowid Index,瓶颈在什么地方。如果没有它的指导,一切调优都是蒙的。


2.Toad for Oracle Xpert
    用它来调优在真的好舒服。Quest 吞并了Lecco后,将它整合到了Toad 的SQL Tunning里面:最清晰的执行计划显示,自动生成N条等价SQL、给出优化建议,不同SQL执行计划的对比,还有实际执行的逻辑读、物理读数据等等一目了然。


3.索引
   大部分的性能问题其实都是索引应用的问题,Where子句、Order By、Group By 都要用到索引。
   一般开发人员认为将索引建全了就可以下班回家了,实则还有颇多的思量和陷阱。

3.1 索引列上不要进行计算
      这是最最普遍的失效陷阱,比如where trunc(order_date)=trunc(sysdate), i+2>4。索引失效的原因也简单,索引是针对原值建的二叉树,你将列值*3/4+2折腾一番后,原来的二叉树当然就用不上了。解决的方法:
  1. 换成等价语法,比如trunc(order_date) 换成

where order_date>trunc(sysdate)-1 and order_date<trunc(sysdate)+1
  2.    特别为计算建立函数索引

create index I_XXXX on shop_order(trunc(order_date))
    3.    将计算从等号左边移到右边
 这是针对某些无心之失的纠正,把a*2>4 改为a>4/2;把TO_CHAR(zip) = '94002' 改为zip = TO_NUMBER('94002');

3.2 CBO与索引选择性
     建了索引也不一定会被Oracle用的,就像个挑食的孩子。基于成本的优化器(CBO, Cost-Based Optimizer),会先看看表的大小,还有索引的重复度,再决定用还是不用。表中有100 条记录而其中有80 个不重复的索引键值. 这个索引的选择性就是80/100 = 0.8,留意Toad里显示索引的Selective和Cardinailty。实在不听话时,就要用hints来调教。
     另外,where语句存在多条索引可用时,只会选择其中一条。所以索引也不是越多越好:)

3.3 索引重建
     传说中数据更新频繁导致有20%的碎片时,Oracle就会放弃这个索引。宁可信其有之下,应该时常alter index <INDEXNAME> rebuild一下。

3.4 其他要注意的地方
      不要使用Not,如goods_no != 2,要改为

where goods_no>2 or goods_no<2
      不要使用is null , 如WHERE DEPT_CODE IS NOT NULL 要改为

WHERE DEPT_CODE >=0;
3.5 select 的列如果全是索引列时
   又如果没有where 条件,或者where条件全部是索引列时,Oracle 将直接从索引里获取数据而不去读真实的数据表,这样子理论上会快很多,比如

select order_no,order_time from shop_order where shop_no=4
当order_no,order_time,shop_no 这三列全为索引列时,你将看到一个和平时完全不同的执行计划。

3.6 位图索引
     传说中当数据值较少,比如某些表示分类、状态的列,应该建位图索引而不是普通的二叉树索引,否则效率低下。不过看执行计划,这些位图索引鲜有被Oracle临幸的。
 


4.减少查询往返和查询的表
这也是很简单的大道理,程序与Oracle交互的成本极高,所以一个查询能完成的不要分开两次查,如果一个循环执行1万条查询的,怎么都快不到哪里去了。

4.1 封装PL/SQL存储过程
  最高级的做法是把循环的操作封装到PL/SQL写的存储过程里,因为存储过程都在服务端执行,所以没有数据往返的消耗。


4.2 封装PL/SQL内部函数
  有机会,将一些查询封装到函数里,而在普通SQL里使用这些函数,同样是很有效的优化。

4.3 Decode/Case
  但存储过程也麻烦,所以有case/decode把几条条件基本相同的重复查询合并为一条的用法:

SELECT
COUNT(CASE WHEN price < 13 THEN 1 ELSE null END) low,
COUNT(CASE WHEN price BETWEEN 13 AND 15 THEN 1 ELSE null END) med,
COUNT(CASE WHEN price > 15 THEN 1 ELSE null END) high
FROM products;
4.4 一种Where/Update语法

SELECT TAB_NAME FROM TABLES
WHERE (TAB_NAME,DB_VER) = (( SELECT TAB_NAME,DB_VER)
FROM TAB_COLUMNS WHERE VERSION = 604)
UPDATE EMP
SET (EMP_CAT, SAL_RANGE)
= (SELECT MAX(CATEGORY)FROM EMP_CATEGORIES)

5.其他优化
5.1RowID和ROWNUM
     连Hibernate 新版也支持ROWID了,证明它非常有用。比如号称删除重复数据的最快写法:

DELETE FROM EMP E
WHERE E.ROWID > (SELECT MIN(X.ROWID)
FROM EMP X
WHERE X.EMP_NO = E.EMP_NO);


6.终极秘技 - Hints
   这是Oracle DBA的玩具,也是终极武器,比如Oracle在CBO,RBO中所做的选择总不合自己心水时,可以用它来强力调教一下Oracle,结果经常让人喜出望外。
   如果开发人员没那么多时间来专门学习它,可以依靠Toad SQL opmitzer 来自动生成这些提示,然后对比一下各种提示的实际效果。不过随着10g智能的进化,hints的惊喜少了。

7. 找出要优化的Top SQL
    磨了这么久的枪,如果找不到敌人是件郁闷的事情。
    幸亏10g这方面做得非常好。进入Web管理界面,就能看到当前或者任意一天的SQL列表,按性能排序。
    有了它,SQL Trace和TKPROF都可以不用了。




http://www.blogjava.net/calvin/archive/2005/11/11/19276.html
分享到:
评论

相关推荐

    Oracle SQL Table name

    标题“Oracle SQL Table name”指出了文档主要讨论的是Oracle数据库中SQL(Structured Query Language)语句所使用的表名。SQL是用于数据库管理和操作的标准语言,能够完成数据查询、更新、插入和删除等操作。 描述...

    ORACLE Rename Table的语法

    在 ORACLE 中,重命名(Rename)一个表的命令是 ALTER TABLE old_name RENAME TO new_name,而不是 RENAME old_name TO new_name。 REname 命令只是 SQL*Plus 的命令,不能在其他程序中使用,如果将其放在 Java、...

    Oracle常用的和表(Table)相关的命令

    sql&gt; alter table table_name allocate extent (size 500k datafile 'c:/oracle/data.dbf'); ``` **解析**: - `allocate extent`: 分配扩展区。 - `size`: 扩展区大小。 - `datafile`: 数据文件路径。 #### 4.3 ...

    oracle nested table demo

    本示例“Oracle Nested Table Demo”将向我们展示如何在Oracle数据库中创建、操作和使用嵌套表。 嵌套表的定义: 在Oracle中,嵌套表是由单个行组成的数据集合,这些行可以包含相同或不同的列。与传统的表不同,...

    ALTER TABLE table_name

    ### ALTER TABLE 语句在Oracle中的应用 #### 标题:ALTER TABLE table_name - **知识点**:在数据库管理系统(DBMS)中,`ALTER TABLE` 是一种用于修改已存在表结构的 SQL 语句。这包括添加、删除或修改列、约束等...

    java操作Oracle数据库——ARRAY、TABLE类型批量入库

    3. **Java类型映射**:Oracle JDBC驱动提供了`OracleTypes.ARRAY`和`OracleTypes.TABLE`来映射Oracle的ARRAY和TABLE类型。你需要创建一个`OracleCallableStatement`实例,并使用`setArray()`或`setObject()`方法设置...

    oracle create table

    ### Oracle 创建表 (CREATE TABLE) 在Oracle数据库中,`CREATE TABLE`语句用于创建新表。表是数据库中存储数据的主要结构,由一系列行和列组成。创建表时,需要指定表名以及该表中的列名、数据类型和约束条件等。 ...

    oracle中truncate table后的数据恢复

    FLASHBACK TABLE table_name TO BEFORE TRUNCATE; ``` 请注意,这仅在`ALTER DATABASE ENABLE FLASHBACK ARCHIVE`已执行且未达到闪回日志空间限制的情况下有效。 **3. 无闪回表时的其他恢复方法** - **时间点恢复...

    oracle 用表结构创建 type

    2. **表名替换**:在实际应用中需要将`table_name = 'xxx'`中的`xxx`替换为实际表名。 3. **错误处理**:考虑到动态SQL的复杂性,需要添加适当的错误处理逻辑。 4. **性能优化**:对于大型表,查询元数据可能会影响...

    Analyze_Oracle_Table.rar_Table_analyze orac_analyze orac_oracle

    ANALYZE TABLE table_name COMPUTE STATISTICS; ``` 这将计算表的所有基本统计信息,包括行数、块数等。 在"Analyze_Oracle_Table.doc"文档中,可能详细介绍了如何执行这些分析操作,包括何时应该分析,如何使用...

    Oracle更改表空间(table、index、lob)

    ### Oracle更改表空间(table、index、lob) 在Oracle数据库管理中,更改表空间是一项重要的维护任务,尤其是在需要重新组织数据或优化存储时。本文将详细介绍如何通过SQL命令来更改表空间中的表(table)、索引...

    Oracle创建表时Storage参数具体含义

    SELECT table_name, initial_extent, next_extent, min_extents, max_extents, pct_increase FROM user_tables; ``` 这个查询语句将返回当前用户下的所有表的 Storage 参数设置情况。 结论 Storage 参数是 Oracle ...

    oracle数据备份

    Oracle 数据库 对数据库的表进行修改有如下几点 1. 列的添加,修改和...Alter table table_name drop [column column_name]|[(column1_name,column2_name,…)] [cascade constraints](多列的约束组成,用到这段语句)

    oracle sql of extracting table structure

    select 'Table_Name' table_name --,'Column_ID' column_id ,0 column_id ,'Column_Name' column_name ,'Data_Type' data_Type ,'PK_Column' PK_Column ,'Nullable' nullable from DUAL union all select ...

    oracle修改表结构

    ALTER TABLE table_name ADD (column_name datatype [NULL | NOT NULL] [default 'default_value']); ``` 例如,向`test3`表中添加一个名为`address`的字段,类型为`VARCHAR2(100)`,默认值为`unkown`: ```sql ...

    cx_Oracle-7.3.0_oracle_cx_oracle_cx_Oracle7.3对应_python_jupyteror

    在这个例子中,'hostname'、'port'、'service_name'、'username'和'password'需要替换为实际的Oracle数据库信息,'table_name'是你要查询的表名。 总结来说,这个压缩包提供了在Jupyter Notebook中使用Python 3.6...

    delphi使用oadc操作oracle数据库

    OracleTable1.FieldByName('employee_name').Value := '张三'; OracleTable1.FieldByName('salary').Value := 5000; OracleTable1.Post; ``` 3. **更新(UPDATE)**:修改现有记录时,先通过FindKey或Locate...

    1小时学会Oracle

    - 重命名列:`ALTER TABLE table_name RENAME COLUMN old_column_name TO new_column_name;` - 示例:`ALTER TABLE students RENAME COLUMN name TO full_name;` - **ADD CONSTRAINTS**:为表添加约束。 - NOT ...

    createtable.rar_oracle

    在Oracle数据库系统中,"CREATE TABLE"语句是SQL语法的一部分,用于定义新的关系型数据库表。这个"createtable.rar_oracle"压缩包文件显然包含了与Oracle数据库中的创建表操作相关的资源,特别是通过PL/SQL编程语言...

    ORACLE经典常用语句总结

    SELECT C.CONSTRAINT_NAME, C.CONSTRAINT_TYPE, CC.COLUMN_NAME FROM USER_CONSTRAINTS C, USER_CONS_COLUMNS CC WHERE C.OWNER = UPPER('&table_owner') AND C.TABLE_NAME = UPPER('&table_name') AND C.OWNER = CC...

Global site tag (gtag.js) - Google Analytics