Speeding up select count(*)

Hi,
I'm using a query : - SELECT COUNT(*) FROM tebevt01 a WHERE a.DAIRY_EVENT_ID IN (SELECT dairy_event_id FROM tebevt03) AND a.CREATE_TS BETWEEN '22-JAN-04' AND '12-DEC-04'
Is there any particular optimizer hint that I can use to speed up the retrieval of data?
Thanks,
Bharath

Hi Kuljeet,
when the auto trace is on, and when i used 'WHERE EXISTS' i got : -
Operation     Object Name     Rows     Bytes     Cost     Object Node     In/Out     PStart     PStop
SELECT STATEMENT Optimizer Mode=CHOOSE          1           1                     
SORT AGGREGATE          1      22                          
FILTER                                        
TABLE ACCESS FULL     DRIVER1.TEBEVT01     1      22      1                     
INDEX RANGE SCAN     DRIVER1.IEVT0301     1      13                          
when 'ORDERED' hint was used the explain plan gave : -
Operation     Object Name     Rows     Bytes     Cost     Object Node     In/Out     PStart     PStop
SELECT STATEMENT Optimizer Mode=CHOOSE          1           7                     
SORT AGGREGATE          1      35                          
NESTED LOOPS          1      35      7                     
VIEW     SYS.VW_NSO_1     1      13      7                     
SORT UNIQUE          1      13      7                     
INDEX FULL SCAN     DRIVER1.IEVT0301     1      13                          
TABLE ACCESS BY INDEX ROWID     DRIVER1.TEBEVT01     1      22                          
INDEX UNIQUE SCAN     DRIVER1.IEVT0101     1                               
what do u suggest? should there not be a full table scan which I think. or should the total 'cost' be low?
what should be the 'cost'? high or low or is this irrelevant??
thanks buddy,
Bharath

Similar Messages

  • Is select count(*) correct way to find speed

    Environment I am using:
    Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
    Toad 11.6
    In oracle in general, if i want to know how fast I can get data from a table (or a pipelined function), is select count(*) accurate way to do it ?
    Eg:
    select count(*) from table(schema_name.pkg_name.proc_name(paremter1 in 123 ))
    select count(*) from table(schema_name.pkg_name.proc_name(paremter1 in 123 ))
    or
    select count(*) from tableA
    so can i give above queries and note down the time, is this accurate way to know the fastness?

    In oracle in general, if i want to know how fast I can get data from a table (or a pipelined function), is select count(*) accurate way to do it ?
    There is no such thing as 'in general'.
    It all depends on 'what' data you want to get if you are querying a table and exactly how the function actually works if you are calling a function.
    A query that 'gets' one column very fast might take days to 'get' ALL columns.
    A function that does different queries based on the parameters might return data quickly for one parameter value and be very slow for a different parameter value.
    Start over and tell us what BUSINESS PROBLEM you are trying to solve.

  • How about implement queryResult.size() by "select count(*)..."

    Since the size() method often occupies much resource and slow down speed
    greatly, why not implement it by "select count(*) from ..." instead of
    "resultSet.last()"?
    I think when executing a query, a Query will remember the actual SQL
    executed, and modify it to some "select count(*)..." like SQL when the
    related result collection's size() method is called.

    Since the size() method often occupies much resource and slow down speed
    greatly, why not implement it by "select count(*) from ..." instead of
    "resultSet.last()"?Unfortunately, there are lots of issues with this approach. Basically there
    are just many situations in which it can report bad numbers.

  • Select count(*) where exists (takes 5 hours).

    Hello Gurus,
    I have two databases on two servers, I am counting how many rows are similiar on two tables that are identical, and the rows should be identical as well. I am running a select count(*) where exists query and it takes 5 hours to complete.
    Each table only has two million rows.
    What can I do to speed it up?

    5 hours to process 2M rows does sound a bit long :(
    I didn't see this mentioned explicitly, but I thought the idea of comparing data on 2 servers implied a database link. Tuning distributed queries can be nasty.
    Start by getting an execution plan of the query to figure out what it is doing. Compare that to the plan generated by the already suggested MINUS operator. You'll need to do MINUS twice with each query in the other's position the second time. Alternately, check the indexing on the subqueries; EXISTS tends to work best with fast indexed lookups. FTS on an EXISTS subquery is not good :(
    Think about copying the data locally to one system or the other first, maybe in a materialized view or even global temporary table.
    Finally, think about tuning the transfer. There are articles on Metalink on tuning the transfer packet sizes (SDU/TDU) which might help IF YOU ARE ON UNIX; I haven't had any luck changing these values on Windows. You can also look into setting tcp.nodelay which can affect when packets get sent (another Metalink article should cover this).

  • Performance issue when using select count on large tables

    Hello Experts,
    I have a requirement where i need to get count of data  from a database table.Later on i need to display the count in ALV format.
    As per my requirement, I have to use this select count inside a nested loops.
    Below is the count snippet:
    LOOP at systems assigning <fs_sc_systems>.
    LOOP at date assigning <fs_sc_date>.
    SELECT COUNT( DISTINCT crmd_orderadm_i~header )
       FROM crmd_orderadm_i
       INNER JOIN bbp_pdigp
           ON crmd_orderadm_iclient EQ bbp_pdigpclient               "MANDT is referred as client
         AND crmd_orderadm_iguid  EQ bbp_pdigpguid
         INTO w_sc_count
    WHERE crmd_orderadm_i~created_at BETWEEN <fs_sc_date>-start_timestamp
         AND <fs_sc_date>-end_timestamp
         AND bbp_pdigp~zz_scsys   EQ <fs_sc_systems>-sys_name.
    endloop.
    endloop.
    In the above code snippet,
    <fs_sc_systems>-sys_name is having the system name,
    <fs_sc_date>-start_timestamp is having the start date of month
    and <fs_sc_date>-end_timestamp is the end date of month.
    Also the data in tables crmd_orderadm_i and bbp_pdigp is very large and it increases every day.
    Now,the above select query is taking a lot of time to give the count due to which i am facing performance issues.
    Can any one pls help me out to optimize this code.
    Thanks,
    Suman

    Hi Choudhary Suman ,
    Try this:
    SELECT crmd_orderadm_i~header
      INTO it_header                 " interna table
      FROM crmd_orderadm_i
    INNER JOIN bbp_pdigp
        ON crmd_orderadm_iclient EQ bbp_pdigpclient
       AND crmd_orderadm_iguid   EQ bbp_pdigpguid
       FOR ALL ENTRIES IN date
    WHERE crmd_orderadm_i~created_at BETWEEN date-start_timestamp
                                          AND date-end_timestamp
       AND bbp_pdigp~zz_scsys EQ date-sys_name.
        SORT it_header BY header.
        DELETE ADJACENT DUPLICATES FROM it_header
        COMPARING header.
        describe table it_header lines v_lines.
    Hope this information is help to you.
    Regards,
    José

  • How can I slow down the playback speed of selected parts of a captivate video?

    Hi everybody,
    I'm pretty new to Captivate and although it offers some great tools, there is something that I just can't get to work:
    I'm creating a video tutorial about how to use a website i'm working with so I've tried using "Automatic" ("Demo" mode chosen) recording option which is recommended for this type of video. However, the video recorded has a different playback speed than the amount of time I recorded. This means that some of the slides have a quicker playback speed than the way I recorded, thereby not leaving enough time to show the given feature.
    The recording mode with the most "true" playback was "Full motion". However, I would still like to be able to slow down selected parts of the video, but can only find guides on how to slow down the entire presentation.
    Can you please advise me on how to slow down only selected parts of the project? If this is not possible in Captivate, please advise me on which video editing software (where you can slow down the playback speed on selected parts of the video) is compatible with Captivate 5?
    Thanks!

    Thank you. Andrew Kramer's Video Copilot video, which I somehow managed to miss, was very helpful.
    I had a 79 second clip which I precomposed and enabled time remapping. But I have 12 places where I need to slow down the layer. After a while, I was runing out of room to add more keyframes using the method promoted in many videos and instruction sites (grab the last two keyframes, including the end frame, and drag).
    In reality, you can add keyframes wherever you like and you can adjust them however works best within the existing timeline without messing with the duration, etc.
    Much appreciated.
    Paul

  • "select count(*)" and "select single *" returns different result

    Good day!
    product version SAP ECC 6.0
    oracle10
    data transfers from external oracle db into customer tables using direct oracle db link
    sometimes I get case with different results from 2 statements
    *mytable has 10 rows
    *1st statement
    data: cnt type I value 0.
    select count( * ) into cnt from mytable WHERE myfield_0 = 123 and myfield_1 = '123'.
    *cnt returns 10 - correct
    *2nd statement
    select single * from  mytable WHERE myfield_0 = 123 and myfield_1 = '123'.
    *sy-dbcnt returns 0
    *sy-subrc returns 4 - incorrect, 10 rows are "invisible"
    but
    1. se16 shows correct row number
    2. I update just one row from "invisible" rows using se16 and 2nd statement returns correct result after that
    can not understand why
    thank you in advance.

    Thank you, Vishal
    but,
    general problem is that
    1. both statements have the same WHERE conditions
    2. 1st return resultset with data (sy-dbcnt=10), 2nd return empty dataset, but must return 1 in sy-dbcnt
    Yes, different meaning, you are right, but must 2nd must return 1, because of "select single *" construction, not 0.
    Dataset to process is the same, WHERE conditions are equal...
    I think the problem is that how ABAP interperets select count(*) and "select single *".
    Maybe "select count (*)" scans only PK from index page(s)? and "select single *" scans data pages? and something is wrong with that?
    I'm new in SAP and didn't find any SAP tool to trace dump of data and indexes pages with Native SQL.
    se16 shows all records.
    And why after simple manual update of just one record using se16 "select single *" returns 1?
    I've just marked one row to update, didn't change any data, then pressed "save".

  • Select count from large fact tables with bitmap indexes on them

    Hi..
    I have several large fact tables with bitmap indexes on them, and when I do a select count from these tables, I get a different result than when I do a select count, column one from the table, group by column one. I don't have any null values in these columns. Is there a patch or a one-off that can rectify this.
    Thx

    You may have corruption in the index if the queries ...
    Select /*+ full(t) */ count(*) from my_table t
    ... and ...
    Select /*+ index_combine(t my_index) */ count(*) from my_table t;
    ... give different results.
    Look at metalink for patches, and in the meantime drop-and-recreate the indexes or make them unusable then rebuild them.

  • Select count(*) statement in ABAP

    Hi,
    Im writing following statement in my Function module,
    select count(*) into l_count
    from user_master
    where username = l_username and
          process_type = processtype and
          password = oldpassword.
    And there is one entry in table user_master.
    But still, I'm getting l_count as zero..
    Can somebody help me with this.
    Regards,
    Amey

    select count(*) into l_count
    from user_master
    where username = l_username and
    process_type = processtype and
    password = oldpassword.
    Use group by option...
    Like this....
    select count(*) into l_count
    from user_master
    where username = l_username and
    process_type = processtype and
    password = oldpassword group by username.

  • Select Count(*) from Sample_table - how to get the count using JDBC?

    Hi All,
    It would be glad if anyone could help me with this. The problem is that I have to get the 'count' of records selected from a arbitrary table say, 'sample_table'. Is that possible to form the SQL in JDBC as
    Select Count(*) from Sample_table
    and get the value of the count? If yes, how?
    Thanks in advance
    Prabz

    stmt = con.createStatement();
    ResultSet recordcnt_rs = stmt.executeQuery("Select Count (*) as record_ctr From Sample_table");
    recordcnt_rs.next();     
    record_ctr = recordcnt_rs.getInt("record_ctr");
    hope this helps.

  • Select count(*) for each row of a table

    Hello All,
    Following query gives a statistics for each user (how many items he owns, home many tickets authored, how many objects he is subscribed to etc...)
    select auser.userid,
    (select count(*) from item where owner like '%' || auser.id || '%') ITEM_OWNER_CNT,
    (select count(*) from tkt where originator = auser.id) TKT_ORIGINATE_CNT,
    (select count(*) from tkt where assigned_to = auser.id) TKT_QA_CNT,
    (select count(*) from tkt where create_user = auser.id) TKT_AUTHOR_CNT,
    (select count(*) from subscriptions where subscriber_id = auser.id) SUBSCRIPTION_CNT
    from
    user auser
    I was not happy with the performance of this query, so I tried the same using group by. The performance was even worse.
    Is there any other option for me to try? Please advice.
    Thanks,
    Sathish

    Hi, Sathish,
    As SBH said, a lot depends on your data. Please post some sample data (CREATE TABLE adn INSERT statemetns) for all tables, and the results you want from that data. Describe and give examples of any relationships that are not one-to-one..
    You probably want to do joings, like SBH suggested, rather than scalar sub-queries.
    The connection between the auser and item tables
    (select count(*) from item where owner like '%' || auser.id || '%') ITEM_OWNER_CNT,is very suspicious. Perhaps the item table is poorly designed, and the query would be faster if that table were changed. Is changing the design of the item table an option?
    You should be able to get all the information from the tkt table in one pass. It looks like you need to unpivot the data, so instead of one row per ticket (with 3 different people connected to it), there are 3 rows per ticket, each with only 1 person referenced. This is not necessarily a bad table design. Unpivoting, even more than most other things, depends on your database version, so you'll have to tell what version of Oracle you're using.

  • Why is the select Count too slow

    I am doing the following select count and calling it from my JSP to get the total number of records... why is it so slow...
    select count(*)
    from
    (select distinct o.receive_id, o.name, o.address
    from order o, item i
    where o.id = i.id
    and o.status = 2 and i.status = 0)

    If the data in the table that you are referring to in the query gets refreshed very often and your high water mark on your table not reset, then this query always runs longer. While deleting data in the table, use 'TRUNCATE' rather than 'DELETE' in your data queries. that would help reset the high water mark and your count() queries will run very very fast.

  • Select count * is not working

    Hi everybody.
    I've got a very strange problem, when i'm doing a select count* the result is giving me a value that is not the maximum (but when i check the database table the maximum value is another..)
    Could it be that the select command is not executing against the table, rather than the SAP cache??
    If this is the case, how can i avoid this?? I mean force the select command to execute against de DB table.
    thanks a lot.

    to get max value of a table u can use
    Select max( fld )............
    Bypassing the SAP buffer with the above additions is a means to increase the performance when accessing buffered database tables. To explicitly bypass the SAP buffer in the SELECT statement, always use the addition BYPASSING BUFFER instead of the implicit behavior of the additions stated above.

  • Select count(*) from table in oracle 11g with direct path read takes time

    select count(*) from table takes long time, even more than couple of hours..
    direct path read is the wait event which is almost is at 99%..
    can u someone provide some info on this.. on solution.. thankx

    knowledgespring wrote:
    table has millions of records... 130 millions..
    select count(*) from BIG_SIZE_TABLE; --- executed in sql plus command prompt.
    Rows     Execution Plan
    0  SELECT STATEMENT   MODE: ALL_ROWS
    0   SORT (AGGREGATE)
    0    TABLE ACCESS   MODE: ANALYZED (FULL) OF 'BIG_SIZE_TABLE' (TABLE)
    Elapsed times include waiting on following events:
    Event waited on                             Times   Max. Wait  Total Waited
    ----------------------------------------   Waited  ----------  ------------
    SQL*Net message to client                       1        0.00          0.00
    enq: KO - fast object checkpoint                1        0.01          0.01
    Disk file operations I/O                       18        0.00          0.00
    direct path read                            58921        0.34        418.54direct path read time waited is : 58921 total time waited: 418.54
    That 418 seconds - not the hours you reported earlier. Is it possible that your connection to the database broke ?
    On a typical system, by the way, you can usually turn one direct read for tablescan into 1MB, so your scan seems to have covered about 59 GB, which seems to be in the right sort of ballpark for 130M rows.
    we have another query and when we test the query execution using v$sql, is_bind_sensitive =N, how to make is_bind_sensitive=Y all the time.. There is a hint /*+ bind_aware */ - I'd have to check whether or not it's documented at present. It might help.
    I would be interested in hearing why you think the hint should be bind sensitive when the optimizer doesn't.
    Regards
    Jonathan Lewis

  • SELECT COUNT( ) gives warning in ECC6.0.

    Hi,
    The following query is giving syntax error in ECC6.0, where as it worked absolutely fine in 3.1i server.
    SELECT COUNT( OBOX_CNTNO ) FROM  ZT2OB
                                 INTO  W_COUNT
                                 WHERE SUPPL_CD   = W_SUPPL_CD
                                 AND   INVC_NO    = W_INVC_NO
                                 AND   INVC_LN_NO = T_SCR_ITEMS-INVC_LN_NO.
    Error: "COUNT( OBOX_CNTNO )" is only valid in the extended form "COUNT( DIS
    OBOX_CNTNO )" . . .
    The query seems obsolete in ECC6.0. Can anybody help me to give valid query for this in ECC6.0?

    Hi,
    <b>Count</b> functionality is to be used along with <b>Distinct</b> functionality.
    COUNT( DISTINCT col )
    <b>Reward points if this helps,</b>
    Kiran

Maybe you are looking for