Câu hỏi liên quan

0 Phiếu
1 Trả lời
0 Phiếu
0 Câu trả lời
0 Phiếu
0 Câu trả lời
0 Phiếu
0 Câu trả lời
0 Phiếu
0 Câu trả lời

INSERT của 10 triệu truy vấn dưới 10 phút trong Oracle?


0 Phiếu
Đã hỏi 24/5/2016 bởi gbbToo (199,900 điểm)
Tôi đang làm việc trên một chương trình nạp file . Mục đích của program này là để có một tập tin input , làm một số chuyển đổi trên data của nó và sau đó tải lên data thành database của Oracle. Vấn đề mà tôi đang phải đối mặt là tôi cần để tối ưu hóa chèn của rất lớn input data trên Oracle. Tôi đang tải lên data vào bảng, cho phép nói ABC. Tôi đang sử dụng library OCI cung cấp bởi Oracle trong chương trình c của tôi. Trong cụ thể, tôi đang sử dụng hồ bơi kết nối OCI cho các đa luồng và tải vào ORACLE. ( http://docs.oracle.com/cd/ B28359 _01/appdev.111/b28395/oci09adv.htm ) Dưới đây là những điều khoản DDL đã được sử dụng để tạo ra ABC table -
CREATE TABLE ABC(
   seq_no         NUMBER NOT NULL,
   ssm_id         VARCHAR2(9)  NOT NULL,
   invocation_id  VARCHAR2(100)  NOT NULL,
   analytic_id    VARCHAR2(100) NOT NULL,
   analytic_value NUMBER NOT NULL,
   override       VARCHAR2(1)  DEFAULT  'N'   NOT NULL,
   update_source  VARCHAR2(255) NOT NULL,
   last_chg_user  CHAR(10)  DEFAULT  USER NOT NULL,
   last_chg_date  TIMESTAMP(3) DEFAULT  SYSTIMESTAMP NOT NULL
);
CREATE UNIQUE INDEX ABC_indx ON ABC(seq_no, ssm_id, invocation_id, analytic_id);
/
CREATE SEQUENCE ABC_seq;
/
CREATE OR REPLACE TRIGGER ABC_insert
BEFORE INSERT ON ABC
FOR EACH ROW
BEGIN
SELECT ABC_seq.nextval INTO :new.seq_no FROM DUAL;
END;
tôi hiện đang sử dụng các mẫu truy vấn sau đây để tải lên data vào cơ sở dữ liệu. Tôi gửi cho data trong lô 500 truy vấn thông qua các chủ đề khác nhau của các hồ bơi kết nối OCI. Mẫu SQL đưa vào sử dụng - query
insert into ABC (SSM_ID, invocation_id , calc_id, analytic_id, analytic_value,
override, update_source)
select 'c','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'a','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'b','b',NULL, 'test', 123 , 'N', 'asdf' from dual
union all select 'c','g',NULL, 'test', 123 , 'N', 'asdf' from dual
EXECUTION PLAN bởi Oracle cho ở trên query -
-----------------------------------------------------------------------------
| Id  | Operation                | Name|Rows| Cost (%CPU) | Time     |
-----------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |     | 4  |     8   (0) | 00:00:01 |
|   1 |  LOAD TABLE CONVENTIONAL | ABC |    |             |          |
|   2 |   UNION-ALL              |     |    |             |          |
|   3 |    FAST DUAL             |     | 1  |     2   (0) | 00:00:01 |
|   4 |    FAST DUAL             |     | 1  |     2   (0) | 00:00:01 |
|   5 |    FAST DUAL             |     | 1  |     2   (0) | 00:00:01 |
|   6 |    FAST DUAL             |     | 1  |     2   (0) | 00:00:01 |
The Run lần program nạp 1 triệu dòng -
Batch Size = 500
Number of threads - Execution Time -
10                  4:19
20                  1:58
30                  1:17
40                  1:34
45                  2:06
50                  1:21
60                  1:24
70                  1:41
80                  1:43
90                  2:17
100                 2:06

Average Run Time = 1:57    (Roughly 2 minutes)
tôi cần để tối ưu hóa và giảm bớt thời gian này hơn nữa. Vấn đề tôi đang phải đối mặt với là khi tôi đặt hàng 10 triệu cho tải lên. Mức trung bình thời gian để 10 triệu chạy ra đến để = 21 phút (mục tiêu của tôi là để giảm thời gian này để dưới 10 phút) vì vậy tôi đã cố gắng sau bước cũng - [1] đã làm phân vùng của ABC table trên cơ sở seq_no . Sử dụng 30 phân vùng . Thử nghiệm với 1 triệu hàng - hiệu suất là rất nghèo. hầu như 4 lần nhiều hơn các bảng unpartitioned. [2] một phân vùng của ABC table trên cơ sở last_chg_date . Sử dụng 30 phân vùng . 2.a) thử nghiệm với 1 triệu hàng - hiệu suất là gần như tương đương với bảng unpartitioned. rất ít sự khác biệt đã có vì vậy, nó không được xem xét. 2.b) một lần nữa thử nghiệm tương tự với 10 triệu hàng. Hiệu suất là gần như tương đương bảng unpartitioned. Không có sự khác biệt đáng chú ý. Sau đây là DDL lệnh được sử dụng để đạt được phân vùng -
  CREATE TABLESPACE ts1 DATAFILE AUTOEXTEND
 CREATE TABLESPACE ts2 DATAFILE AUTOEXTEND ON;
 CREATE TABLESPACE ts3 DATAFILE AUTOEXTEND ON;
 CREATE TABLESPACE ts4 DATAFILE AUTOEXTEND ON;
 CREATE TABLESPACE ts5 DATAFILE AUTOEXTEND ON;
 CREATE TABLESPACE ts6 DATAFILE AUTOEXTEND ON;
 CREATE TABLESPACE ts7 DATAFILE AUTOEXTEND ON;
 CREATE TABLESPACE ts8 DATAFILE AUTOEXTEND ON;
 CREATE TABLESPACE ts9 DATAFILE AUTOEXTEND ON;
 CREATE TABLESPACE ts10 DATAFILE AUTOEXTEND ON;
 CREATE TABLESPACE ts11 DATAFILE AUTOEXTEND ON;
 CREATE TABLESPACE ts12 DATAFILE AUTOEXTEND ON;


CREATE TABLESPACE ts14 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts15 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts16 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts17 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts18 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts19 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts20 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts21 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts22 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts23 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts24 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts25 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts26 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts27 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts28 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts29 DATAFILE AUTOEXTEND ON;
CREATE TABLESPACE ts30 DATAFILE AUTOEXTEND ON;
CREATE TABLE ABC(
   seq_no           NUMBER NOT NULL,
   ssm_id           VARCHAR2(9)  NOT NULL,
   invocation_id    VARCHAR2(100)  NOT NULL,
   calc_id          VARCHAR2(100) NULL,
   analytic_id      VARCHAR2(100) NOT NULL,
   ANALYTIC_VALUE   NUMBER NOT NULL,
   override         VARCHAR2(1)  DEFAULT  'N'   NOT NULL,
   update_source    VARCHAR2(255) NOT NULL,
   last_chg_user    CHAR(10)  DEFAULT  USER NOT NULL,
   last_chg_date    TIMESTAMP(3) DEFAULT  SYSTIMESTAMP NOT NULL
)
PARTITION BY HASH(last_chg_date)
PARTITIONS 30
STORE IN (ts1, ts2, ts3, ts4, ts5, ts6, ts7, ts8, ts9, ts10, ts11, ts12, ts13,
ts14, ts15, ts16, ts17, ts18, ts19, ts20, ts21, ts22, ts23, ts24, ts25, ts26,
ts27, ts28, ts29, ts30);
CODE that I am using in the thread function (written in C++), using OCI -
void OracleLoader::bulkInsertThread(std::vector<std::string> const & statements)
{
    try
    {
        INFO("ORACLE_LOADER_THREAD","Entered Thread = %1%", m_env);
        string useOraUsr = "some_user";
        string useOraPwd = "some_password";
        int user_name_len   = useOraUsr.length();
        int passwd_name_len = useOraPwd.length();
        text* username((text*)useOraUsr.c_str());
        text* password((text*)useOraPwd.c_str());

        if(! m_env)
        {
            CreateOraEnvAndConnect();
        }
        OCISvcCtx *m_svc = (OCISvcCtx *) 0;
        OCIStmt *m_stm = (OCIStmt *)0;
        checkerr(m_err,OCILogon2(m_env,
                                 m_err,
                                 &m_svc,
                                 (CONST OraText *)username,
                                 user_name_len,
                                 (CONST OraText *)password,
                                 passwd_name_len,
                                 (CONST OraText *)poolName,
                                 poolNameLen,
                                 OCI_CPOOL));
        OCIHandleAlloc(m_env, (dvoid **)&m_stm, OCI_HTYPE_STMT, (size_t)0, (dvoid **)0);
////////// Execution Queries in the format of - /////////////////
//        insert into pm_own.sec_analytics (SSM_ID, invocation_id , calc_id, analytic_id, analytic_value

Xin vui lòng đăng nhập hoặc đăng ký để trả lời câu hỏi này.


ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...