index_join by the rowid of the table?

Let's say you have a table like

(t)

int ID1,

ID2 int,

varchar (4000) textColumn1,.

varchar (4000) textColumn2,.

varchar (4000) textColumn3

)

And you have the index of individual columns on ID1 and ID2; composite index.  In my situation, I can't create an index composite (ID1, ID2).  But if I understand correctly, internally that both indices ID1 and ID2 are arranged as:

Id1.1 rowid.3

Id1.2 rowid.2

Id1.3 rowid.4

Id1.4 rowid.1

Id2.1 rowid.1

Id2.2 rowid.2

Id2.3 rowid.3

Id2.4 rowid.4

So, if you did

Select ID1 in t

where ID2 > 2;

A theoretically possible implementation plan would be to open the index the ID2 and ID1, find the ROWID for ID2, coincide with those against the ROWID in ID1, then pull the ID1 values directly from the index.  But any advice I launch in, (as index_join(), index(), opt_param ('_index_join_enabled', true) opt_param('optimizer_index_cost_adj',1), etc., he don't y no plan that never presented that does not open the table.)  And that's a problem because the table is actually quite massive and full of large columns.  So do a scatter read through the massive tablespace for this table is so much more expensive that just read the two indexes, even in their entirety.

So is there a restriction that prevents pull the index values ID1, that has something to do with the insulation or missing/transaction null values or something?  Did I miss an optimization to make it work, or Oracle (11.2.0.4, I think) ever implementation of an index_join across two indexes to single column?

It works for me in 12.1.0.2 if I do the column you want to select NOT NULL. This makes sense because otherwise the rowid would not appear in the index (although I don't see why that just cannot be interpreted as NULL). This also works if you filter nulls.

SQL > create table t_1 (id1 number, id2 number, colonne_1 varchar2 (4000));

Table created.

SQL > create index t_1_idx_01 on t_1 (id1);

The index is created.

SQL > create index t_1_idx_02 on t_1 (id2);

The index is created.

SQL > explain the plan for
2 Select / * + INDEX_JOIN (t t_1_idx_01) INDEX_JOIN (t_1_idx_02 t) * / id2 t_1 t where id1 =: X;

He explained.

SQL > @x

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------
Hash value of plan: 4181077581

--------------------------------------------------------------------------------------------------
| ID | Operation | Name | Lines | Bytes | Cost (% CPU). Time |
--------------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT |            |    1.    26.    1 (0) | 00:00:01 |
|  1.  TABLE ACCESS BY ROWID INDEX BATCH | T_1        |    1.    26.    1 (0) | 00:00:01 |
|*  2 |  INDEX RANGE SCAN | T_1_IDX_01 |    1.      |    1 (0) | 00:00:01 |
--------------------------------------------------------------------------------------------------

Information of predicates (identified by the operation identity card):
---------------------------------------------------

2 - access ('ID1' = TO_NUMBER (:X))

Note
-----
-the dynamic statistics used: dynamic sampling (level = 2)

18 selected lines.

SQL > alter table t_1 change id2 not null;

Modified table.

SQL > explain the plan for
2 Select / * + INDEX_JOIN (t t_1_idx_01) INDEX_JOIN (t_1_idx_02 t) * / id2 t_1 t where id1 =: X;

He explained.

SQL > @x

PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------------------
Hash value of plan: 1085250311

-------------------------------------------------------------------------------------------
| ID | Operation | Name | Lines | Bytes | Cost (% CPU). Time |
-------------------------------------------------------------------------------------------
|  0 | SELECT STATEMENT |                  |    1.    26.    2 (0) | 00:00:01 |
|*  1 |  VIEW                  | the index $ _join$ _001.    1.    26.    2 (0) | 00:00:01 |
|*  2 |  HASH JOIN |                  |      |      |            |          |
|*  3 |    INDEX RANGE SCAN | T_1_IDX_01 |    1.    26.    1 (0) | 00:00:01 |
|  4.    FULL RESTRICTED INDEX SCAN FAST | T_1_IDX_02 |    1.    26.    1 (0) | 00:00:01 |
-------------------------------------------------------------------------------------------

Information of predicates (identified by the operation identity card):
---------------------------------------------------

1 Filter ('ID1' = TO_NUMBER (:X))
2 - access (ROWID = ROWID)
3 - access ('ID1' = TO_NUMBER (:X))

Note
-----
-the dynamic statistics used: dynamic sampling (level = 2)

22 selected lines.

SQL > alter table t_1 change id2 null;

Modified table.

SQL > explain the plan for
2 Select / * + INDEX_JOIN (t t_1_idx_01) INDEX_JOIN (t_1_idx_02 t) * / id2 t_1 t where id1 =: X and id2 is not null;

He explained.

SQL > @x

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------------------------------------------
Hash value of plan: 1085250311

-------------------------------------------------------------------------------------------
| ID | Operation | Name | Lines | Bytes | Cost (% CPU). Time |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |                  |     1.    26.     2 (0) | 00:00:01 |
|*  1 |  VIEW                  | the index $ _join$ _001.     1.    26.     2 (0) | 00:00:01 |
|*  2 |   HASH JOIN |                  |       |       |            |          |
|*  3 |    INDEX RANGE SCAN | T_1_IDX_01 |     1.    26.     1 (0) | 00:00:01 |
|*  4 |    FULL RESTRICTED INDEX SCAN FAST | T_1_IDX_02 |     1.    26.     1 (0) | 00:00:01 |
-------------------------------------------------------------------------------------------

Information of predicates (identified by the operation identity card):
---------------------------------------------------

1 Filter ('ID1' = TO_NUMBER (:X))
2 - access (ROWID = ROWID)
3 - access ('ID1' = TO_NUMBER (:X))
4 - filter ("ID2" IS NOT NULL)

Note
-----
-the dynamic statistics used: dynamic sampling (level = 2)

23 selected lines.

Your columns of text are very large, what is your block size? Under the value by default 8 k blocks, if your lines are completely filled while they are chained, and readings by rowid will be additional i/o. Consider measures to avoid migration of line and row chaining. In my view, this could be the reason for your index access is so slow.

Have a read of https://docs.oracle.com/database/121/TGDBA/pfgrf_instance_tune.htm#TGDBA024 10.2.4.3 Table Fetch by row continues to see the impact and ways to circumvent migrated/chained rows.

If you select a large number of rows in the table the issue would become so what do you intend to do with so many? Is it possible that you could reduce the number of lines you choose?

Tags: Database

Similar Questions

  • determine if the table is use rowid and urowid

    Database: Oracle Database 11 g Enterprise Edition Release 11.2.0.3.0 - 64 bit Production

    How can we determine whether a table is with rowid and urowid?

    Thank you.

    >
    How can we determine whether a table is with rowid and urowid?
    >
    Oracle uses a type of ROWID data for all tables; Physical ROWID logical ROWID for the tables organized by index and ordinary tables.

    You, the user can also use a ROWID data type and you can use a data UROWID type.

    Even if you do not use a real Oracle data type provides a virtual ROWID that you can query. The virtual only takes place in the table but is built on the fly if you use it in a query.
    ROWID values are actually stored in the index, but not stored in the tables unless the user sets a ROWID column.

    There is no virtual UROWID. If you try to add a query, you will get an exception

    select rowid, urowid, e.* from emp e
    
    ORA-00904: "UROWID": invalid identifier
    

    Refer to the 'presentation of ROWID and UROWID Datatypes' and "The virtual ROWID" in database Concepts
    http://docs.Oracle.com/CD/B28359_01/server.111/b28318/datatype.htm#i6732

    This article has a detailed explanation of the ROWID, UROWID. data types, the virtual and how Oracle uses.

  • Error when try to use the rowid with the table alias

    I tried using a table alias to test the functions of Manager of rules and met the following problems.

    1. I have clone from a schema HR employees and departments tables.

    2. create data as follows:

    BEGIN
    dbms_rlmgr.create_event_struct (data = > 't_a');
    dbms_rlmgr.add_elementary_attribute (data = > 't_a',)
    attr_name = > "a_employees"
    tab_alias = > exf$ table_alias ('employees'));
    dbms_rlmgr.add_elementary_attribute (data = > 't_a',)
    attr_name = > "a_departments"
    tab_alias = > exf$ table_alias ('departments'));
    END;

    3. create the class rule as follows:

    BEGIN
    dbms_rlmgr.create_rule_class (rule_class = > 't_as',)
    Event_Struct = > 't_a. "
    action_cbk = > 't_acb ',.
    rslt_viewnm = > 't_arv');
    END;

    4. After adding a rule to the rule class, I try to test as follows

    DECLARE
    r_emp ROWID.
    r_dept ROWID.
    CURSOR a_cur IS
    SELECT emp. ROWID, Dept. ROWID
    Employees OF ministries dept (IEM),
    WHERE emp.department_id = dept.department_id;
    I have NUMBER: = 1;
    BEGIN
    OPEN a_cur;
    LOOP
    EXTRACTION a_cur
    IN r_emp, r_dept;
    EXIT WHEN a_cur % NOTFOUND;
    dbms_output.put_line (i);
    i: = i + 1;
    dbms_output.put_line (r_emp);
    dbms_rlmgr.add_event (rule_class = > 't_alia',)
    event_inst = > r_emp,
    event_type = > 'employees');
    dbms_rlmgr.add_event (rule_class = > 't_alia',)
    event_inst = > r_dept,
    event_type = > "departments");
    END LOOP;
    END;

    But I got the following error

    SQL > DECLARE
    2 r_emp ROWID.
    3 r_dept ROWID.
    4 a_cur CURSOR IS
    5. SELECT emp. ROWID, Dept. ROWID
    6 employees OF ministries dept (IEM),
    7 WHERE emp.department_id = dept.department_id;
    8 I COMP: = 1;
    BEGIN 9
    10 a_cur OPEN;
    11 LOOP
    12 FETCH a_cur
    13. IN r_emp, r_dept;
    EXIT 14 WHEN a_cur % NOTFOUND;
    15 dbms_output.put_line (i);
    16 I: = i + 1;
    17 dbms_output.put_line (r_emp);
    18 dbms_rlmgr.add_event (rule_class = > 't_alia',)
    19 event_inst = > r_emp,
    20 event_type = > 'employees');
    21 dbms_rlmgr.add_event (rule_class = > 't_alia',)
    22 event_inst = > r_dept,
    23 event_type = > "departments");
    24 END LOOP;
    25 END;
    26.
    DECLARE
    *
    ERROR on line 1:
    ORA-06550: line 1, column 36:
    PLS-00201: identifier 'AAAVN9AAEAAAQH8AAA' must be declared.
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    ORA-06512: at "EXFSYS. DBMS_RLMGR', line 974
    ORA-06512: at line 18 level

    Hello

    ROWID for individual tables can be added as events only if the rule class is set up as a Composite. For all other cases, ROWID is treated as data and they need to be formatted as a string of instances of AnyData or name-value pairs. Your script is to think that you intend to create a composite rule class while you might add ROWID individually. If please, recreate the rule as a composite class and try again. The error message you received is incorrect and has been corrected to indicate that the error is with the format data point past.

    Hope this helps,
    -Aravind.

  • How to filter the tables on pages of body only?

    I have the following code to manage the tables:

    for (F_ObjHandleT tableId = F_ApiGetId(FV_SessionId, docId, FP_FirstTblInDoc); tableId; tableId = F_ApiGetId(docId, tableId, FP_NextTblInDoc))
    {
      for (F_ObjHandleT rowId = F_ApiGetId(docId, tableId, FP_FirstRowInTbl); rowId; rowId = F_ApiGetId(docId, rowId, FP_NextRowInTbl))
      {
        for (F_ObjHandleT cellId = F_ApiGetId(docId, rowId, FP_FirstCellInRow); cellId; cellId = F_ApiGetId(docId, cellId, FP_NextCellInRow))
        {
           ...
        }
      }
    }
    

    How can I get only the tables that exist in the body pages. I want to filter these alone...

    Help, please.

    The function that it works. Thank you.

  • How to create faster index in the table of 500 GB

    Dear Experts,

    I have to create 20 index on table data-ware house. This table is of size 500 GB.

    freshen up this weekly chart using the external table.

    creating 20 indexes on this table consumes a lot of time.

    I have 40 GB of ram on 2012 box windows with 8 processors.

    I installed 11 GR 2.

    I have 4 drives C D E F

    for AN index, it takes 4 hours


    I added enough space to the tablespace

    I put the tablespace in a drive D:\


    I'm under control to create indexes below

    create index  X_3_INVEN_ITEM_ID_IDX  on   X_3_PV_TD_2 (INVENTORY_ITEM_ID)  parallel 32 nologging;
    
    

    output long ops

    SID, SERIAL # CONTEXT SOFAR TOTALWORK LESS TARGET % _COMPLETE TIME_REMAINING

    ---------- ---------- ---------- ---------- ---------- ---------------------------------------------------------------- ---------------------------------------------------------------- ---------- --------------

    108 10 0 3758 140973 Rowid Scan AD range. X_3_PV_TD_2                                    2.67            256

    173 23 0 5279 141470 Rowid Scan AD range. X_3_PV_TD_2                                    3.73            258

    114 6 0 10092 141786 Rowid Scan AD range. X_3_PV_TD_2                                    7.12            261

    99         59          0      46283     325908 Sort Output                                                                                                                     14.2          15207

    68        214          0      46763     323623 Sort Output                                                                                                                    14.45          14973

    35         93          0      47531     318364 Sort Output                                                                                                                    14.93          14570

    164         70          0      45058     288506 Sort Output                                                                                                                    15.62          12886

    227         31          0      44130     282285 Sort Output                                                                                                                    15.63          13011

    13          3          0      51890     309515 Sort Output                                                                                                                    16.76          12874

    222 67 0 28837 141380 Rowid Scan AD range. X_3_PV_TD_2                                    20.4            343

    73 37 0 32472 141488 Rowid Scan AD range. X_3_PV_TD_2 22.95 212

    47 8 0 34332 141154 Rowid Scan AD range. X_3_PV_TD_2 24,32 202

    176 20 0 35197 141161 Rowid Scan AD range. X_3_PV_TD_2 24.93 205

    19 7 0 35239 141325 Rowid Scan AD range. X_3_PV_TD_2 24.93 205

    80 4 0 40399 141611 Rowid Scan AD range. X_3_PV_TD_2 28,53 193

    144 20 0 44960 141481 Rowid Scan AD range. X_3_PV_TD_2 31,78 182

    233 101 0 74086 169228 Rowid Scan AD range. X_3_PV_TD_2 43,78 176

    128 165 0 78765 141436 Rowid Scan AD range. X_3_PV_TD_2 55.69 173

    235 1 0 41199796 70035728 table Scan AD. X_3_PV_TD_2 58,83 19804

    199 6 0 52748651 70035728 table Scan AD. X_3_PV_TD_2 75,32-9709

    44 2 0 53686039 70035728 table Scan AD. X_3_PV_TD_2 76,66 9022

    204 26 0 119969 141464 Rowid Scan AD range. X_3_PV_TD_2                                   84.81             40

    202 48 0 138880 162276 Rowid Scan AD range. X_3_PV_TD_2                                   85.58             43

    17 33 0 126506 141778 Rowid Scan AD range. X_3_PV_TD_2                                   89.23             28

    48 7 0 137772 141360 Rowid Scan AD range. X_3_PV_TD_2                                   97.46             15

    Temp tablespace


    USED_MB USED TOT_MB % NOM_TABLESPACE

    ------------------------------ ---------- ---------- ----------
    TEMP 11533 286719 4.02

    temporary tables

    OWNER SEGMENT_NAME SEGMENT_TY TABLESPACE_NAME EXTENTS BYTES_
    ---------- ------------------------------ ---------- -------------------- ---------- ---------------
    AD 156.1601650 TEMPORARY USERS 96 209,715,200

    Question:

    How to fix this?

    (a) run several parallel create sqlplus statement index different sessions

    (b) create a tablespace to put data files in different hard drives like D: E: F: C:

    (c) create the separate tablespace for each hard drive and map it to a single disk IO benefit

    (d) I have 8 processors but parallel 32 is not speed

    (e) how these clues I can run in parallel. Is it OK to run 20 parallel index 32 sqlplus sessions

    All that I have to create 20 index on the table of 500 GB

    target memory = 30GB

    index of names to create 20, each index is 10 GB

    his is of 80 hours (4 hours per index)

    This machine is waiting, I just used all the resources of the machine to accelerate.

    Thanks for reading this

    Thanks for the help in advance

    I was talking about your end of issue speed up construction of index, where I proposed

    orclz >

    orclz > alter session set workarea_size_policy = manual;

    Modified session.

    orclz > alter session set sort_area_size = 2147483647;

    Modified session.

    orclz > create index

    Post edited by: JohnWatson

    Sorry, I misread it: this question was not from you. My apologies. My solution should work for you, however: give yourself a big PGA, manually. Automatic PGA management using not will never give you enough.

  • insert into the summary table of the table.

    I was wondering if there is a smart way to do it with SQL, but I'm not sure. I would like to consult you yo guys.

    I have a table like this
     CREATE TABLE "TEMPLE_FINANCE"."TEST" 
       (     "COLUMN1" VARCHAR2(10 BYTE), 
         "COLUMN2" VARCHAR2(10 BYTE), 
         "COLUMN3" VARCHAR2(10 BYTE), 
         "COLUMN4" VARCHAR2(10 BYTE)
       ) ;
    
    
    Insert into TEST (COLUMN1,COLUMN2,COLUMN3,COLUMN4) values ('1','2','50.00',null);
    Insert into TEST (COLUMN1,COLUMN2,COLUMN3,COLUMN4) values ('1','2','50.00',null);
    I would like to at the rate of an update and you end up with
    "COLUMN1"     "COLUMN2"     "COLUMN3"     "COLUMN4"
    "1"                  "2"          "100.00"     
    What update statement can run for this?
    I would enter in the summary of the lines based on the column 1 and column2 and get rid of repeative lines.
    I have try this insert statement, but it's bascially just adding an extra record in the table.
    INSERT INTO  TEST (SELECT COLUMN1, COLUMN2, SUM(COLUMN3), COLUMN4 FROM TEST GROUP BY COLUMN1, COLUMN2,COLUMN4);
    any help would be grateful.

    Published by: mlov83 on January 25, 2013 12:45

    Published by: mlov83 on January 25, 2013 13:03

    Hello

    I can't help but wonder if you have the best design of table for what it is, you need to do.

    The best solution would be to create a new table, using the SUM (TO_NUMBER (Column3)) and GROUP BY, and then delete the original table and rename a new one to the old name. While you're at it, change Column3 as a NUMBER and add a primary key.

    In collaboration with just the existing table, INSERT one won't work. INSERT always adds new lines. You want something that can INSERT new lines (or update some existing routes) and DELETE lines at the same time. FUSION can do it all. Here's a way to use the MERGE:

    MERGE INTO     test     dst
    USING   (
              SELECT column1, column2, column4
              ,      SUM (TO_NUMBER (column3))
                                 OVER (PARTITION BY  column1, column2, column4)
                                AS column3_total
              ,      ROWID             AS r_id
              ,      MIN (ROWID) OVER (PARTITION BY  column1, column2, column4)
                                          AS min_r_id
              FROM    test
         )          src
    ON     (src.r_id     = dst.ROWID)
    WHEN MATCHED THEN UPDATE
    SET     dst.column3       = TO_CHAR ( src.column3_total
                                , 'FM9999999.00'
                            )
    DELETE
    WHERE     src.r_id     != src.min_r_id
    ;
    

    Published by: Frank Kulash on January 25, 2013 16:07

  • Update with no link between the tables

    Hi all
    Let us, considering what follows in 11g:
    SQL> create table t1 (col1 number , col2 number);
     
    Table created
     
    SQL> create table t2 (col1 number, col2 number);
     
    Table created
     
    SQL> insert into t1 values(1,2);
     
    1 row inserted
     
    SQL> insert into t1 values(2,3);
     
    1 row inserted
     
    SQL> insert into t1 values(3,4);
     
    1 row inserted
     
    SQL> insert into t2 values(5,6);
     
    1 row inserted
     
    SQL> insert into t2 values(7,8);
     
    1 row inserted
     
    SQL> insert into t2 values(9,10);
     
    1 row inserted
     
    SQL> commit;
     
    Commit complete
    How can I update the table T2 col1 - column - with values of column in table T1 - col2? No order no required - just the values :)
    Maybe it's simple, but I can't get there...

    Thanks in advance,
    Alexander.
    select *
    from t1;
    
    COL1 COL2
    ---- ----
       1    2
       2    3
       3    4 
    
    select *
    from t2;
    
    COL1 COL2
    ---- ----
       5    6
       7    8
       9   10 
    
    merge into t2
    using (
     select *
     from ( select rowid rid,row_number() over(order by null) rn1
              from t2
            ) a,
           (
             select t1.*,row_number() over(order by null) rn2
             from t1
           ) b
     where a.rn1 = b.rn2
          )   x
    on (t2.rowid = x.rid)
    when matched then update set t2.col1 = x.col2;
    
    3 rows merged.
    
    select *
    from t2;
    
    COL1 COL2
    ---- ----
       2    6
       3    8
       4   10 
    

    Published by: JAC on November 5, 2012 18:36
    Amended or the requirement

  • Delete rows from the table

    Hello

    10G

    A custom table is to have 5000 documents, I need to have everything 100 records in the table and delete the rest of them.
    could you suggest...

    Thank you
    Tim
    delete table_name where rowid not in (select rowid from table_name where rownum <101);
    
  • Update of the data in the table using LAG/LEAD

    Hello!

    I have a table that looks like:

    CREATE TABLE CUSTOMER_INFO_TEST
    (
    ACCOUNT_NUM VARCHAR2 (40 BYTE),
    PHONE VARCHAR2 (100 BYTE),
    E-MAIL VARCHAR2 (300 BYTE),
    DATE OF START_DT,
    DATE OF CHANGE_DT,
    END_DT DATE
    );

    The example data:

    INSERT INTO CUSTOMER_INFO_TEST VALUES ('BOB', 555-1234', ", TO_DATE ('2011-01-01', 'YYYY-MM-DD'), TO_DATE ('2011-01-06', 'YYYY-MM-DD'), TO_DATE ('2011-01-10', 'YYYY-MM-DD'));
    INSERT INTO CUSTOMER_INFO_TEST VALUES ('BOB', 555-1234', ' BOB@GMAIL.) COM', TO_DATE ('2011-01-01', 'YYYY-MM-DD'), TO_DATE ('2011-01-11', 'YYYY-MM-DD'), NULL);
    INSERT INTO CUSTOMER_INFO_TEST VALUES ('BOB', 555-1234', ' BOB@GMAIL.) COM', TO_DATE ('2011-01-01', 'YYYY-MM-DD'), TO_DATE ('2011-01-15', 'YYYY-MM-DD'), NULL);
    INSERT INTO CUSTOMER_INFO_TEST VALUES ('JACK', 555-4321', ", TO_DATE ('01-03-2011', 'YYYY-MM-DD'), TO_DATE ('2011-03-06', 'DD-MM-YYYY'), NULL);
    INSERT INTO CUSTOMER_INFO_TEST VALUES ('JACK', 555-4321', ' JACK@GMAIL.) COM', TO_DATE ('01-03-2011', 'YYYY-MM-DD'), TO_DATE ('2011-03-11', 'YYYY-MM-DD'), NULL);

    My question:
    How can I configure end_dt (if null), to the next change_dt minus one

    It shows what I want to do:

    Select the rowid, account_num, phone, e-mail, start_dt, change_dt, end_dt, nvl (end_dt, lead (change_dt-1, 1) over (partition by account_num of start_dt order)) enddt CUSTOMER_INFO_TEST where end_dt is null;

    So, I want to update the table itself with the date in enddt. But how do I do this?

    This must be done in a single statement...

    Thanks in advance

    Richard

    Published by: user6702107 on 05-Jan-2011 09:11

    Edited by: Rydman on April 17, 2012 15:01

    Please post sample data!
    If your query returns the desired results, you can use the MERGE:

    SQL> select *
      2  from   customer_info_test;
    
    ACCOUNT_NU PHONE      EMAIL                     START_DT CHANGE_D END_DT
    ---------- ---------- ------------------------- -------- -------- --------
    BOB        555-1234                             01-01-11 06-01-11 10-01-11
    BOB        555-1234   [email protected]             01-01-11 11-01-11
    BOB        555-1234   [email protected]             01-01-11 15-01-11
    JACK       555-4321                             01-03-11 06-03-11
    JACK       555-4321   [email protected]            01-03-11 11-03-11
    
    5 rows selected.
    
    SQL> --
    SQL> merge into customer_info_test a
      2  using ( select rowid rid
      3          ,      nvl(end_dt, lead(change_dt-1, 1) over (partition by account_num order by start_dt)) new_end_dt
      4          from   customer_info_test
      5          where  end_dt is null
      6        ) b
      7  on (a.rowid = b.rid )
      8  when matched then update set a.end_dt = b.new_end_dt;
    
    4 rows merged.
    
    SQL> --
    SQL> select *
      2  from   customer_info_test;
    
    ACCOUNT_NU PHONE      EMAIL                     START_DT CHANGE_D END_DT
    ---------- ---------- ------------------------- -------- -------- --------
    BOB        555-1234                             01-01-11 06-01-11 10-01-11
    BOB        555-1234   [email protected]             01-01-11 11-01-11 14-01-11
    BOB        555-1234   [email protected]             01-01-11 15-01-11
    JACK       555-4321                             01-03-11 06-03-11 10-03-11
    JACK       555-4321   [email protected]            01-03-11 11-03-11
    
    5 rows selected.
    
  • total area of the indexes vs the table

    I'm a relatively new to oracle...
    I've seen sometimes in large databases that the total size of the index of dba_segments is generally higher than that of the table on which they are made.
    Is the structure of the leaves and the number of columns in the index, the main reasons only why the size of the index is greater than that of the tables on which they are made?


    Can someone help me with the exact reasons for why the size of the index is sometimes greater than that of the tables on which they are made?

    Anthony wrote:

    Can someone help me with the exact reasons for why the size of the index is sometimes greater than that of the tables on which they are made?

    There are several reasons why this can occur, including:

    -Columns in the table once while the same column can appear in several index
    -Index need to include storage for the ROWID
    -The index generally have a greater amount of free space as tables

    See you soon

    Richard Foote
    http://richardfoote.WordPress.com/

  • How to find inserted last record in the table.

    Version: Oracle 10g

    I have a table called 'Manufacturing' and 3 columns as mfno, itemname, quantity.
    How to find inserted last record in the table 'manufacturing '.

    As I got to know that the Rowid is not a result perfect result. Please provide your inputs.

    user13416294 wrote:
    Version: Oracle 10g

    This is not a version. It's a product name. A version is 10.1.0.2 or 10.2.0.4, etc.

    I have a table called 'Manufacturing' and 3 columns as mfno, itemname, quantity.
    How to find inserted last record in the table 'manufacturing '.

    Not possible as your data model do not answer for him. As simple as that.

    If there is a need to determine an order or associate some time to an entity, then that should be part of the data model - and a relationship, or one or several attributes are necessary to represent this information. Your data model in this case is therefore unable to meet your requirements.

    If the requirements are valid, set the data model. In other words - your question has nothing to do with Oracle and nothing to do with the other pseudo columns in Oracle, the rowscn or the rowid. It is a question of pure data modeling. Nothing more.

  • Questions on the tables of materialized views and MV newspaper

    Hi all

    Have some questions about Materialized View.

    (1) once the materialized view reads the records from the table MLOG, reviews the MLOG get purged. fix? or is that not the case? In some cases, I see still (old) records in the MLOG table even after updating MV.

    (2) how the table MLOG distinguishes between a reading which comes from a MV and a reading that comes from a user? If I execute manually
    "Select * < table MLOG > ' could get record of the table MLOG redacted all the same way as it does after a refresh of MV?

    (3) one of our MV updates crashes intermittently. Based on the events of waiting I noticed that it was a 'db file sequential read' against the main table. Finally I had to put an end to the update. I don't know why it was sequential reading on the main table when she should be reading the table MLOG. Any ideas?

    (4) I saw 'file db scattered read' (full table scan) usually on tables, but I was surprised to see 'db file sequential read' against the table. I thought sequential read occurs normally against the index. All the world has noticed this behavior?

    Thanks for your time.

    (1) once all the registered materialized views have read a particular line in a trunk of materialized view, it is removed, Yes. If there are multiple materialized views that are based on the same newspaper, they would all need to refresh before it would be safe to delete the log entry for MV. If one of the materialized views is no incremental updating, there may be cases where the log purge automatically.

    (2) No, your query does not cause anything be served (although you wouldn't see something interesting unless you get to implement a lot of code to analyze change vectors stored in the journal). I don't know the exact mechanism used by Oracle has been published, if you could go through and draw a session to get an idea of the moving parts. From a practical point of view, you just need to know that when you create an updatable materialized view fast, it will register as interested especially newspapers MV.

    (3) it depends on what is stored in the log of MV. The update process may need to recover specific table columns if your log stores just the fact that the data for a particular key changed. You can specify when you create a materialized view that you want to store specific columns or include the new clause values (with the NEW VALUES INCLUDING). It is perhaps beneficial (or necessary) for the refreshment quick process, but it would tend to increase the storage space for the materialized view log and increase the cost of the maintianing the materialized view log.

    (4) sequential reads on a table are perfectly normal - it just means that someone looking for a block of data in the table (i.e. looking a line in the table of ROWID based on the ROWID in an index or a materialized view log).

    Justin

  • duplicates of records in the table

    Hello
    I have the following type and I need to delete duplicate records
         declare
              type x_object_type is table of number
              index by binary_integer;
              x_table x_object_type;
              idx number;
         begin
               select manager_id bulk collect into x_table
              from employees
              where rownum <= 6;
              idx := x_table.first;
              for i in x_table.first..x_table.last loop
                   if idx = x_table.next(i) then
                     dbms_output.put_line('it is a duplicate');
                   else 
                     dbms_output.put_line('no duplicate '||x_table(i));     
                   end if;
              idx := x_table.next(i);
              end loop;
         end;
    
    the result is:
    no duplicate 207
    no duplicate 124
    no duplicate 101
    no duplicate 100
    no duplicate 201
    no duplicate 101
    as you can see I have duplicated lines. This is an example, the values in the table are not stored in a table to eliminate using rowid.

    Thank you

    Hi coco problem already solved?
    In my view, that there are some problems in comparison. Try this:

    declare
              type x_object_type is table of number
              index by binary_integer;
              x_table x_object_type;
              idx number;
        dup boolean;
    
         begin
               select manager_id bulk collect into x_table
              from hr.employees
              where rownum <= 6;
              --idx := x_table.first;
              for i in x_table.first..x_table.last-1 loop
        idx := x_table(i);
        --dbms_output.put_line('Now checking '||idx||' for duplicates.');
        dup := false;
            for a in x_table.first..x_table.last loop
              if idx = x_table(a) and a != i then
                dup := true;
              end if;
            end loop;
           IF dup then
             dbms_output.put_line('it is a duplicate: '||x_table(i));
            else
             dbms_output.put_line('no duplicate: '||x_table(i));
           END IF;
        end loop;
         end;
    /
    

    You choose the first value and then wrap well than all the others. If you need 2 loops and this "idx: = x_table.first;" the nr of the table not returns.

    But, as a suggestion, use a table function. It's more fun:

    CREATE TYPE numset_t IS TABLE OF NUMBER;
    
    CREATE OR REPLACE FUNCTION GET_manager_id RETURN numset_t PIPELINED
    IS
    BEGIN
    
    FOR i in (select manager_id
         from employees
         where rownum <= 6 AND manager_id IS NOT NULL) LOOP
           PIPE ROW(i.manager_id );
         END LOOP;
      RETURN;
    END;
    /
    
    select a.column_value,count(*) from
    (SELECT DISTINCT column_value FROM table(GET_manager_id())) a
    INNER JOIN table(GET_manager_id()) b
    ON a.column_value = b.column_value
    group by a.column_value
    order by a.column_value;
    

    If the code is much easier and you have total flexibility, SQL.

    -andy

  • Problem regarding the display of the Table

    Hello

    I have a problem with a Table in OAF... According to the condition if we have no action on the Table we should display the same view in the table... (Because let's assume that we are in the fifth of the Table Page, even after the implementation of the action to submit we must stay on the same Page)... now when I play an action after the action is completed, we see the first view (Page) of the Table...


    Please suggest me what needs to be done on this issue... I saw that the page is refreshed after submit action


    Kind regards
    Doris

    Hello

    Capture the event associated with the table column and returns the primary key of the row in the params of the event.

    If ("rowevent". Equals (PageContext.GetParameter ("Event"))
    {
    obtain the primary key of this line
    Chain of rowid = pageContext.getParameter ('primary key');
    get the existing lines of the range
    OAViewObject vo = (OAViewObject) am.findViewObject ("vo name");
    Rank [] rows = vo.getAllRowsinRange ();
    for (i = 0; i<>
    {
    Corresponds to the primary key that is captured with all the lines to find the corresponding row
    If ("rowid".equals (lines.getAttribute("rowid").toString (()))
    {
    you get the line on which event has been triggered just out of the loop

    break;
    }

    }

    This way navigation will be won on the same range, as the event is triggered.

    Thank you
    Gerard

  • Select the last row inserted into the table

    Hello
    I have an app that inserts a line in two columns (stamp that contains the time of creation of the line and a float) each seconde.1. I have another app that bed that reads lateset inserted each seconde.1. I had this on SQL Server where I just chose the DateTime max line and had surgery no clustered index on the datetime column. But since I'm moving this course at Oracle I wanted to know if there is a better way to do it. The table will keep up to 30 days of data is about 26 million lines. So I need this facility where querying for last place among the 26 million lines continue with timer deuxieme.1 of my application.

    Here's my insert:
    Insert in testlog (hz, ctime) values (: hz_value, localtimestamp (2))

    Here is my selection:
    Select hz, ctime testlog where ctime = (select max (ctime) of testlog)

    Thank you

    I would use:

    Select hz, ctime of (select hz, ctime, dense_rank() over (order by desc ctime) rnk of testlog) where rnk = 1;

    For example:

    SQL> explain plan for
      2  select * from emp where empno = (select max(empno) from emp)
      3  /
    
    Explained.
    
    SQL> @?\rdbms\admin\utlxpls
    
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------------------
    Plan hash value: 1674692883
    
    ---------------------------------------------------------------------------------------
    | Id  | Operation                    | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |        |     1 |    37 |     2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID | EMP    |     1 |    37 |     1   (0)| 00:00:01 |
    |*  2 |   INDEX UNIQUE SCAN          | PK_EMP |     1 |       |     0   (0)| 00:00:01 |
    |   3 |    SORT AGGREGATE            |        |     1 |     4 |            |          |
    |   4 |     INDEX FULL SCAN (MIN/MAX)| PK_EMP |    14 |    56 |     1   (0)| 00:00:01 |
    ---------------------------------------------------------------------------------------
    
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       2 - access("EMPNO"= (SELECT MAX("EMPNO") FROM "EMP" "EMP"))
    
    16 rows selected.
    
    SQL> explain plan for
      2  select * from (select e.*,dense_rank() over(order by empno desc) rn from emp e) where rn = 1
      3  /
    
    Explained.
    
    SQL> @?\rdbms\admin\utlxpls
    
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------------------
    Plan hash value: 2150023773
    
    ----------------------------------------------------------------------------------------
    | Id  | Operation                     | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
    ----------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT              |        |    14 |  1400 |     2   (0)| 00:00:01 |
    |*  1 |  VIEW                         |        |    14 |  1400 |     2   (0)| 00:00:01 |
    |*  2 |   WINDOW NOSORT STOPKEY       |        |    14 |   518 |     2   (0)| 00:00:01 |
    |   3 |    TABLE ACCESS BY INDEX ROWID| EMP    |    14 |   518 |     2   (0)| 00:00:01 |
    |   4 |     INDEX FULL SCAN DESCENDING| PK_EMP |    14 |       |     1   (0)| 00:00:01 |
    ----------------------------------------------------------------------------------------
    
    PLAN_TABLE_OUTPUT
    ------------------------------------------------------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       1 - filter("RN"=1)
       2 - filter(DENSE_RANK() OVER ( ORDER BY INTERNAL_FUNCTION("EMPNO") DESC )<=1)
    
    17 rows selected.
    
    SQL> 
    

    SY.

Maybe you are looking for