Sql server ORACLE表性能基础

Sql server ORACLE表性能基础,sql-server,oracle11g,migration,database-administration,Sql Server,Oracle11g,Migration,Database Administration,完全是Oracle数据库的新手,但仍在尝试将SQL Server数据库(2008R2)迁移到Oracle(11g-总数据库大小仅为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 NU

完全是Oracle数据库的新手,但仍在尝试将SQL Server数据库(2008R2)迁移到Oracle(11g-总数据库大小仅为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;
通过一些基本测试,一个简单的“从TableW中删除,其中PID=13455”似乎需要花费大量时间(~880秒)来执行快速删除(~350行)。[通过SQL Developer运行查询]

通常,此表的性能明显低于其SQL等效表。SQL Server下没有任何问题,而且与SQL相比,Oracle的此表和周围表的结构看起来是合理的

我的问题是,我无法找到一套有用的诊断方法来开始寻找问题所在。非常感谢您的任何查询/链接


[以上是一个请求帮助的请求,基于这样一个假设:从一个包含3000万条记录的表中删除350行不需要10分钟,但需要SQL Server如果您问我们如何提高性能,那么有几种方法可以提高性能:

并行DML消耗了执行该操作所需的所有资源。Oracle运行多个线程来完成该操作。其他会话必须等待该操作结束,因为系统资源正忙


分区允许您立即排除旧分区。例如,您的表存储2000到2014年的数据。很可能您不需要旧记录,因此可以将表拆分为多个分区并排除最旧的分区。

检查正在执行删除的会话的等待事件。这将告诉您主要的瓶颈是什么是

与上面Marco的评论相呼应——确保您的表统计数据是最新的——这将有助于优化器为您构建一个良好的计划来运行这些查询。

要更新所有查询(如果其他任何人发现这一点):

找到解决方案的正确问题是:您有哪些表引用了此表

问题是另一张表(我们称之为TableV)使用WID作为外键,但TableV中的WID列未被索引。这意味着对于TableW中的每一条记录删除,必须搜索整个TableV以查找要删除的关联记录。由于TableV>300万行,删除TableV中350行的小集合意味着Oracle服务器试图读取总计>10亿行的记录


表V中的WID中添加了一个索引,delete语句现在需要改进性能,这是第二步-首先,我必须知道我迁移的结构是否有问题…问题出在哪里?是否运行了脚本?是否看到任何错误?注意,添加到初始问题:以上是基于假设从一个包含3000万条记录的表中删除350行不应超过10分钟。我们怎么知道?您可以在具有32MB内存的Intel celeron处理器上运行,也可以在其中一台超级计算机上运行。您必须尝试,然后您会发现是否需要超过10分钟的时间才能看到问题atement:我正在从SQL Server迁移到Oracle。我正在运行查询“从TableW中删除,其中PID=13455”。此查询在SQL Server下运行正常(运行10分钟)如何诊断Oracle下的问题?Oracle中是否存在索引碎片?如果您在加载数据之前创建了所有索引,但之后没有重建它们,那么很可能,
WClusterIndex
索引将严重碎片化,甚至无法使用。这就是我正在考虑的事情当然-请查看我的编辑,看看迁移过程中是否有任何明显的错误。我根本不了解Oracle,但您可以尝试删除并重新创建索引。任何ETL的最佳实践是在加载之前删除索引(当然是在目标端)并在之后创建。这不仅更快,而且可以减少碎片。您收集了表上的统计信息吗?
exec dbms\u stats.gather\u table\u stats(用户,'table\u W');
@MarcoBaldelli-是的,它对执行时间没有影响。表统计信息是最新的,最大值(数字和总时间)在V$SESSION_事件中,给定会话的事件用于“db file Distributed read”(不包括“SQL*NET message from client”)。这意味着大部分时间纯粹用于读取整个表,不是吗?如果列被索引,为什么会这样?
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