Slow sql execution

I have SQL query retreiving lots of data from several tables, and having specific condition for nohem as it is displayed in following subquery:
ss.nohem=(select Max(ss.nohem)
from sschem ss
where nohem in (3,5,6)
and TRIM(ss.id)=TRIM(hc.id)
As I notice, this subquery slows down main SQL execution (besides the tables are large and not well organazied).
select ss.nohem, hc.time, hc.id, hc.shift, hc.crew, tm.qualityorg,
ss.c, ss.si, ss.mn, ..., ..., ss.ca,
l2_min.c as c_min, l2_max.c as c_max,
l2_min.si as si_min, l2_max.si as si_max,
l2_min.mn as mn_min, l2_max.mn as mn_max,
l2_min.ca as ca_min, l2_max.ca as ca_max,
tm.quality
from sschem ss, tmelt tm, h_cast hc,
l2_chem_grade l2_min, l2_chem_grade l2_max
where (hc.time > {?from} and hc.time <= {?to})
and ss.nohem=(select Max(ss.nohem)
from sschem ss
where nohem in (3,5,6)
and TRIM(ss.id)=TRIM(hc.id)
and tm.qualityorg=l2_min.quality_code and l2_min.range_type='MIN'
and tm.qualityorg=l2ch_max.quality_code and l2_max.range_type='MAX'
and TRIM(ss.id)=TRIM(tm.id)
and TRIM(hc.id)=TRIM(tm.id)
and TRIM(ss.id)=TRIM(hc.id)
order by hc.time
How can I reorganize this query to make its execution faster?
Thanks!

Problem with the sub-query is likely a full table scan needs to be performed. The predicate "TRIM(ss.id)=TRIM(hc.id)" uses a function to convert the searched column.
This means reading every row applicable, applying the TRIM function to the ID column, and then evaluating the predicate. If the ID column is indexed, the index is made useless by the function.
Solution in this case - either make use of a function index, or better still, apply the TRIM via the INSERT/UPDATE trigger and create a normal index on the ID column.
Second problem is that the sub-select is ran for every single row selected in the main loop - it is a corellated query as the predicate for the sub-query includes a value from the row from the main query.
So if the main query hits 10,000 rows, this sub-query will be executed 10,000 times. With the sub-query doing a full table scan, this is very, very expensive.
Solutions. Ensure that all filters and processing are done (upfront) to reduce the result of the main query to a minimum, in order to reduce the number of sub-queries to perform (1 per row) to a minimum. Or rethink the logic and design of the entire query and do away together with the corellated sub-query.

Similar Messages

  • Slow query execution time

    Hi,
    I have a query which fetches around 100 records from a table which has approximately 30 million records. Unfortunately, I have to use the same table and can't go ahead with a new table.
    The query executes within a second from RapidSQL. The problem I'm facing is it takes more than 10 minutes when I run it through the Java application. It doesn't throw any exceptions, it executes properly.
    The query:
    SELECT aaa, bbb, SUM(ccc), SUM(ddd), etc
    FROM MyTable
    WHERE SomeDate= date_entered_by_user  AND SomeString IN ("aaa","bbb")
    GROUP BY aaa,bbbI have an existing clustered index on SomeDate and SomeString fields.
    To check I replaced the where clause with
    WHERE SomeDate= date_entered_by_user  AND SomeString = "aaa"No improvements.
    What could be the problem?
    Thank you,
    Lobo

    It's hard for me to see how a stored proc will address this problem. I don't think it changes anything. Can you explain? The problem is slow query execution time. One way to speed up the execution time inside the RDBMS is to streamline the internal operations inside the interpreter.
    When the engine receives a command to execute a SQL statement, it does a few things before actually executing the statement. These things take time. First, it checks to make sure there are no syntax errors in the SQL statement. Second, it checks to make sure all of the tables, columns and relationships "are in order." Third, it formulates an execution plan. This last step takes the most time out of the three. But, they all take time. The speed of these processes may vary from product to product.
    When you create a stored procedure in a RDBMS, the processes above occur when you create the procedure. Most importantly, once an execution plan is created it is stored and reused whenever the stored procedure is ran. So, whenever an application calls the stored procedure, the execution plan has already been created. The engine does not have to anaylze the SELECT|INSERT|UPDATE|DELETE statements and create the plan (over and over again).
    The stored execution plan will enable the engine to execute the query faster.
    />

  • Just a helpful SAP note for slow SQL statements

    Hi Guys,
    Just wanted to share this SAP note with you. I am sure many of you might have gone through it.
    [SAP Note 155413 - Analysis of slow SQL statements|https://websmp130.sap-ag.de/sap(bD1lbiZjPTAwMQ==)/bc/bsp/spn/sapnotes/index2.htm?numm=155413]
    Cheers,
    Abu

    >
    ZAFCO ABAP wrote:
    > Hi Guys,
    >
    > Just wanted to share this SAP note with you. I am sure many of you might have gone through it.
    >
    > [SAP Note 155413 - Analysis of slow SQL statements|https://websmp130.sap-ag.de/sap(bD1lbiZjPTAwMQ==)/bc/bsp/spn/sapnotes/index2.htm?numm=155413]
    >
    > Cheers,
    > Abu
    Hi,
    I would bet not as many as you might think -  many questions here suffering form not GOING through
    the analysis before they post it here. 
    Meantime I think questions to SQL statement performance here will only be answered when the execution plan on the statement  is posted with it.
    bye
    yk

  • SQL execution error, ORA-01843: not a valid month

    Im using ASP/VBScript and its my first time starting to use Oracle as a DB provider.
    Just having an issue with a statement that I have.
    Heres my statement:
    SELECT T592_NOON.SHIP_CODE, T592_NOON.REPORT_DATE, T592_NOON.L_B, T592_NOON.AVERAGE_SPEED, T592_NOON.SEASTATE, T592_NOON.DISTANCE, T592_NOON.WIND_DIRECTION, T592_NOON.IFO_MAIN, T592_NOON.IFO_BOILER, T592_NOON.IFO_AUXENGINE FROM T592_NOON WHERE (((SHIP_CODE)='S271') AND (REPORT_DATE BETWEEN to_date('08/02/2004 13:00:00', 'DD-MON-YYYY HH24:MI') and to_date('28/02/2004 18:15:00', 'DD-MON-YYYY HH24:MI')))
    Whenever I run it it errors and returns:
    SQL execution error, ORA-01843: not a valid month
    Can anyone tell why this wouldnt work?
    REPORT_DATE type is DATE
    REPORT_DATE Sample data: 2003-04-28-12.00.00.000000

    Changing the format of the date seemed to fix it.
    Incorrect: '08/02/2004 13:00:00'
    Correct: '08-FEB-2004 13:00'

  • Broken pipe / timeout during slow SQL statement in servlet

    I have a servlet which supplies the client with quite a large block of data from an SQL query.
    This works fine in a local test environment but I get problems running it under a fully fledged application server environment.
    I find a "Broken Pipe" exception on the application log and the client side application gets an application error status code.
    07/07/16 09:32:30.85 lapSycWebsite: Broken pipe
    07/07/16 09:32:30.85 lapSycWebsite: Broken pipe
    07/07/16 09:32:30.85 lapSycWebsite: Broken pipe
    07/07/16 09:32:30.85 lapSycWebsite: Broken pipe
    07/07/16 09:32:30.85 lapSycWebsite: Broken pipe
    07/07/16 09:32:30.85 lapSycWebsite: Broken pipe
    07/07/16 09:32:30.86 lapSycWebsite: Broken pipe
    07/07/16 09:32:30.86 lapSycWebsite: Broken pipe
    07/07/16 09:32:30.86 lapSycWebsite: Broken pipe
    07/07/16 09:32:30.86 lapSycWebsite: Servlet error
    java.io.IOException: Broken pipe
    at sun.nio.ch.FileDispatcher.write0(Native Method)
    at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:29)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:104)
    at sun.nio.ch.IOUtil.write(IOUtil.java:75)
    at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:302)
    at java.nio.channels.Channels.write(Channels.java:60)
    at java.nio.channels.Channels.access$000(Channels.java:47)
    at java.nio.channels.Channels$1.write(Channels.java:134)
    at com.evermind.server.http.AJPOutputStream.endRequest(AJPOutputStream.j
    ava:117)
    at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java
    :309)
    at com.evermind.server.http.AJPRequestHandler.run(AJPRequestHandler.java
    :190)
    at oracle.oc4j.network.ServerSocketReadHandler$SafeRunnable.run(ServerSo
    cketReadHandler.java:260)
    at com.evermind.util.ReleasableResourcePooledExecutor$MyWorker.run(Relea
    sableResourcePooledExecutor.java:303)
    at java.lang.Thread.run(Thread.java:595)
    :q
    We're looking for ways to get the SQL execution time down, but even if we succeed in this case it's a source of instability that will trip us up in the future.
    This SQL statment can take up to about 8 minutes to return the first row.
    The client is a Java swing program, by the way, not a browser as such.
    Later:
    We've got the SQL execution time down and it's working for the time being but it's a problem that's going to hit us again sooner or later. Still looking for a solution.
    Message was edited by:
    IronChicken

    Refer this url for inserting blob datatype to database.
    See the LOBDatatype sample. This sample uses java application but same works for a servlet too.
    http://otn.oracle.com/sample_code/tech/java/sqlj_jdbc/files/advanced/advanced.htm
    You can refer source to see how the lob data is inserted.
    Chandar

  • OEM 11g - Monitored SQL Executions, click SQL ID, shows blank screen??

    I am trying to investigate my execution plans against my DB; and was informed i can check current status of SQL scripts using:
    Performance tab > SQL Monitoring > Monitored SQL Executions
    I click on SQL ID i want to investigate and comes back with blank screen instead of the overview tab.
    See Oracle URL below for screenshot
    Figure 6-8 Monitored SQL Execution Details Page
    http://download.oracle.com/docs/cd/E11857_01/em.111/e11982/database_management.htm
    Kind Regards,
    Paul

    Please log an SR provide SQL Monitor Active Report for your SQL. Thanks.
    -Mughees

  • Backtrace of ABAP and SQL execution

    Hello everyone!
    Does anybody know how to see logs of ABAP and SQL execution. I saw SLG1 but didn't found this information.
    I'm not interested in writing to SLG, I want to have opportunity to see the User, who deleted some entries from tables or launched ABAP code, for example.

      Do you mean transcation SCU3 for viewing table changes?
    Yes
    About ABAP-SQL execution... I can't foresee which program will be executed and which table will be effected, so I need some report that shows for particular table which statement was executed, and report about list of programs run by user. Do you know this?
    You can see which transaction is executed by a user on given period of time by using transaction ST03
    But which table accessed or which sql executed, in a scenrio in which you cannot forsee then its not possible.

  • Question on Dynamic SQL Execution

    Hi,
    Our company is currently using Oracle 7 but will move to Oracle 8i soon. I am trying to execute a dynamic SQL statement in a function and it always error-out during execution. The SQL statement is NOT doing any update to a table. Its doing a select only. The function is being called during an execution of another dynamic SQL statement in a procedure. Here are examples of the code listing for the procedure and function:
    CREATE OR REPLACE PROCEDURE TEST_PROC
    lookup_cursor      integer;
    ignore          integer;
    VARvalue          number;
    begin
    lookup_cursor := DBMS_SQL.open_cursor;
    DBMS_SQL.PARSE( lookup_cursor,
              'SELECT ' || TEST_FUNCTION || ' FROM DUAL,
              DBMS_SQL.NATIVE);
    DBMS_SQL.DEFINE_COLUMN( lookup_cursor, 1, VARvalue);
    ignore := DBMS_SQL.EXECUTE(lookup_cursor);
    loop
         IF DBMS_SQL.FETCH_ROWS(lookup_cursor) > 0 THEN
         DBMS_SQL.COLUMN_VALUE(lookup_cursor, 1, VARvalue);
         ELSE
         EXIT;
         END IF;
    END LOOP;
    DBMS_SQL.CLOSE_CURSOR(lookup_cursor);
    end TEST_PROC;
    CREATE OR REPLACE PROCEDURE TEST_FUNCTION
    lookup_cursor      integer;
    ignore          integer;
    VARvalue          number;
    VARsql_string     VARCHAR2(200);
    begin
    lookup_cursor := DBMS_SQL.open_cursor;
    VARsql_string := SOME GENERATED SQL STATEMENT;
    DBMS_SQL.PARSE( lookup_cursor,
              VARsql_string,
              DBMS_SQL.NATIVE);
    DBMS_SQL.DEFINE_COLUMN( lookup_cursor, 1, VARvalue);
    ignore := DBMS_SQL.EXECUTE(lookup_cursor);
    loop
         IF DBMS_SQL.FETCH_ROWS(lookup_cursor) > 0 THEN
         DBMS_SQL.COLUMN_VALUE(lookup_cursor, 1, VARvalue);
         ELSE
         EXIT;
         END IF;
    END LOOP;
    RETURN VARvalue;
    end TEST_FUNCTION;
    The error I received during execution of TEST_PROC is:
    ORA-06571: Function TEST_FUNCTION does not guarantee not to update database
    ORA-06512: at "SYS.DBMS_SYS_SQL", line 239
    ORA-06512: at "SYS.DBMS_SQL", line 32
    It may seem like the example procedure doesnt need to use a dynamic SQL execution to call TEST_FUNCTION but the actual code that I extracted from does.
    Does Oracle 7 always treat the dynamic SQL command set as some kind of update statement? Is that a bug? I understand that the EXECUTE IMMEDIATE command in Oracle 8i will replace the old command set found in the above examples. Will using the new EXECUTE IMMEDIATE command in Oracle 8i solve this problem?
    Thank you for any help,
    Tony

    In Oracle 7, for a function to be called from a select statement it has to follow the 'purity rule' that it does not modify any database table or package variable.
    Probably you will have to use the compiler directive PRAGMA RESTRICT_REFERENCES (WNDS,WNPS) on your TEST_FUNCTION so that it can be called within a SQL statement.
    This restriction is removed in Oracle 8i onwards.
    Hope this solves your problem.
    Regards

  • Monitoring pl/sql execution from Enterprise Manager

    I need to implement monitoring of PL/SQL code from within Oracle Enterprise
    Manger 10g. OEM has Custom user defined metrics (UDM) that allow one to issue
    queries against a database and decide whether the output from the query is a
    warning or a critical alert based on some threshold.
    In my case, my pl/sql will write to a database table that OEM will monitoring by
    querying periodically.
    My question is how does OEM know not to report on the same error about the same
    session multiple times. Once OEM has detected that my PL/SQL routine generated
    an exception during one of its execution, how will know not to alert on the same
    exception from the same pl/sql execution, the next time it's querying the
    database?
    It almost sound like the SQL query OEM will be executing needs to know what it
    reported on before.
    Any clarity on this would be appreciated.

    ok ..thanx .. can i view all historical SQL Text that is executed by a perticuler User say SCOTT.??? In the same page within SQL DETAIL you can find task owner also,

  • SSMA "Loading to database new table File Name.dbo[Table] ...sql execution failed

    In this case I had already processed this table once before 'no changes' and processed the second time I received this error ...sql execution Failed. It's like the sql server 2008 R2 doesn't see or detect the process. Starting Phase #0 Synchronizing Database:
    then it shows 'Loading to database new table file name.dbo[table] ... sql execution failed (this is my issue)

    Hi TheJudge2,
    Based on my understanding, you have installed SQL Server Migration Assistant successfully then you perform migration. After migration, you can’t find the table which you want to migrate to SQL Server 2008 R2 under the database in your SQL Server Management
    Studio, then you perform migration again. Then error message “Loading to database new table file name.dbo[table] ... sql execution failed” is thrown out. Please correct me if I misunderstand your meaning.
    Firstly, I would like to know whether you perform migration from Access database to SQL Server. I have performed migration from Access database to SQL Server in my lab environment.  Based on my test, I could migrate Access database to SQL Server successfully
    and table existed under the database in SQL Server Management Studio after migration.
    Besides, “sql execution failed” is a general error message. It is hard to find out the cause from this error message. Please check the information under the Output in SQL Server Migration Assistant again. It would be better if you can provide the complete
    output information for our deep analysis.
    Best regards,
    Qiuyun Yu

  • Error during SQL execution

    Hi Experts,
    We run a report which fails frequently with the below error. Could any one help me with the solution and reasons for this error.
    Error during SQL execution: (DA0003): [Exception: DBD, ORA-01722: invalid number State: N/A] The following data providers have not been successfully refreshed: His. (DMA0007): []
    Connection or SQL sentence error: (DA0005): [Exception: DBD, ORA-12535: TNS:operation timed out State: N/A] A connection required to refresh this document is unavailable. (DA0004): [] The following data providers have not been successfully refreshed: Reservations CW. (DMA0007): []
    Many Thanks
    Regards,
    Syed

    Hi,
    The report is running for long time and it's getting failed. could you please let me know what could be the reason for this?
    And could you please tell me the reason/Solution for the first error which i mentioned before.
    Many Thanks
    Regards,
    Syed

  • How many days old we can see SQL Executions OEM 11g

    one of my technical guy asked me 5 days back sql session information how many days old we can see SQL Executions OEM 11g ..?

    Metric Historical Information will be saved for a year by default.
    Check http://download.oracle.com/docs/cd/E11857_01/em.111/e16790/repository.htm#i1030660
    SQL Statement execution might be analyzed from AWR snapshots using ADDM.
    You can keep AWR Snapshots as long as you like.
    Bare in mind that this will occupy database space.
    From the Database Home page select the Server tab and select the Automatic Workload Repository link to set Snapshot Retention
    Regards
    Rob
    http://oemgc.wordpress.com

  • File dialog box slow down execution

    Dear all,
    I am using Labview 8.2.1 with Windows XP.
    I have a program who's allow the user to select any file or folder thanks to File dialog box.
    For a reason that i don't understand when this dialog box is displayed, other parrallel while loop time execution goes slow down.
    Put on my LabView front panel File Path command without any code and press "Browse" file button as shown on joined picture_1 birng slow down execution of the while loop.
    Does any body could explain why this problem appear ?
    By switch off on LabView Tool parameter "Use native file dialogs" (picture_2). the problem disapear. Unfortunately this kind of old dialog box is not practical...
    If any body have an idea it could help me.
    Thanks.
    Solved!
    Go to Solution.
    Attachments:
    picture_1.JPG ‏16 KB
    picture_2.JPG ‏71 KB

    __KB__ wrote:
    Hello,
    When the File dialog box is running, other while loop time execution goes down.
    Thanks.
    This you have already mentioned in your first post... now my question is how you've actually figured it out... or can you share your code here???
    I am not allergic to Kudos, in fact I love Kudos.
     Make your LabVIEW experience more CONVENIENT.

  • How to get the SQL Execution Plan from complex Extractors ?

    Hi
    I am looking for a way to get  the
    SQL Execution Plan(s!) 
    from
    Complex Extractors like 0CO_OM_CCA_9 ?
    Anybody has got a suggestion ?
    How to get this in SM50 ?
    ThanXs
    Martin

    Identifying the query is the hard part. If you can identify it(based on table access or some such parameter, getting the execution plan is easy in ST04 .

  • How to find out if SQL execution plan is changed proactively using job/grid

    Hello,
    Can you help me on How to find out if SQL execution plan is changed proactively using job/grid control?
    Thank you..
    -

    The answers so far are supposed to show ways how to see that a plan changed after the fact - that is not really proactive but that was the question.
    A way to see a plan change proactively would be to create a SQL Plan Baseline for the SQL statement with the 'good old' plan and then watch DBA_SQL_PLAN_BASELINES for new rows with that SQL_HANDLE which would indicate that a new execution plan was computed - although not yet used.
    Kind regards
    Uwe Hesse
    "Don't believe it, test it!"
    http://uhesse.com

Maybe you are looking for

  • PSE 13 : empilement auto jpeg cr2

    Bonjour, Quant on utilise l'empilement automatique à l'import des versions Jpeg et Cr2 des mêmes images peut-on choisir le format de l'image de dessus de pile ? Merci

  • I have a 2.0 ghz iMac with 3gb of RAM. How well would Lion run on my machine?

    I am debating whether to upgrade to Lion, but I've read stories of it crippling older iMacs.  Would my 2007 iMac (2.0ghz, 3gb RAM) be affected?  I also currently use Photoshop CS3.  Would this still work after the upgrade?

  • Error is Shiiping point  in Sales order

    Hi friends, Ship.condition  loading grp 0001 plant SF01 StLoc PR03 not defined I have a material which has been created in storage location PR03. I am trying to make a sales order but when i try to save the sales order order I am getting the above er

  • X-Fi Xtreme Gamer Fatality and external deco

    Hello. I have problems with my X-Fi Xtreme Gamer Fatality. I connect the sound car to a external Denon decoder?with a RCA Coxial cable. I listen the sounds of computer, but i don?t have dolby or dts sound. In DVD sound in DOLBY ok using Power DVD for

  • Viewing PDFs in Flash

    We want to view some PDFs in a Flash-based training piece we are creating. I looked at FlashPaper and another tool called PDF2SWF. The two issues I see are that some fonts don't look quite right in the SWF (heavy fonts get a little muddy), and I woul