This discussion is archived
1 2 3 4 Previous Next 53 Replies Latest reply: May 14, 2009 12:47 PM by Randolf Geist Go to original post RSS
  • 45. Re: Oracle 10g performance degrades while concurrent inserts into a table
    26741 Oracle ACE
    Currently Being Moderated
    One thing that puzzles me: in the trace file extract you showed 6,000 queries against the table, but only >inserts. This doesn't seem like a fast enough rate of change to cause a problem.
    He says
    Intially i insert a row in to a table A, which inturns fires a Insert After trigger , This trigger has business logic to update a row in one table B, and insert another row in one more table YYYY, Before inserting row in to YYY table we first fire problematic select query on the YYYY table (which we have seen before).
    Is it possible that the insert into YYYY is "once per transaction against A" but the query on YYYY is "for every row" ? That the insert and the query aren't in the same trigger but have different rules that cause them to fire.
    Then also that multiple transactions "remain open" concurrently.

    OR that there's an Undo bug somewhere.....
  • 46. Re: Oracle 10g performance degrades while concurrent inserts into a table
    Jonathan Lewis Oracle ACE Director
    Currently Being Moderated
    Hemant K Chitale wrote:

    OR that there's an Undo bug somewhere.....
    Or maybe he's running with one of the larger block sizes and has found another ASSM bug.

    Regards
    Jonathan Lewis
    http://jonathanlewis.wordpress.com
    http://www.jlcomp.demon.co.uk


    "Science is more than a body of knowledge; it is a way of thinking"
    Carl Sagan
  • 47. Re: Oracle 10g performance degrades while concurrent inserts into a table
    700680 Newbie
    Currently Being Moderated
    Hi Jonathan,

    Here the table structure and index definition
    CREATE TABLE YYYY 
    (
         LPTID  VARCHAR2(10) NOT NULL , 
         CCCC   NUMBER NOT NULL , 
         X1         NUMBER NOT NULL , 
         X2     NUMBER NOT NULL , 
         Y1         NUMBER NOT NULL , 
    )
    
    CREATE INDEX YYYY_IDX  ON YYYY (LPTID, CCC);
    
    and the problematic query is    "SELECT X1,X2 FROM  YYYY WHERE LPTID = :B2 AND CCC = :B1 "
    Yes i have even tried by having parititioning of this table into 4 patitions, These are on different table space, but still on the same HDD.
    CREATE TABLE YYYY 
    (
         LPTID  VARCHAR2(10) NOT NULL , 
         CCCC   NUMBER NOT NULL , 
         X1         NUMBER NOT NULL , 
         X2     NUMBER NOT NULL , 
         Y1         NUMBER NOT NULL , 
    )
    PARTITION HASH(LPTID)
    PARTITIONS 4
    STORE IN (tbs_01, tbs_02, tbs_03, tbs_04);
    
    Please be informed that now i have removed partitions are been removed.
    how can we narrow down whether the problem is with index or table or both ?

    data on LPTID and CCC will be as belows. LPTID is an varchar and CCC is an number. which varies from 0 to 65535, most of the times its values are repeative and LPTID values has first 8 to 10 chars same and last 3 to 4 chars vary.

    Note not always these values do not start from A1al0000 but it will have such repeatatiive sets like, 10 thousand records starting A1a10000XXX and another 10 thousand starting with CSap0000XXX and some more sets like C4al0000XXXX and so on ..

    LPTID  CCCC                 X1             Y1             X2          
    ---------- ---------------------- ---------------------- ---------------------- ---------------------- 
    A1al0002AN 0                      1                      0                      0                      
    A1al0002Up 3                      1000                   0                      0                      
    A1al0002AO 0                      1                      0                      0                      
    A1al0002AP 0                      1                      0                      0                      
    A1al0002AQ 0                      1                      0                      0                      
    A1al0002AR 0                      1                      0                      0                      
    A1al0002AS 0                      1                      0                      0                      
    A1al0002AT 0                      1                      0                      0                      
    A1al0002AU 0                      1                      0                      0                      
    A1al0002AV 0                      1                      0                      0                      
    A1al0002AW 0                      1                      0                      0                      
    In this scenario i am inserting around 16 000 records in each thread, like that i have 16 threads running in parallel. Block size is 8192

    I am even providing all the parameters info -
    SQL> show parameter
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    O7_DICTIONARY_ACCESSIBILITY          boolean     FALSE
    _in_memory_undo                      boolean     FALSE
    active_instance_count                integer
    aq_tm_processes                      integer     0
    archive_lag_target                   integer     0
    asm_diskgroups                       string
    asm_diskstring                       string
    asm_power_limit                      integer     1
    audit_file_dest                      string      /disk1/apps/oracle/u01/app/ora
                                                     cle/product/10.2.0/db_1/admin/
                                                     testdb/adump
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    audit_sys_operations                 boolean     FALSE
    audit_syslog_level                   string
    audit_trail                          string      NONE
    background_core_dump                 string      partial
    background_dump_dest                 string      /disk1/apps/oracle/u01/app/ora
                                                     cle/product/10.2.0/db_1/admin/
                                                     testdb/bdump
    backup_tape_io_slaves                boolean     FALSE
    bitmap_merge_area_size               integer     1048576
    blank_trimming                       boolean     FALSE
    buffer_pool_keep                     string
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    buffer_pool_recycle                  string
    circuits                             integer
    cluster_database                     boolean     FALSE
    cluster_database_instances           integer     1
    cluster_interconnects                string
    commit_point_strength                integer     1
    commit_write                         string
    compatible                           string      10.2.0.3.0
    control_file_record_keep_time        integer     7
    control_files                        string      +DGROUP1/testdb/controlfile/cu
                                                     rrent.261.681812861, +DGROUP1/
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
                                                     testdb/controlfile/current.260
                                                     .681812861
    core_dump_dest                       string      /disk1/apps/oracle/u01/app/ora
                                                     cle/product/10.2.0/db_1/admin/
                                                     testdb/cdump
    cpu_count                            integer     24
    create_bitmap_area_size              integer     8388608
    create_stored_outlines               string
    cursor_sharing                       string      EXACT
    cursor_space_for_time                boolean     FALSE
    db_16k_cache_size                    big integer 0
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_2k_cache_size                     big integer 0
    db_32k_cache_size                    big integer 0
    db_4k_cache_size                     big integer 0
    db_8k_cache_size                     big integer 0
    db_block_buffers                     integer     0
    db_block_checking                    string      FALSE
    db_block_checksum                    string      TRUE
    db_block_size                        integer     8192
    db_cache_advice                      string      ON
    db_cache_size                        big integer 0
    db_create_file_dest                  string      +DGROUP1
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_create_online_log_dest_1          string
    db_create_online_log_dest_2          string
    db_create_online_log_dest_3          string
    db_create_online_log_dest_4          string
    db_create_online_log_dest_5          string
    db_domain                            string      abc.com
    db_file_multiblock_read_count        integer     16
    db_file_name_convert                 string
    db_files                             integer     200
    db_flashback_retention_target        integer     1440
    db_keep_cache_size                   big integer 0
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    db_name                              string      testdb
    db_recovery_file_dest                string      +DGROUP1
    db_recovery_file_dest_size           big integer 2G
    db_recycle_cache_size                big integer 0
    db_unique_name                       string      testdb
    db_writer_processes                  integer     6
    dbwr_io_slaves                       integer     0
    ddl_wait_for_locks                   boolean     FALSE
    dg_broker_config_file1               string      /disk1/apps/oracle/u01/app/ora
                                                     cle/product/10.2.0/db_1/dbs/dr
                                                     1testdb.dat
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    dg_broker_config_file2               string      /disk1/apps/oracle/u01/app/ora
                                                     cle/product/10.2.0/db_1/dbs/dr
                                                     2testdb.dat
    dg_broker_start                      boolean     FALSE
    disk_asynch_io                       boolean     TRUE
    dispatchers                          string      (protocol=TCP)
    distributed_lock_timeout             integer     60
    dml_locks                            integer     748
    drs_start                            boolean     FALSE
    event                                string
    fal_client                           string
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    fal_server                           string
    fast_start_io_target                 integer     0
    fast_start_mttr_target               integer     0
    fast_start_parallel_rollback         string      LOW
    file_mapping                         boolean     FALSE
    fileio_network_adapters              string
    filesystemio_options                 string      asynch
    fixed_date                           string
    gc_files_to_locks                    string
    gcs_server_processes                 integer     0
    global_context_pool_size             string
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    global_names                         boolean     FALSE
    hash_area_size                       integer     131072
    hi_shared_memory_address             integer     0
    hs_autoregister                      boolean     TRUE
    ifile                                file
    instance_groups                      string
    instance_name                        string      testdb
    instance_number                      integer     0
    instance_type                        string      RDBMS
    java_max_sessionspace_size           integer     0
    java_pool_size                       big integer 0
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    java_soft_sessionspace_limit         integer     0
    job_queue_processes                  integer     10
    large_pool_size                      big integer 0
    ldap_directory_access                string      NONE
    license_max_sessions                 integer     0
    license_max_users                    integer     0
    license_sessions_warning             integer     0
    local_listener                       string
    lock_name_space                      string
    lock_sga                             boolean     FALSE
    log_archive_config                   string
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    log_archive_dest                     string
    log_archive_dest_1                   string
    log_archive_dest_10                  string
    log_archive_dest_2                   string
    log_archive_dest_3                   string
    log_archive_dest_4                   string
    log_archive_dest_5                   string
    log_archive_dest_6                   string
    log_archive_dest_7                   string
    log_archive_dest_8                   string
    log_archive_dest_9                   string
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    log_archive_dest_state_1             string      enable
    log_archive_dest_state_10            string      enable
    log_archive_dest_state_2             string      enable
    log_archive_dest_state_3             string      enable
    log_archive_dest_state_4             string      enable
    log_archive_dest_state_5             string      enable
    log_archive_dest_state_6             string      enable
    log_archive_dest_state_7             string      enable
    log_archive_dest_state_8             string      enable
    log_archive_dest_state_9             string      enable
    log_archive_duplex_dest              string
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    log_archive_format                   string      %t_%s_%r.dbf
    log_archive_local_first              boolean     TRUE
    log_archive_max_processes            integer     2
    log_archive_min_succeed_dest         integer     1
    log_archive_start                    boolean     FALSE
    log_archive_trace                    integer     0
    log_buffer                           integer     6291456
    log_checkpoint_interval              integer     0
    log_checkpoint_timeout               integer     1800
    log_checkpoints_to_alert             boolean     FALSE
    log_file_name_convert                string
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    logmnr_max_persistent_sessions       integer     1
    max_commit_propagation_delay         integer     0
    max_dispatchers                      integer
    max_dump_file_size                   string      UNLIMITED
    max_enabled_roles                    integer     150
    max_shared_servers                   integer
    nls_calendar                         string
    nls_comp                             string
    nls_currency                         string
    nls_date_format                      string
    nls_date_language                    string
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    nls_dual_currency                    string
    nls_iso_currency                     string
    nls_language                         string      AMERICAN
    nls_length_semantics                 string      BYTE
    nls_nchar_conv_excp                  string      FALSE
    nls_numeric_characters               string
    nls_sort                             string
    nls_territory                        string      AMERICA
    nls_time_format                      string
    nls_time_tz_format                   string
    nls_timestamp_format                 string
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    nls_timestamp_tz_format              string
    object_cache_max_size_percent        integer     10
    object_cache_optimal_size            integer     102400
    olap_page_pool_size                  big integer 0
    open_cursors                         integer     300
    open_links                           integer     4
    open_links_per_instance              integer     4
    optimizer_dynamic_sampling           integer     2
    optimizer_features_enable            string      10.2.0.3
    optimizer_index_caching              integer     0
    optimizer_index_cost_adj             integer     100
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    optimizer_mode                       string      ALL_ROWS
    optimizer_secure_view_merging        boolean     TRUE
    os_authent_prefix                    string      ops$
    os_roles                             boolean     FALSE
    parallel_adaptive_multi_user         boolean     TRUE
    parallel_automatic_tuning            boolean     FALSE
    parallel_execution_message_size      integer     2152
    parallel_instance_group              string
    parallel_max_servers                 integer     135
    parallel_min_percent                 integer     0
    parallel_min_servers                 integer     0
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    parallel_server                      boolean     FALSE
    parallel_server_instances            integer     1
    parallel_threads_per_cpu             integer     2
    pga_aggregate_target                 big integer 4905M
    plsql_ccflags                        string
    plsql_code_type                      string      INTERPRETED
    plsql_compiler_flags                 string      INTERPRETED, NON_DEBUG
    plsql_debug                          boolean     FALSE
    plsql_native_library_dir             string
    plsql_native_library_subdir_count    integer     0
    plsql_optimize_level                 integer     2
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    plsql_v2_compatibility               boolean     FALSE
    plsql_warnings                       string      DISABLE:ALL
    pre_page_sga                         boolean     FALSE
    processes                            integer     150
    query_rewrite_enabled                string      TRUE
    query_rewrite_integrity              string      enforced
    rdbms_server_dn                      string
    read_only_open_delayed               boolean     FALSE
    recovery_parallelism                 integer     0
    recyclebin                           string      OFF
    remote_archive_enable                string      true
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    remote_dependencies_mode             string      TIMESTAMP
    remote_listener                      string
    remote_login_passwordfile            string      EXCLUSIVE
    remote_os_authent                    boolean     FALSE
    remote_os_roles                      boolean     FALSE
    replication_dependency_tracking      boolean     TRUE
    resource_limit                       boolean     FALSE
    resource_manager_plan                string
    resumable_timeout                    integer     0
    rollback_segments                    string
    serial_reuse                         string      disable
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    service_names                        string      testdb.abc.com
    session_cached_cursors               integer     20
    session_max_open_files               integer     10
    sessions                             integer     170
    sga_max_size                         big integer 10G
    sga_target                           big integer 800M
    shadow_core_dump                     string      partial
    shared_memory_address                integer     0
    shared_pool_reserved_size            big integer 14260633
    shared_pool_size                     big integer 0
    shared_server_sessions               integer
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    shared_servers                       integer     0
    skip_unusable_indexes                boolean     TRUE
    smtp_out_server                      string
    sort_area_retained_size              integer     0
    sort_area_size                       integer     65536
    spfile                               string      /disk1/apps/oracle/u01/app/ora
                                                     cle/product/10.2.0/db_1/dbs/sp
                                                     filetestdb.ora
    sql92_security                       boolean     FALSE
    sql_trace                            boolean     FALSE
    sql_version                          string      NATIVE
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    sqltune_category                     string      DEFAULT
    standby_archive_dest                 string      ?/dbs/arch
    standby_file_management              string      MANUAL
    star_transformation_enabled          string      FALSE
    statistics_level                     string      TYPICAL
    streams_pool_size                    big integer 0
    tape_asynch_io                       boolean     TRUE
    thread                               integer     0
    timed_os_statistics                  integer     0
    timed_statistics                     boolean     TRUE
    trace_enabled                        boolean     TRUE
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    tracefile_identifier                 string
    transactions                         integer     187
    transactions_per_rollback_segment    integer     5
    undo_management                      string      AUTO
    undo_retention                       integer     900
    undo_tablespace                      string      UNDOTBS1
    use_indirect_data_buffers            boolean     FALSE
    user_dump_dest                       string      /disk1/apps/oracle/u01/app/ora
                                                     cle/product/10.2.0/db_1/admin/
                                                     testdb/udump
    utl_file_dir                         string
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    workarea_size_policy                 string      AUTO
    Regards
    Satish
  • 48. Re: Oracle 10g performance degrades while concurrent inserts into a table
    700680 Newbie
    Currently Being Moderated
    Hi Hemant,

    Upon every insertion of each row in table A, Insert After Trigger gets fired and we have logic to check if the corresponding information is already available in table YYY via SQL QUERY " SELECT X1 ,X2 FROM YYYY WHERE LPTID = :B2 AND CCCC = :B1 " if we find this row then we update it with
    sql query"UPDATE YYYY SET X1 = X1 +1, Y1 = :B3 WHERE LPTID = :B2 AND CCC = :B1 "
    else we will insert a new row "INSERT INTO YYYY VALUES (:B2 ,:B1 ,'0','0','0') "

    Let me know if any more clarifications needed.

    Regards
    Satish
  • 49. Re: Oracle 10g performance degrades while concurrent inserts into a table
    Jonathan Lewis Oracle ACE Director
    Currently Being Moderated
    Satish Kumar Ballepu wrote:
    Hi Jonathan,

    Here the table structure and index definition
    CREATE TABLE YYYY 
    (
    LPTID  VARCHAR2(10) NOT NULL , 
    CCCC   NUMBER NOT NULL , 
    X1         NUMBER NOT NULL , 
    X2     NUMBER NOT NULL , 
    Y1         NUMBER NOT NULL , 
    )
    
    CREATE INDEX YYYY_IDX  ON YYYY (LPTID, CCC);
    Yes i have even tried by having parititioning of this table into 4 partitions, These are on different table space, but still on the same HDD.
    The spreading across multiple tablespaces won't have any impact.

    Critically, when you partitioned the table, did you also create the index as a locally partitioned index ?

    It's a little difficult to decide the best partitioning strategy to try given the description of the data - but when you tried partitioning into 4 partitions did you notice whether of not you ended up with an even amount of data in each partition - if you didn't, then hash partitioning is inherently unlikely to work.

    Nevertheless, since you have 16 processes, you could try partitioning into 16 pieces in the hope that you reduce the scale of the problem. I think all your accesses are on equality, so you won't run into any big problems with the number of pieces. (Always use a power of 2 for the number of partitions if you increase the number of processes).
    CREATE TABLE YYYY 
    (
         LPTID  VARCHAR2(10) NOT NULL , 
         CCC    NUMBER NOT NULL , 
         X1         NUMBER NOT NULL , 
         X2     NUMBER NOT NULL , 
         Y1         NUMBER NOT NULL 
    )
    partition by hash (lptid) partitions 16
    ;
    
    CREATE INDEX YYYY_IDX  ON YYYY (LPTID, CCC) +*local*+;
    If you do try this, and it still doesn't work, it would be a good idea to generate stats on the table and produce a list of num_rows, blocks for each partition to check whether you have a very uneven distribution of data.

    In passing, and it's not relevant to this problem, you have a very large sga_max_size (10g) compared to the sga_max_size (800MB). It's more common to have the two parameters running at similar sizes.

    Regards
    Jonathan Lewis
    http://jonathanlewis.wordpress.com
    http://www.jlcomp.demon.co.uk


    "Science is more than a body of knowledge; it is a way of thinking"
    Carl Sagan
  • 50. Re: Oracle 10g performance degrades while concurrent inserts into a table
    sybrand_b Guru
    Currently Being Moderated
    You are aware of the MERGE statement, which does exactly (in 1 statement) what you describe (and more efficiently)?

    ---------------
    Sybrand Bakker
    Senior Oracle DBA
  • 51. Re: Oracle 10g performance degrades while concurrent inserts into a table
    Jonathan Lewis Oracle ACE Director
    Currently Being Moderated
    Satish Kumar Ballepu wrote:
    if we find this row then we update it with
    sql query"UPDATE YYYY SET X1 = X1 +1, Y1 = :B3 WHERE LPTID = :B2 AND CCC = :B1 "
    In your earlier listing of a tkprof file, you had a statement like this that updated XXX - have you tried to camouflage table and column names so much that you've managed to conceal this critical piece of information ?

    I note in your listing of sample data you had one row where X1 had reached 1,000. According to the above that means that ANY other process that tries to read that block is going to use 1,000 undo records to make the block read-consistent. And that's why you've got to be able to spread the data over more blocks and, if possible, find a way of associating different values for (say) LPTID with different processes.

    The 16-way partitioning may help - and there's no reason why you shouldn't take this up to far more partitions. Completely independently anything you do to minimise the number of rows per block (to minimise the risk of several rows from different processes getting large values of X1 is a good idea) - Even to the extent of considering one row per block so that two processes NEVER need to look at each other's blocks.

    (Based on the observations above, the problem is probably more in the table than the index - but I think you'll still have a quite a bit of interference on the index leaf blocks and ultimately you may end up moving the index into the smallest possible block size to minimise the number of rows per leaf block. You might also do that with the table to avoid wasting space if you have to drop to one row per block and there are a lot of rows).

    Regards
    Jonathan Lewis
    http://jonathanlewis.wordpress.com
    http://www.jlcomp.demon.co.uk


    "Science is more than a body of knowledge; it is a way of thinking"
    Carl Sagan
  • 52. Re: Oracle 10g performance degrades while concurrent inserts into a table
    Jonathan Lewis Oracle ACE Director
    Currently Being Moderated
    sybrand_b wrote:
    You are aware of the MERGE statement, which does exactly (in 1 statement) what you describe (and more efficiently)?
    It may be possible to rewrite the log of insert or update in the trigger as a merge statement - I doubt if it would solve the concurrency problem.

    Regards
    Jonathan Lewis
    http://jonathanlewis.wordpress.com
    http://www.jlcomp.demon.co.uk


    "Science is more than a body of knowledge; it is a way of thinking"
    Carl Sagan
  • 53. Re: Oracle 10g performance degrades while concurrent inserts into a table
    Randolf Geist Oracle ACE Director
    Currently Being Moderated
    Satish Kumar Ballepu wrote:
    Upon every insertion of each row in table A, Insert After Trigger gets fired and we have logic to check if the corresponding information is already available in table YYY via SQL QUERY " SELECT X1 ,X2 FROM YYYY WHERE LPTID = :B2 AND CCCC = :B1 " if we find this row then we update it with
    sql query"UPDATE YYYY SET X1 = X1 +1, Y1 = :B3 WHERE LPTID = :B2 AND CCC = :B1 "
    else we will insert a new row "INSERT INTO YYYY VALUES (:B2 ,:B1 ,'0','0','0') "
    Satish,

    at this point it might be worthwhile to elaborate a bit what the purpose of the update on YYYY is and how this information is used.

    Depending on what you do with the information there might be potential damage limitations available to you:

    - Don't use a trigger but use a materialized view instead to generate this "derived" information. The timing of when and how you're going to refresh such a materialized view depends on your requirements

    - In order to relieve the contention you could try to split the summary information about LPTID/CCC across several rows, similar to the approach demonstrated by Alex Fatkulin here, requiring you to sum up the information when querying it:

    http://afatkulin.blogspot.com/2009/01/maintaining-summaries-in-highly.html

    Of course none of these approaches might be applicable, but at least worth a thought.

    Regards,
    Randolf

    Oracle related stuff blog:
    http://oracle-randolf.blogspot.com/

    SQLTools++ for Oracle (Open source Oracle GUI for Windows):
    http://www.sqltools-plusplus.org:7676/
    http://sourceforge.net/projects/sqlt-pp/
1 2 3 4 Previous Next

Legend

  • Correct Answers - 10 points
  • Helpful Answers - 5 points