oracle
In the databases field, our core competence lies in the area of Oracle products. Our experience encompasses the Oracle versions 7, 8i, 9i, 10g, and 11g - each with its own characteristics: new features, obsolete features, improvements, bugs, differences in the optimizers, etc.

Several years' experience in Oracle projects of all kinds and coming from various areas have enabled us to build a comprehensive know how, define best practices, and apply and refine them in new projects. Apart from the classic principles of data modeling and database implementation, we employ Oracle-specific techniques and constructs, such as:

  • Using PL/SQL. PL/SQL is a powerful procedural extension of an SQL database which has two main advantages: the seamless integration on syntactic and execution level, and the fast context switch from/to SQL (especially in Oracle 9i and later). This is why implementing the program logic in PL/SQL is in many cases more advantageous than doing it outside of the database. However, there are cases - such as number crunching applications - in which an external program, e.g., a C program is the more efficient alternative. The decision regarding the appropriate implementation for a problem should be made on a per-case basis.

  • Employing the utilities provided by Oracle, which cover in many cases the needed functionality - such as Export/Import, Loader, Profiler, Recovery Manager, Enterprise Manager, Data Guard, etc. - as well as using third-party tools - like TOAD, SQL Navigator, and ERwin - which offer additional functionalities and comfortable user interfaces.

  • Taking advantage of the Oracle built-in database object types: packages, types, directories, as well as object-relational constructs, etc. The usage of these constructs should nonetheless be adequate to the problem - most problems can be still solved best by classic relational techniques and standard PL/SQL.

  • Structuring the PL/SQL packages. Packages and abstract data types enable a sort of object-oriented programming with type hierarchies, overloading, information hiding (public and private constants, types, cursors, procedures), etc. We make intensive use of this construct, because it allows structuring and therefore improving applications.

  • Autonomous procedures are helpful in several situations (e.g., in logging and error procedures, in triggers, which must commit locally, etc.)

  • Bulk operations represent a useful compromise between the efficiency of an "Insert-from-Select" statement and the error handling capability of an Insert statement inside a cursor loop. (This advantage becomes relative starting with version 10g.)

  • Performance optimization is an active process during database development in Oracle, which starts with writing SQL statements, continues with analysis and improvement of execution plans, and can lead to using optimizer hints, or even going down to the level of histograms. This requires an in-depth understanding of the Oracle optimizers (CBO/RBO), as well as correct gathering of statistics, and handling of special cases (skewed data, buckets), etc.

  • Using special constructs for data warehouses, such as partitioned tables, materialized views, bitmap indexes, etc.

  • Using the Oracle built-in functionalities for OLAP (Rollup, Cube, analytic functions, etc.)

  • Taking advantage of the Delete Cascade/Set Null options of relations (foreign keys)

  • Enhancing the built-in constraint cascade functionality using triggers and packages (e.g., to Insert Cascade or to Update Cascade)

  • Intensive usage of the data dictionary, for example to generate objects dynamically, in generic functions, etc.

  • . . .