完成Oracle DBA-ing的新手,然后尝试将SQL Server DB(2008R2)迁移到Oracle(11g - 总DB大小仅为20Gb)......
我的最大单桌(约3000万行)存在重大问题。表的粗略结构是:
CREATE TABLE TableW (
WID NUMBER(10,0) NOT NULL,
PID NUMBER(10,0) NOT NULL,
CID NUMBER(10,0) NOT NULL
ColUnInteresting1 NUMBER(3,0) NOT NULL,
ColUnInteresting2 NUMBER(3,0) NOT NULL,
ColUnInteresting3 FLOAT NOT NULL,
ColUnInteresting4 FLOAT NOT NULL,
ColUnInteresting5 VARCHAR2(1024 CHAR),
ColUnInteresting6 NUMBER(3,0) NOT NULL,
ColUnInteresting7 NUMBER(5,0) NOT NULL,
CreatedDate DATE NOT NULL,
ModifiedDate DATE NOT NULL,
CreatedByUser VARCHAR2(20 CHAR),
ModifiedByUser VARCHAR2(20 CHAR)
);
ALTER TABLE TableW ADD CONSTRAINT WPrimaryKey PRIMARY KEY (WID)
ENABLE;
CREATE INDEX WClusterIndex ON TableW (PID);
CREATE INDEX WCIDIndex ON TableW (CID);
ALTER TABLE TableW ADD CONSTRAINT FKTableC FOREIGN KEY (CID)
REFERENCES TableC (CID) ON DELETE CASCADE
ENABLE;
ALTER TABLE TableW ADD CONSTRAINT FKTableP FOREIGN KEY (PID)
REFERENCES TableP (PID) ON DELETE CASCADE
ENABLE;
运行一些基础测试,似乎一个简单的'DELETE FROM TableW WHERE PID = 13455'需要花费大量时间(~880s)来执行应该快速删除(~350行)。 [通过SQL Developer运行查询]。
通常,此表的性能明显差于其SQL等价物。 SQL Server下没有任何问题,与SQL相比,此表的结构及其周围的结构对Oracle来说是合理的。
我的问题是我找不到一套有用的诊断来开始寻找问题所在。任何疑问/链接都非常感谢。
[以上是一个帮助请求,基于这样一个假设,它不应该花费10分钟来删除具有3000万条记录的表中的350行,当需要SQL Server< 1s来执行相同的等效操作时数据库结构]
修改 因此正在进行迁移:
1 In SQL developer:
- Create Oracle User, tablespace, grants etc AS Sys
- Create the tables, sequences, triggers etc AS New User
2 Via some Java:
- Check SQL-Oracle structure consistency
- Disable all foreign keys
- Move data (Truncate destination table, Select From Old, Insert Into New)
- Adjust sequences to correct starting value
- Enable foreign keys
答案 0 :(得分:0)
如果您问我们如何提高性能,那么有几种方法可以改进它:
并行DML会占用您执行操作所需的所有资源。 Oracle运行多个线程来完成操作。其他会话必须等待操作结束,因为系统资源很忙。
分区可让您立即排除旧版块。例如,您的表存储了2000年到2014年的数据。很可能您不需要旧记录,因此您可以将表拆分为多个分区并排除最旧的分区。
答案 1 :(得分:0)
检查执行DELETE的会话的等待事件。这将告诉你你的主要瓶颈是什么。
并回应上面的Marco评论 - 确保您的表统计信息是最新的 - 这将有助于优化程序构建一个良好的计划来为您运行这些查询。
答案 2 :(得分:0)
更新所有内容(如果有其他人发现此内容):
找到解决方案的正确问题是:您引用了哪一个表?
问题是另一个表(我们称之为TableV)使用WID作为外键,但TableV中的WID列未编入索引。这意味着对于TableW中的每个记录删除,必须搜索整个TableV以查找要删除的相关记录。由于TableV大于300万行,因此删除TableV中350行的一小组意味着Oracle服务器试图读取总计> 10亿行。
在TableV中添加到WID的单个索引,现在删除语句采用< 1s。
感谢大家的评论 - 很多Oracle内部工作都学到了!