Poor query performance when joining CONTAINS to another table

We just recently began evaluating Oracle Text for a search solution. We need to be able to search a table that can have over 20+ million rows. Each user may only have visibility to a tiny fraction of those rows. The goal is to have a single Oracle Text index that represents all of the searchable columns in the table (multi column datastore) and provide a score for each search result so that we can sort the search results in descending order by score. What we're seeing is that query performance from TOAD is extremely fast when we write a simple CONTAINS query against the Oracle Text indexed table. However, when we attempt to first reduce the rows the CONTAINS query needs to search by using a WITH we find that the query performance degrades significantly.
For example, we can find all the records a user has access to from our base table by the following query:
SELECT d.duns_loc
FROM duns d
JOIN primary_contact pc
ON d.duns_loc = pc.duns_loc
AND pc.emp_id = :employeeID;
This query can execute in <100 ms. In the working example, this query returns around 1200 rows of the primary key duns_loc.
Our search query looks like this:
SELECT score(1), d.*
FROM duns d
WHERE CONTAINS(TEXT_KEY, :search,1) > 0
ORDER BY score(1) DESC;
The :search value in this example will be 'highway'. The query can return 246k rows in around 2 seconds.
2 seconds is good, but we should be able to have a much faster response if the search query did not have to search the entire table, right? Since each user can only "view" records they are assigned to we reckon that if the search operation only had to scan a tiny tiny percent of the TEXT index we should see faster (and more relevant) results. If we now write the following query:
WITH subset
AS
(SELECT d.duns_loc
FROM duns d
JOIN primary_contact pc
ON d.duns_loc = pc.duns_loc
AND pc.emp_id = :employeeID
SELECT score(1), d.*
FROM duns d
JOIN subset s
ON d.duns_loc = s.duns_loc
WHERE CONTAINS(TEXT_KEY, :search,1) > 0
ORDER BY score(1) DESC;
For reasons we have not been able to identify this query actually takes longer to execute than the sum of the durations of the contributing parts. This query takes over 6 seconds to run. We nor our DBA can seem to figure out why this query performs worse than a wide open search. The wide open search is not ideal as the query would end up returning records to the user they don't have access to view.
Has anyone ever ran into something like this? Any suggestions on what to look at or where to go? If anyone would like more information to help in diagnosis than let me know and i'll be happy to produce it here.
Thanks!!

Sometimes it can be good to separate the tables into separate sub-query factoring (with) clauses or inline views in the from clause or an in clause as a where condition. Although there are some differences, using a sub-query factoring (with) clause is similar to using an inline view in the from clause. However, you should avoid duplication. You should not have the same table in two different places, as in your original query. You should have indexes on any columns that the tables are joined on, your statistics should be current, and your domain index should have regular synchronization, optimization, and periodically rebuild or drop and recreate to keep it performing with maximum efficiency. The following demonstration uses a composite domain index (cdi) with filter by, as suggested by Roger, then shows the explained plans for your original query, and various others. Your original query has nested loops. All of the others have the same plan without the nested loops. You could also add index hints.
SCOTT@orcl_11gR2> -- tables:
SCOTT@orcl_11gR2> CREATE TABLE duns
  2    (duns_loc  NUMBER,
  3       text_key  VARCHAR2 (30))
  4  /
Table created.
SCOTT@orcl_11gR2> CREATE TABLE primary_contact
  2    (duns_loc  NUMBER,
  3       emp_id       NUMBER)
  4  /
Table created.
SCOTT@orcl_11gR2> -- data:
SCOTT@orcl_11gR2> INSERT INTO duns VALUES (1, 'highway')
  2  /
1 row created.
SCOTT@orcl_11gR2> INSERT INTO primary_contact VALUES (1, 1)
  2  /
1 row created.
SCOTT@orcl_11gR2> INSERT INTO duns
  2  SELECT object_id, object_name
  3  FROM   all_objects
  4  WHERE  object_id > 1
  5  /
76027 rows created.
SCOTT@orcl_11gR2> INSERT INTO primary_contact
  2  SELECT object_id, namespace
  3  FROM   all_objects
  4  WHERE  object_id > 1
  5  /
76027 rows created.
SCOTT@orcl_11gR2> -- indexes:
SCOTT@orcl_11gR2> CREATE INDEX duns_duns_loc_idx
  2  ON duns (duns_loc)
  3  /
Index created.
SCOTT@orcl_11gR2> CREATE INDEX primary_contact_duns_loc_idx
  2  ON primary_contact (duns_loc)
  3  /
Index created.
SCOTT@orcl_11gR2> -- composite domain index (cdi) with filter by clause
SCOTT@orcl_11gR2> -- as suggested by Roger:
SCOTT@orcl_11gR2> CREATE INDEX duns_text_key_idx
  2  ON duns (text_key)
  3  INDEXTYPE IS CTXSYS.CONTEXT
  4  FILTER BY duns_loc
  5  /
Index created.
SCOTT@orcl_11gR2> -- gather statistics:
SCOTT@orcl_11gR2> EXEC DBMS_STATS.GATHER_TABLE_STATS (USER, 'DUNS')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> EXEC DBMS_STATS.GATHER_TABLE_STATS (USER, 'PRIMARY_CONTACT')
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> -- variables:
SCOTT@orcl_11gR2> VARIABLE employeeid NUMBER
SCOTT@orcl_11gR2> EXEC :employeeid := 1
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> VARIABLE search VARCHAR2(100)
SCOTT@orcl_11gR2> EXEC :search := 'highway'
PL/SQL procedure successfully completed.
SCOTT@orcl_11gR2> -- original query:
SCOTT@orcl_11gR2> SET AUTOTRACE ON EXPLAIN
SCOTT@orcl_11gR2> WITH
  2    subset AS
  3        (SELECT d.duns_loc
  4         FROM      duns d
  5         JOIN      primary_contact pc
  6         ON      d.duns_loc = pc.duns_loc
  7         AND      pc.emp_id = :employeeID)
  8  SELECT score(1), d.*
  9  FROM   duns d
10  JOIN   subset s
11  ON     d.duns_loc = s.duns_loc
12  WHERE  CONTAINS (TEXT_KEY, :search,1) > 0
13  ORDER  BY score(1) DESC
14  /
  SCORE(1)   DUNS_LOC TEXT_KEY
        18          1 highway
1 row selected.
Execution Plan
Plan hash value: 4228563783
| Id  | Operation                      | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
|   0 | SELECT STATEMENT               |                   |     2 |    84 |   121   (4)| 00:00:02 |
|   1 |  SORT ORDER BY                 |                   |     2 |    84 |   121   (4)| 00:00:02 |
|*  2 |   HASH JOIN                    |                   |     2 |    84 |   120   (3)| 00:00:02 |
|   3 |    NESTED LOOPS                |                   |    38 |  1292 |    50   (2)| 00:00:01 |
|   4 |     TABLE ACCESS BY INDEX ROWID| DUNS              |    38 |  1102 |    11   (0)| 00:00:01 |
|*  5 |      DOMAIN INDEX              | DUNS_TEXT_KEY_IDX |       |       |     4   (0)| 00:00:01 |
|*  6 |     INDEX RANGE SCAN           | DUNS_DUNS_LOC_IDX |     1 |     5 |     1   (0)| 00:00:01 |
|*  7 |    TABLE ACCESS FULL           | PRIMARY_CONTACT   |  4224 | 33792 |    70   (3)| 00:00:01 |
Predicate Information (identified by operation id):
   2 - access("D"."DUNS_LOC"="PC"."DUNS_LOC")
   5 - access("CTXSYS"."CONTAINS"("D"."TEXT_KEY",:SEARCH,1)>0)
   6 - access("D"."DUNS_LOC"="D"."DUNS_LOC")
   7 - filter("PC"."EMP_ID"=TO_NUMBER(:EMPLOYEEID))
SCOTT@orcl_11gR2> -- queries with better plans (no nested loops):
SCOTT@orcl_11gR2> -- subquery factoring (with) clauses:
SCOTT@orcl_11gR2> WITH
  2    subset1 AS
  3        (SELECT pc.duns_loc
  4         FROM      primary_contact pc
  5         WHERE  pc.emp_id = :employeeID),
  6    subset2 AS
  7        (SELECT score(1), d.*
  8         FROM      duns d
  9         WHERE  CONTAINS (TEXT_KEY, :search,1) > 0)
10  SELECT subset2.*
11  FROM   subset1, subset2
12  WHERE  subset1.duns_loc = subset2.duns_loc
13  ORDER  BY score(1) DESC
14  /
  SCORE(1)   DUNS_LOC TEXT_KEY
        18          1 highway
1 row selected.
Execution Plan
Plan hash value: 153618227
| Id  | Operation                     | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
|   0 | SELECT STATEMENT              |                   |    38 |  1406 |    83   (5)| 00:00:01 |
|   1 |  SORT ORDER BY                |                   |    38 |  1406 |    83   (5)| 00:00:01 |
|*  2 |   HASH JOIN                   |                   |    38 |  1406 |    82   (4)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| DUNS              |    38 |  1102 |    11   (0)| 00:00:01 |
|*  4 |     DOMAIN INDEX              | DUNS_TEXT_KEY_IDX |       |       |     4   (0)| 00:00:01 |
|*  5 |    TABLE ACCESS FULL          | PRIMARY_CONTACT   |  4224 | 33792 |    70   (3)| 00:00:01 |
Predicate Information (identified by operation id):
   2 - access("PC"."DUNS_LOC"="D"."DUNS_LOC")
   4 - access("CTXSYS"."CONTAINS"("TEXT_KEY",:SEARCH,1)>0)
   5 - filter("PC"."EMP_ID"=TO_NUMBER(:EMPLOYEEID))
SCOTT@orcl_11gR2> -- inline views (sub-queries in the from clause):
SCOTT@orcl_11gR2> SELECT subset2.*
  2  FROM   (SELECT pc.duns_loc
  3            FROM   primary_contact pc
  4            WHERE  pc.emp_id = :employeeID) subset1,
  5           (SELECT score(1), d.*
  6            FROM   duns d
  7            WHERE  CONTAINS (TEXT_KEY, :search,1) > 0) subset2
  8  WHERE  subset1.duns_loc = subset2.duns_loc
  9  ORDER  BY score(1) DESC
10  /
  SCORE(1)   DUNS_LOC TEXT_KEY
        18          1 highway
1 row selected.
Execution Plan
Plan hash value: 153618227
| Id  | Operation                     | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
|   0 | SELECT STATEMENT              |                   |    38 |  1406 |    83   (5)| 00:00:01 |
|   1 |  SORT ORDER BY                |                   |    38 |  1406 |    83   (5)| 00:00:01 |
|*  2 |   HASH JOIN                   |                   |    38 |  1406 |    82   (4)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| DUNS              |    38 |  1102 |    11   (0)| 00:00:01 |
|*  4 |     DOMAIN INDEX              | DUNS_TEXT_KEY_IDX |       |       |     4   (0)| 00:00:01 |
|*  5 |    TABLE ACCESS FULL          | PRIMARY_CONTACT   |  4224 | 33792 |    70   (3)| 00:00:01 |
Predicate Information (identified by operation id):
   2 - access("PC"."DUNS_LOC"="D"."DUNS_LOC")
   4 - access("CTXSYS"."CONTAINS"("TEXT_KEY",:SEARCH,1)>0)
   5 - filter("PC"."EMP_ID"=TO_NUMBER(:EMPLOYEEID))
SCOTT@orcl_11gR2> -- ansi join:
SCOTT@orcl_11gR2> SELECT SCORE(1), duns.*
  2  FROM   duns
  3  JOIN   primary_contact
  4  ON     duns.duns_loc = primary_contact.duns_loc
  5  WHERE  CONTAINS (duns.text_key, :search, 1) > 0
  6  AND    primary_contact.emp_id = :employeeid
  7  ORDER  BY SCORE(1) DESC
  8  /
  SCORE(1)   DUNS_LOC TEXT_KEY
        18          1 highway
1 row selected.
Execution Plan
Plan hash value: 153618227
| Id  | Operation                     | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
|   0 | SELECT STATEMENT              |                   |    38 |  1406 |    83   (5)| 00:00:01 |
|   1 |  SORT ORDER BY                |                   |    38 |  1406 |    83   (5)| 00:00:01 |
|*  2 |   HASH JOIN                   |                   |    38 |  1406 |    82   (4)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| DUNS              |    38 |  1102 |    11   (0)| 00:00:01 |
|*  4 |     DOMAIN INDEX              | DUNS_TEXT_KEY_IDX |       |       |     4   (0)| 00:00:01 |
|*  5 |    TABLE ACCESS FULL          | PRIMARY_CONTACT   |  4224 | 33792 |    70   (3)| 00:00:01 |
Predicate Information (identified by operation id):
   2 - access("DUNS"."DUNS_LOC"="PRIMARY_CONTACT"."DUNS_LOC")
   4 - access("CTXSYS"."CONTAINS"("DUNS"."TEXT_KEY",:SEARCH,1)>0)
   5 - filter("PRIMARY_CONTACT"."EMP_ID"=TO_NUMBER(:EMPLOYEEID))
SCOTT@orcl_11gR2> -- old join:
SCOTT@orcl_11gR2> SELECT SCORE(1), duns.*
  2  FROM   duns, primary_contact
  3  WHERE  CONTAINS (duns.text_key, :search, 1) > 0
  4  AND    duns.duns_loc = primary_contact.duns_loc
  5  AND    primary_contact.emp_id = :employeeid
  6  ORDER  BY SCORE(1) DESC
  7  /
  SCORE(1)   DUNS_LOC TEXT_KEY
        18          1 highway
1 row selected.
Execution Plan
Plan hash value: 153618227
| Id  | Operation                     | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
|   0 | SELECT STATEMENT              |                   |    38 |  1406 |    83   (5)| 00:00:01 |
|   1 |  SORT ORDER BY                |                   |    38 |  1406 |    83   (5)| 00:00:01 |
|*  2 |   HASH JOIN                   |                   |    38 |  1406 |    82   (4)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| DUNS              |    38 |  1102 |    11   (0)| 00:00:01 |
|*  4 |     DOMAIN INDEX              | DUNS_TEXT_KEY_IDX |       |       |     4   (0)| 00:00:01 |
|*  5 |    TABLE ACCESS FULL          | PRIMARY_CONTACT   |  4224 | 33792 |    70   (3)| 00:00:01 |
Predicate Information (identified by operation id):
   2 - access("DUNS"."DUNS_LOC"="PRIMARY_CONTACT"."DUNS_LOC")
   4 - access("CTXSYS"."CONTAINS"("DUNS"."TEXT_KEY",:SEARCH,1)>0)
   5 - filter("PRIMARY_CONTACT"."EMP_ID"=TO_NUMBER(:EMPLOYEEID))
SCOTT@orcl_11gR2> -- in clause:
SCOTT@orcl_11gR2> SELECT SCORE(1), duns.*
  2  FROM   duns
  3  WHERE  CONTAINS (duns.text_key, :search, 1) > 0
  4  AND    duns.duns_loc IN
  5           (SELECT primary_contact.duns_loc
  6            FROM   primary_contact
  7            WHERE  primary_contact.emp_id = :employeeid)
  8  ORDER  BY SCORE(1) DESC
  9  /
  SCORE(1)   DUNS_LOC TEXT_KEY
        18          1 highway
1 row selected.
Execution Plan
Plan hash value: 3825821668
| Id  | Operation                     | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
|   0 | SELECT STATEMENT              |                   |    38 |  1406 |    83   (5)| 00:00:01 |
|   1 |  SORT ORDER BY                |                   |    38 |  1406 |    83   (5)| 00:00:01 |
|*  2 |   HASH JOIN SEMI              |                   |    38 |  1406 |    82   (4)| 00:00:01 |
|   3 |    TABLE ACCESS BY INDEX ROWID| DUNS              |    38 |  1102 |    11   (0)| 00:00:01 |
|*  4 |     DOMAIN INDEX              | DUNS_TEXT_KEY_IDX |       |       |     4   (0)| 00:00:01 |
|*  5 |    TABLE ACCESS FULL          | PRIMARY_CONTACT   |  4224 | 33792 |    70   (3)| 00:00:01 |
Predicate Information (identified by operation id):
   2 - access("DUNS"."DUNS_LOC"="PRIMARY_CONTACT"."DUNS_LOC")
   4 - access("CTXSYS"."CONTAINS"("DUNS"."TEXT_KEY",:SEARCH,1)>0)
   5 - filter("PRIMARY_CONTACT"."EMP_ID"=TO_NUMBER(:EMPLOYEEID))
SCOTT@orcl_11gR2>

Similar Messages

  • Poor query performance when I have select ...xmlsequence in from clause

    Here is my query and it takes forever to execute. When I run the xmlsequence query alone, it takes a few seconds. But once added to from clause and I execute the query below together, it takes too long. Is there a better way to do the same?
    What I am doing here is what is there in t1 should not be there in what is returned from the subquery (xmlsequence).
    select distinct t1.l_type l_type,
    TO_CHAR(t1.dt1,'DD-MON-YY') dt1 ,
    TO_CHAR(t2.dt2,'DD-MON-YY') dt2, t1.l_nm
    from table1 t1,table2 t2,
    select k.column_value.extract('/RHS/value/text()').getStringVal() as lki
    from d_v dv
    , table(xmlsequence(dv.xmltypecol.extract('//c/RHS')))k
    ) qds
    where
    t2.l_id = t1.l_id
    and to_char(t1.l_id) not in qds.lki

    SQL> SELECT *
      2  FROM   TABLE(DBMS_XPLAN.DISPLAY);
    Plan hash value: 2820226721
    | Id  | Operation                            | Name                   | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    |   0 | SELECT STATEMENT                     |                        |  7611M|   907G|       |   352M  (1)|999:59:59 |
    |   1 |  HASH UNIQUE                         |                        |  7611M|   907G|  2155G|   352M  (1)|999:59:59 |
    |*  2 |   HASH JOIN                          |                        |  9343M|  1113G|       |    22M  (2)| 76:31:45 |
    |   3 |    TABLE ACCESS FULL                 | table2           |  1088 | 17408 |       |     7   (0)| 00:00:0
    |   4 |    NESTED LOOPS                      |                        |  8468M|   883G|       |    22M  (1)| 76:15:57 |
    |   5 |     MERGE JOIN CARTESIAN             |                        |  1037K|   108M|       |  4040   (1)| 00:00:49 |
    |   6 |      TABLE ACCESS FULL               | D_V        |  1127 | 87906 |       |    56   (0)| 00
    |   7 |      BUFFER SORT                     |                        |   921 | 29472 |       |  3984   (1)| 00:00:48 |
    |   8 |       TABLE ACCESS FULL              | table1                   |   921 | 29472 |       |     4   (0)| 00:00:01 |
    |*  9 |     COLLECTION ITERATOR PICKLER FETCH| XMLSEQUENCEFROMXMLTYPE |       |       |       |           
    Predicate Information (identified by operation id):
       2 - access("t2"."L_ID"="t1"."L_ID")
       9 - filter(TO_CHAR("t1"."L_ID")<>"XMLTYPE"."GETSTRINGVAL"("XMLTYPE"."EXTRACT"(VALUE(KOKB
                  alue/text()')))Message was edited by:
    M@$$@cHu$eTt$

  • Poor query performance when using date range

    Hello,
    We have the following ABAP code:
    select sptag werks vkorg vtweg spart kunnr matnr periv volum_01 voleh
          into table tab_aux
          from s911
          where vkorg in c_vkorg
            and werks in c_werks
            and sptag in c_sptag
            and matnr in c_matnr
    that is translated to the following Oracle query:
    SELECT
    "SPTAG" , "WERKS" , "VKORG" , "VTWEG" , "SPART" , "KUNNR" , "MATNR" , "PERIV" , "VOLUM_01" ,"VOLEH" FROM SAPR3."S911" WHERE "MANDT" = '003' AND "VKORG" = 'D004' AND "SPTAG" BETWEEN 20101201 AND 20101231 AND "MATNR" BETWEEN 000000000100000000 AND 000000000999999999;
    Because the field SPTAG is not enclosed by apostropher, the oracle query has a very bad performance. Below the execution plans and its costs, with and without the apostrophes. Please help me understanding why I am getting this behaviour.
    ##WITH APOSTROPHES
    SQL> EXPLAIN PLAN FOR
      2  SELECT
      3  "SPTAG" , "WERKS" , "VKORG" , "VTWEG" , "SPART" , "KUNNR" , "MATNR" , "PERIV" , "VOLUM_01" ,"VOLEH" FROM SAPR3."S911" WHERE "MANDT" = '003' AND "VKORG" = 'D004' AND "SPTAG" BETWEEN '20101201' AND '20101231' AND "MATNR" BETWEEN '000000000100000000' AND '000000000999999999';
    Explained.
    SQL> SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
    PLAN_TABLE_OUTPUT
    Id
    Operation
    Name
    Rows
    Bytes
    Cost (%CPU)
    0
    SELECT STATEMENT
    932
    62444
    150   (1)
    1
    TABLE ACCESS BY INDEX ROWID
    S911
    932
    62444
    149   (0)
    2
    INDEX RANGE SCAN
    S911~VAC
    55M
    5   (0)
    Predicate Information (identified by operation id):
    PLAN_TABLE_OUTPUT
       1 - filter("VKORG"='D004' AND "SPTAG">='20101201' AND
                  "SPTAG"<='20101231')
       2 - access("MANDT"='003' AND "MATNR">='000000000100000000' AND
                  "MATNR"<='000000000999999999')
    ##WITHOUT APOSTROPHES
    SQL> EXPLAIN PLAN FOR
      2  SELECT
      3  "SPTAG" , "WERKS" , "VKORG" , "VTWEG" , "SPART" , "KUNNR" , "MATNR" , "PERIV" , "VOLUM_01" ,"VOLEH" FROM SAPR3."S911" WHERE "MANDT" = '003' AND "VKORG" = 'D004' AND "SPTAG" BETWEEN 20101201 AND 20101231 AND "MATNR" BETWEEN '000000000100000000' AND '000000000999999999';
    SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
    Explained.
    SQL>
    PLAN_TABLE_OUTPUT
    Id
    Operation
    Name
    Rows
    Bytes
    Cost (%CPU)
    0
    SELECT STATEMENT
    2334
    152K
    150   (1)
    1
    TABLE ACCESS BY INDEX ROWID
    S911
    2334
    152K
    149   (0)
    2
    INDEX RANGE SCAN
    S911~VAC
    55M
    5   (0)
    Predicate Information (identified by operation id):
    PLAN_TABLE_OUTPUT
       1 - filter("VKORG"='D004' AND TO_NUMBER("SPTAG")>=20101201 AND
                  TO_NUMBER("SPTAG")<=20101231)
       2 - access("MANDT"='003' AND "MATNR">='000000000100000000' AND
                  "MATNR"<='000000000999999999')
    Best Regards,
    Daniel G.

    Volker,
    Answering your question, regarding the explain from ST05. As a quick work around I created an index (S911~Z9), but still I'd like to solve this issue without this extra index, as primary index would work ok, as long as date was correctly sent to oracle as string and not as number.
    SELECT                                                                         
      "SPTAG" , "WERKS" , "VKORG" , "VTWEG" , "SPART" , "KUNNR" , "MATNR" ,        
      "PERIV" , "VOLUM_01" , "VOLEH"                                               
    FROM                                                                           
      "S911"                                                                       
    WHERE                                                                          
      "MANDT" = :A0 AND "VKORG" = :A1 AND "SPTAG" BETWEEN :A2 AND :A3 AND "MATNR"  
      BETWEEN :A4 AND :A5                                                          
    A0(CH,3)  = 003              
    A1(CH,4)  = D004             
    A2(NU,8)  = 20101201  (NU means number correct?)       
    A3(NU,8)  = 20101231         
    A4(CH,18) = 000000000100000000
    A5(CH,18) = 000000000999999999
    SELECT STATEMENT ( Estimated Costs = 10 , Estimated #Rows = 6 )                                                              
        5  3 FILTER                                               
             Filter Predicates                                                                               
    5  2 TABLE ACCESS BY INDEX ROWID S911                 
                 ( Estim. Costs = 10 , Estim. #Rows = 6 )         
                 Estim. CPU-Costs = 247.566 Estim. IO-Costs = 10                                                                               
    1 INDEX RANGE SCAN S911~Z9                     
                     ( Estim. Costs = 7 , Estim. #Rows = 20 )     
                     Search Columns: 4                            
                     Estim. CPU-Costs = 223.202 Estim. IO-Costs = 7
                     Access Predicates Filter Predicates          
    The table originally includes the following indexes:
    ###S911~0
    MANDT
    SSOUR
    VRSIO
    SPMON
    SPTAG
    SPWOC
    SPBUP
    VKORG
    VTWEG
    SPART
    VKBUR
    VKGRP
    KONDA
    KUNNR
    WERKS
    MATNR
    ###S911~VAC
    MANDT
    MATNR
    Number of entries: 61.303.517
    DISTINCT VKORG: 65
    DISTINCT SPTAG: 3107
    DISTINCT MATNR: 2939

  • How to improve query performance when reporting on ods object?

    Hi,
    Can anybody give me the answer, how to improve my query performance when reporting on ODS object?
    Thanks in advance,
    Ravi Alakuntla.

    Hi Ravi,
    Check these links which may cater your requirement,
    Re: performance issues of ODS
    Which criteria to follow to pick InfoObj. as secondary index of ODS?
    PDF on BW performance tuning,
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/cccad390-0201-0010-5093-fd9ec8157802
    Regards,
    Mani.

  • Network or database calls are made when joining more than one table

    Hi Friends,
    could anybody please let me know how may networks are called when joining more than one table.
    Thanks
    Rinky

    Hi Rinky,
      Normally when a JOIN between two database tables is made then following steps occur:-
    1) The control goes to database. Based on the JOINING and WHERE condition, an internal table is created in the DATABASE only which is filled. So here the computation is done at DATABASE level.
    2) Once the internal table is filled at database level, it is sent back to the application level.
    A Join operation normally minimizes the round trips to the database as most of the computation is done at database level only and results sent back to the Application layer.
    <b>Thus for a simple JOIN OPERATION makes a single DATABASE call.</b>
    NOTE: If you are satisfied with the explanation, then please reward points
               accordingly :).
    Thanks and regards,
    Ravi .

  • Poor performance when xmlquery contains attribute matching XPATH

    We send a select xmlquery to Oracle 11g database, if the query contains an XPATH that has an attribute name test in it, the performance is significantly worse than if indexing is used. Here are the two queries:
    1)
    select xmlquery('declare default element namespace "namespace"; for $e at $pos in $c/services/service let $result := if ($pos >= 2) then "|||||ERROR|||||" else $e return $result' passing document as "c" RETURNING CONTENT).getStringVal(), "LASTUPDATE" from services where id = :1
    2)
    select xmlquery('declare default element namespace "namespace"; for $e at $pos in $c/services/service[1] let $result := if ($pos >= 2) then "|||||ERROR|||||" else $e return $result' passing document as "c" RETURNING CONTENT).getStringVal(), "LASTUPDATE" from services where id = :1
    The only difference is the two XPATHS:
    1)$c/services/service
    2)$c/services/service[1]
    The second query performs 7X to 10X better than the first. More specifically, the Oracle DB CPU will reach 80-100% with only 40 tps of the first query but the second could hit 500 tps.
    We would expect the first to perform slightly worse than the second, because Oracle would need to compare the uri values in the doc to the query. But, the documents being searched only contain one service/@uri.
    Does anyone know why the performance is so bad with the first query? Is there anything we can do to tune the DB to help in this area. We need to be able to do the first query but the current CPU utilization is extremely too much.

    sorry, number 1 should be $services/service(@uri="test"). That should be [ instead of (, the forum wasn't displaying it correctly above.  It should be that way in the query as well.
    Edited by: user6668496 on Mar 10, 2009 1:50 PM

  • Query performance when multiple single variable values selected

    Hi Gurus,
    I have a sales analysis report that I run with some complex selection criteria.  One of the variables is the Sales Orgranisation.
    If I run the report for individual sales organisations, the performance is excellant, results are dislayed in a matter of seconds.  However, if I specify more than one sales organisation, the query will run and run and run.... until it eventually times out.
    For example; 
    I run the report for SALEORG1 and the results are displayed in less than 1 minute. 
    I then run the report for SALEORG2 and again the results are displayed in less than 1 minute.
    If I try to run the query for both SALEORG1 and SALEORG2, the report does not display any results but continues until it times out.
    Anybody got any ideas on why this would be happening?
    Any advise, gratefully accepted.
    Regards,
    David

    While compression is generally something that you should be doing, I don't think it is a factor here, since query performance is OK when using just a sinlge value.
    I would do two things - first make sure the DB stats for the cube are current.  You might even consider increasing the sample rate for the stats collection  if you are using one.  You don't mention the DB you use, or what type of index is on Salesorg which could play a role. Does the query run against a multiprovider on top of multiple cubes, or is there just one cube involved.
    If you still have problems after refreshing the stats, then I think the next step is to get a DB execution plan for the query by running the query from RSRT debugging mode when it is run with just one value and another when run with multiple values to see if the DB is doing something different - seek out your DBA if you are not familiar with executoin plan.

  • Poor query performance in Prod.

    I am facing lots of issues in my queries.
    The query is working fine in Dev. but after i transported it to Prod. the query is taking too much time to retreive the result.
    Why i am facing this issue.
    How can i do the performance tuning for the query.?
    The query is built on multiprovider and it is also jumping to the ODS for ODS query.
    But the query performance is really low and poor in Production.
    And to surprise the query is wroking perfectly and faster in Dev.
    What can be the suggestion.
    Please send documents for performnace tuning, notes number... etc.

    Are datavolumes huge in Prod Box...dat may be cause 4 d slow runtimes.
    <b>Look at below performance improving techs</b>
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/cbd2d390-0201-0010-8eab-a8a9269a23c2
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/aec09790-0201-0010-8eb9-e82df5763455
    Business Intelligence Performance Tuning [original link is broken]
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/cccad390-0201-0010-5093-fd9ec8157802
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/ce7fb368-0601-0010-64ba-fadc985a1f94
    https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/c8c4d794-0501-0010-a693-918a17e663cc
    Note 565725 - Optimizing the performance of ODS objects

  • Poor query performance only with migrated 7.0 queries

    Dear Team,
    We are facing a serious query performance issue after migration of queries from 3.5 to 7.0.
    I executed a query in 3.5 with some variable values which takes fraction of seconds to display the output. But the same migrated query with same variable entries is taking very long time and giving time out error.
    We are not using any aggregates in the InfoProvider level.
    Both the queries are based on same cube but 3.5 query is taking less time and 7.0 is taking very long time if more selection is done.
    I checked for notes where I didn't find specific note for this particular scenario. I found notes only for general query performance improvement.
    I want to know the reason why only in 7.0 the same 3.5 query is taking a long time and giving time out error. And please suggest some notes or suggestions related to this scenario.
    Regards,
    Chan

    Hi,
    Queries in BI 7.0 are almost the same as queries in 3.x format.
    inorder to check if the problem is in the query runtime (database time) or JAVA runtime (probably rendering) you should try running it from RSRT once in JAVA web and once in ABAP web.
    if the problem is only with JAVA web, than u should take the URL and add &profiling=X at the end.
    after the query execution u can use statistics which will be shown at the top of the page.
    With my experience, the problem is in the rendering phase of the query. Things that could be done is to limit the number of rows shown at each page, that could be done by changing the 0ANALYSIS web template - it's one of the web template parameters.
    Tomer.

  • Is it possible to write a result of query to a CLOB field in another table

    Hi all,
    I have a table with 50 columns which will ideally have around 250,000 rows. I want to select all the rows from this table and insert the result in to another
    table's CLOB or BLOB column. ( I think CLOB is preferred for strings !!)
    f.i
    Table1 : SELECT ID, COL1||','||COL2||','||COL3||','||COL4||','||COL5 FROM TF_TEMPREP
    ORDER BY COL1
    will have the output
    A001, 1,ABN LAYOUT,01-APR-11,30-APR-11,REMARK1
    A001, 2,CTS ,01-APR-11,10-APR-11,REMARK2
    A001, 3,BTS,01-APR-11,20-APR-11,REMARK3
    A001, 4,CWWS,01-JAN-11,31-JAN-11,REMARK4
    A001, 5,ZYNC,01-MAR-11,31-MAR-11,REMARK5
    I would like to store these rows into another table (TF_TEMPREP_OUTPUT) CLOB/BLOB column ,
    so the table TF_TEMPREP_OUTPUT will have one row with all the rows from TF_TEMPREP in the CLOB/BLOB column.
    TF_TEMPREP_OUTPUT will have column OUTPUTID (VARCHAR2) , OUTPUTDATA (CLOB DATATYPE)
    Will this be possible !!.
    Thanks in advance
    Regards
    Murali

    Hi all
    Thanks for your reply,
    The reason we would like to store the data in a CLOB file is that,
    Currently we are fetching the data from the table TF_TEMPREP and the recordset is passed into a function and writing the ouput to a CSV file in the local drive using the VB (front end application). once the process is completed, the temporary table will be deleted. this is used only for printing purpose.
    we are using the VB function
    Public Function RecordsetToCSV(rsData As ADODB.Recordset, pFileSeparator As String, Optional ShowColumnNames As Boolean = True, Optional NULLStr As String = "") As String
    Dim k As Long
    Dim RetStr As String
    On Error GoTo Errh
    If ShowColumnNames Then
    For k = 0 To rsData.Fields.Count - 1
    RetStr = RetStr & pFileSeparator & """" & rsData.Fields(k).Name & """"
    Next k
    RetStr = Mid(RetStr, 2) & vbNewLine
    End If
    rsData.MoveFirst
    RetStr = RetStr & """" & rsData.GetString(adClipString, -1, """" & pFileSeparator & """", """" & vbNewLine & """", NULLStr)
    RetStr = Left(RetStr, Len(RetStr) - 3)
    RecordsetToCSV = RetStr
    Exit Function
    Errh:
    RecordsetToCSV = ""
    Exit Function
    End Function
    But in this operation, as the number of records is more the system often throws out with the message "Not enough storage is available to complete this operation.". The Local HD is having around 50GB of free space. when we have less number of records (say around 30-40K), the above process works perfectly.
    Storing the File in the database server will be an issue, as the database server will be in a different location and it will not be possible/advisable to access the
    local directory thru mapped directory in the database server.
    our plan was if the data is available in a clob field, then we could try to read the clob and write to a file in the local directory thru our VB application itself. Not sure, will this also gives a same error as it was giving when reading from the table?.
    Hope I have clarified what we are aiming at.
    Regards
    Murali

  • Poor folio performance when set to PDF for both renditions

    Hello,
    I'm getting ready to release a single edition folio and had originally planned to create separate folios for both iPad 1/2 & iPad 3. It then became apparent that this process isn't available for single edition professional dps. I've now tried creating one 1024 folio w/pdf settings. Both renditions look beautiful, but the performance is not really poor - it takes multiple swipes to change pages within an article. Is there any other methods any of you can suggest to handle this? Both apps perform much better when you using png settings. It's starting to feel like we'll either need to sacrifice performance or display at this point. Any thoughts?
    Thanks!
    Darin

    I haven't toggled the zoom enabled button to see if there's any difference. I should state that I've only tested this in the content viewer - I haven't tested the .ipa files yet. Would there be a noticeable difference?
    I'm only testing one two page article that only contains one scrollable content overlay - nothing too complex.
    Folios and viewer are both v25.

  • Poor query performance in WebI on top of BEx queries

    Hello,
    We are using Web Inteliigence i BO 3.1 (SP0) to report on BEx queries (BW 7.0).
    We experience however that reporting is much quicker for the same set of data when using BEx Analyzer than when using WebI. In BEx it is acceptable, but in WebI it's not.
    How can we optimize the performance in this scenario? What tricks are there?
    The amount of data is not huge (max 500 000 records in the cube)
    BR,
    Fredrik

    Hi,
    Dennis is right. But if you need to upgrade (and you do) than maybe going to the latest SP is better. It is SP4. With SP3 the WebI Option "Query Striping" has been introduced which brings Performance as well.
    Also check
    http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/d0bf4691-cdce-2d10-45ba-d1ff39408eb4
    http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/109b7d63-7cab-2d10-2fbc-be5c61dcf110
    http://www.sdn.sap.com/irj/scn/index?rid=/library/uuid/006b1374-8f91-2d10-fe9c-f9fa12e2f595
    Regards
    -Seb.

  • Poor query performance

    I have an Oracle 10g R2 10.2.0.4 data warehouse with a fact table that holds records that are input in chronological order. Each month of records is contained in its own tablespace. Each tablespace is partitioned by a range partition on the day and subpartitioned by a hash of the primary key into 8 subpartitions, which results in daily partitions. A tablespace usually contains 7 datafiles that are 16384m in size for a total of 114688m (115GB) in physical size. All datafiles are on a SAN within ASM disk groups.
    Why when I query for counts in the fact table over the first three days of a month does it return much faster (orders of magnitude faster) than when I query for counts in the last three days of a month?
    The schema is a star schema and according to the explain plans for both queries star transforms are being achieved.
    Is it the file size? What do you think?

    As Oraclefusions said I think we need to know more about your stats collection method. Are you using the Oracle provided scheduler job with the default sessing or have you modified it?
    When you look at the last_analyzed date for the table how often are the statistics being updated?
    Have you tried running explain plan for the two sets of data then if the plans do not vary have you queried v$sql_plan for the actual execution plans to see how Oracle is solving the two queries?
    HTH -- Mark D Powell --

  • Poor keynote performance when presenting with an MBP 2.16

    Hi,
    I've been using Keynote extensively to make scientific presentations ever since it came out, first on a Powerbook G4 and then recently on an MBP 2.16. One of the reasons I got a new MacBook Pro was in fact to improve (= speed up, smooth) animations when presenting: This was acceptable on the Powerbook, but choppy on occasions, and I like my presentations to be perfect. I naturally expected a considerable improvement on the MBP.
    To my dismay, it's just the reverse: Performance is in fact absolutely horrible when presenting (that is, with the computer connected via the DVI-to-VGA connector to a projector; using the projector as a second screen): Quicktime movies embedded in the presentation are choppy, slide transitions that playted fine before now often exhibit hiccups (e.g., page flip systematically hiccups), several somewhat complex animations (such as "spinning" a large image") totally fail (instead of the cool spinning, I now get a long pause followed by the all-at-once appearance of the image!) ; it sometimes takes ages (4-5 seconds) long to "build" the next slide, leading to confusion as to whether you have requested the next slide to be displayed or not and the ensuing chaos as you make additional keypresses &c.
    Why is this? I've considered possibilites such as I am running Keynote in Rosetta (not the case), I don't have the correct OpenGL drivers after a recent upgrade snafu (the drivers are the correct version), &c. &c. Keep in mind too that this is a 1G trouble-free 2 months old machine with 10.4.7 and nothing too exotic on it. How can a faster machine with loads more VRAM run Keynote so poorly, and disappointgly much less well than my two-year-old PB G4???
    Any tips or insights appreciated.
    -- axel c.

    Thanks for your message. I've never had any trouble working with Keynote and testing out presentations on the MBP's own screen; only when projecting and displaying the presentation itself on a secondary screen. I've just ordered an extra G of RAM hoping this would perhaps help alleviate the issues, but your experience (with your 2G machine) suggests it won't change much.
    Unfortunately I deleted the demo version right away, but the fact that it works properly suggests some issue with preferences, caches or the like perhaps?
    We're not progressing much on this problem.
    --axel
    MBP 2.16 1G   Mac OS X (10.4.7)  

  • How to improve query performance when query with mtart

    hi all,
    I need to know what is the best way to query out MATNR when i have values for MTART and WERKS?
    When a user select a MTART and WERKS, a whole bunch of MATNR related to them are display out. How do i improve this query so that it does not take a long time?
    Thanks
    Willliam Wilstroth

    Is that what you are looking for???
    select a~matnr a~mtart ... b~werks ...
           into table <itab>
           from mara as a
           inner join marc as b
           on a~matnr = b~matnr
           where mtart = p_mtart
           and   werks = p_werks.
    There is an index on MTART in table MARA.
    <b>T           Material Type</b>
    Kind Regards
    Eswar

Maybe you are looking for

  • Default values not appearing

    I've been trying to create default values for a column during and Insert. I've tried both setting the Default value in the Attribute tab of the entity and doing it within the create method, but neither of them populates my textfield. Any ideas on wha

  • I cant not restore/update my ipad 3?!?

    Hello so i was updating my IOS and my ipad crashed and now it is stuck on Connect to Itunes. I have removed and re-installed my itunes and checked my hosts files and their fine. I put my Ipad 3 into DFU mode then connect it to itunes, it extracts the

  • Lacie Blu-Ray external burner with DVD Studio Pro?

    Is there a way to burn my HDV footage as MPEG-2 to a disk image and burn it on a Blu-Ray disk on the Lacie external drive?

  • Advance adjustment

    Hi All, while i am adjusting advance in F-54 system is allowing adjustment amount is more than invoice amount. how can i control the advance amount is equal to invoice amount regards Sree

  • Script for checking datasource connections

    Hi, I would like to find out if it's possible to monitor datasource connections using Unix based scripts and if so how can this be accomplished? Thank you in advance Twaggz