Oracle 优化容易忽略的地方

本文探讨了SQL查询中使用Exist与IN的区别、不同类型的连接方式及其适用场景、NULL值处理方法、Mview的使用策略等内容,并介绍了如何通过合理安排数据顺序及选择适当的扫描方式来提升查询性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Exist 先执行主查询,in 先执行子查询,所以如果主查询有约束条件,应用Exist。

2. 非等值连接,只能用排序合并连接,等值连接就可以用Hash Join(快)。

3. Null处理,Coalesce, NVL

4. SQL是集合处理。

5. Mview, Force(fast(log)->complete), on demand, Query rewrite.

6. 记录, Record(一行多列),%type, %row type

7. 集合, Set(一列多行), type ... is table of 

8. SQL response time should be less than 7 sec.

9. RAID 5, 读好,但写差。

10.隐式的类型转换会导致索引失效,trim(varchar2)是无必要的。有时由于条件太复杂会导致优化器选择不去join,而去做Cartesian.

11.行在数据库的顺序对于查询性能有影响,如果clustering_factor=block数,好的性能,如果=row数,差的性能。

12.何时全表扫描好:有序表,结果集占40%以上;无序表,结果集占7%以上。同时,内存排序比在磁盘排序快10000倍

 

<think>好的,我现在需要在Oracle数据库中创建表,但我不太清楚具体该怎么做。首先,我应该回忆一下基本的SQL语法,因为Oracle是基于SQL的。创建表通常使用CREATE TABLE语句,对吧?是的,没错。那具体的语法结构是怎样的呢? 我记得CREATE TABLE后面跟表名,然后是列定义。比如列名、数据类型、约束之类的。比如,如果我要创建一个员工表,可能需要员工ID、姓名、入职日期这些字段。每个字段的数据类型需要指定,比如VARCHAR2、NUMBER、DATE等。Oracle有自己的一些数据类型,比如VARCHAR2而不是VARCHAR,这点需要注意。 接下来,主键怎么设置呢?可以在列定义的时候直接指定PRIMARY KEY,或者在最后用CONSTRAINT来定义。比如,员工ID作为主键,应该这样写:employee_id NUMBER PRIMARY KEY,或者是在列定义完之后加上PRIMARY KEY (employee_id)。这两种方式有什么区别吗?可能后者更适合复合主键的情况,如果是单列主键,直接在列后面写更简洁。 还有,是否需要考虑约束,比如NOT NULL约束?比如,姓名和入职日期这些字段不能为空,应该在列定义时加上NOT NULL。例如,employee_name VARCHAR2(50) NOT NULL。这样在插入数据时,这些字段就不能留空了。 另外,关于外键约束,如果这个表需要引用其他表的列,比如部门ID引用部门表的部门ID,那么应该在CREATE TABLE语句中添加FOREIGN KEY约束。比如,department_id NUMBER REFERENCES departments(department_id),或者用CONSTRAINT语句来命名外键约束,这样在出错时更容易识别。 还有默认值的问题,比如入职日期如果未指定,默认是当前日期,可以使用DEFAULT SYSDATE。这样在插入数据时,如果不提供入职日期,就会自动填入当前时间。 索引需要现在创建吗?可能不需要,索引一般在表创建后根据查询需求再添加。不过主键会自动创建索引,所以不需要额外处理。 表空间的问题,如果不指定的话,Oracle会使用用户的默认表空间。如果需要指定,可以在CREATE TABLE后面加上TABLESPACE参数,但如果是初学者,可能暂时不需要考虑这个。 示例的话,应该包括这些元素:表名、列名、数据类型、主键、约束、默认值等。比如: CREATE TABLE employees ( employee_id NUMBER PRIMARY KEY, employee_name VARCHAR2(50) NOT NULL, hire_date DATE DEFAULT SYSDATE, department_id NUMBER, CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments(department_id) ); 这样应该就涵盖了基本的结构。如果有部门表不存在,可能需要先创建部门表,否则外键会报错。所以在实际应用中,需要确保引用的表已经存在。 另外,是否需要分区表?对于初学者来说,可能暂时用不到分区表,所以可以暂时忽略这部分。 关于存储参数,比如INITIAL、NEXT等,可能在创建表时不需要特别指定,除非有性能优化的需求,但基础创建表的结构不需要这些。 总结一下,创建表的基本步骤是: 1. 使用CREATE TABLE语句,指定表名。 2. 定义各个列的名称、数据类型、约束。 3. 定义主键和外键约束。 4. 设置默认值和其他约束如NOT NULL。 可能还需要注意Oracle的数据类型和长度限制,比如VARCHAR2的最大长度是4000字节,而NUMBER可以指定精度和小数位。 现在,我需要验证这些步骤是否正确。比如,主键是否只能有一个,约束的名称是否可选,外键引用的列是否存在,默认值是否有效等。比如,DEFAULT SYSDATE在Oracle中是有效的,可以正确设置默认日期。 另外,如果表已经存在,创建时会报错,所以可能需要先检查是否存在,或者使用CREATE TABLE IF NOT EXISTS,但Oracle似乎不支持IF NOT EXISTS子句,所以需要先手动删除或确保表名唯一。 最后,提供一个示例,并指出需要注意的地方,比如外键依赖、数据类型选择等,这样用户在实际操作时可以避免常见错误。</think>在 Oracle 数据库中创建表需要使用 `CREATE TABLE` 语句,具体语法如下: ```sql CREATE TABLE 表名 ( 列名1 数据类型 [约束], 列名2 数据类型 [约束], ... [CONSTRAINT 约束名] PRIMARY KEY (列名), [CONSTRAINT 约束名] FOREIGN KEY (列名) REFERENCES 关联表名(关联列名) ); ``` ### 示例:创建员工表 假设需要创建一个员工表 `employees`,包含员工ID、姓名、入职日期和部门ID,语法如下: ```sql CREATE TABLE employees ( employee_id NUMBER PRIMARY KEY, employee_name VARCHAR2(50) NOT NULL, hire_date DATE DEFAULT SYSDATE, department_id NUMBER, CONSTRAINT fk_department FOREIGN KEY (department_id) REFERENCES departments(department_id) ); ``` ### 关键说明 1. **数据类型**: - `NUMBER`:数值类型,可指定精度(如 `NUMBER(10)`)。 - `VARCHAR2(长度)`:可变长度字符串,最大 4000 字节。 - `DATE`:日期和时间类型。 - 其他类型如 `CLOB`、`BLOB` 等根据需求选择[^1]。 2. **约束**: - `PRIMARY KEY`:主键约束(唯一且非空),可单独定义或内联。 - `FOREIGN KEY`:外键约束,需引用其他表的主键。 - `NOT NULL`:强制列非空。 - `DEFAULT`:设置默认值(如 `DEFAULT SYSDATE` 表示默认当前日期)[^2]。 3. **外键依赖**: - 示例中引用了 `departments` 表的 `department_id`,需确保该表已存在。 ### 注意事项 - 表名和列名需遵循命名规范(字母开头,仅包含字母、数字、`_`、`$`、`#`)。 - 主键自动创建唯一索引。 - 若需修改表结构(如添加列),使用 `ALTER TABLE` 语句。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值