Jon-G blogs for Net-Entwicklung.de

24.06.2009

Multiple Inserts in Oracle (example using PHP)

Filed under: Coding, Databases — Schlagwörter: , , — Jonathan Gilbert @ 00:17

Everybody knows how to make multiple inserts into MySQL:

INSERT INTO [table_name] ([col_1], [col_2])
  VALUES
    ([val_1_1], [val_1_2]),
    ([val_2_1], [val_2_2]),
    ([val_3_1], [val_3_2])

That´s easy! But multiple inserts to an Oracle DB don´t work like that… here are two ways of doing the same job with Oracle:

insert all
  into [table_name] ([col1], [col2]) values ([val1_1], [val1_2])
  into [table_name] ([col1], [col2]) values ([val2_1], [val2_2])
  into [table_name] ([col1], [col2]) values ([val3_1], [val3_2])
  select 1 from dual

or alternatively

insert into [table_name] ([col1], [col2])
  select [val1_1], [val1_2] from dual
  union all
    select [val2_1], [val2_2] from dual
  union all
    select [val3_1], [val3_2] from dual

This is useful if you need to insert a lot of rows into a table – which usually occurs in a job like data import from other sources rather than as a result of user interaction. Running a PHP script for example to insert 50.000 rows into a table would fire 50.000 inserts if you don´t use multiple inserts. This is slow and can also cause you to run into memory problems.

Here is a simple example of how to do this in PHP:

class MyImportTest extends MyDatabaseModel
{
 protected static $_parallelImports = 50;
 protected static $_insertCache = array();

 public static function insertImportDataIntoDb($inputData)
 {
  $added = 0;
  foreach ($inputdata as $inputArray) {
    $added += self::_addCaseToInsertCache($inputArray['col1'], $inputArray['col2']);
    if ($added % self::$_parallelInserts == 0) {
      self::_flushInsertCache();
    }
  }
	if ($added % self::$_parallelInserts != 0) {
    self::_flushInsertCache();
  }
 }

 function addCaseToInsertCache($col1, $col2)
 {
  // maybe do validity checks here and return 0 if an element is not added
  self::$_insertCache[] = array($col1, $col2);
  return 1;
 }

 function flushInsertCache()
 {
  $db = self::getDb();
  $sql = 'INSERT INTO "TABLE_NAME" ("COL1", "COL2")';
  $values = '';
  foreach (self::$_insertCache as $insert) {
            $values .= (empty($values)) ? '' : ' UNION ALL ';
            $values .= 'SELECT ' .
                $insert[0] . ', ' .
                $insert[1] . ', ' .
                $insert[5] . ' FROM DUAL';
        } // if using string values, then don't forget to use quotes!
        $db->query($sql . $values);
        self::$_insertCache = array();
    }
 }
}
Advertisements

21.05.2009

Das Model im Zend Framework

Filed under: Coding — Schlagwörter: , — Jonathan Gilbert @ 21:01

Holger Librenz hat ein netter Artikelzum Thema geschrieben. Den Ansatz, eine eigene Action-Klasse vom Zend_Controller_Action abzuleiten kann ich nur unterstützen. Aber ich halte nichts von der Idee, das Model per Reflection zu ermitteln und instanziieren – Refelection ist nicht performant und demnach für eine Produktionsumgebung nicht geeignet. Die Prüfung, ob die Klasse existiert ist m.E. auch überflüssig und kostet unnötig Performance – wer eine Anwendung baut hat dafür zu sorgen, dass die Klassen vorhanden sind. Ich finde, es gibt nur wenige Fälle, wo eine solche Prüfung stattfinden muss (z.B. in verteilten Systemen).

Im Übrigen vertrete ich auch der Meinung, dass Objekte nicht instanziiert werden müssen – Modelle mit statischen Methoden sind nach Möglichkeit zu bevorzugen – aber das ist ein anderes Thema.

25.04.2009

Zend Framework und Performance

Filed under: Coding — Schlagwörter: , , , — Jonathan Gilbert @ 19:00

Es gibt viele Frameworks für PHP – es gibt einige Gründe, die für ZF sprechen: Es ist gut dokumentiert, gut getestet und es steht nun mal Zend dahinter. Nur Performance ist nicht optimal… Je nach Bedarf kann es sich lohnen, ein eigenes Framework zu entwickeln – es kostet aber viel Zeit und muss auch ständig weiterentwickelt werden (bei StudiVZ hat es sich aber gelohnt – das Phoenix Framework rockt – schöne Grüße nach Berlin!)

Ein erster Schritt ist, den Zend_Loader zu ersetzen – keep it simple! Einfaches autoloading mit str_replace, um die Pfade zu ermitteln reicht aus.

Gut strukturierter, lesbarer, erweiterbarer und dadurch wartbarer Code ist m.E. wichtiger als performanter Code. Performance kann man immer noch verbessern, wo es nötig ist. Oft liegen Performance Probleme anderswo, z.B. bei Datenbankzugriffen – diese bieten oft viel Spielraum für Optimierung. Und mit Caching, lassen sich auch viele DB-Zugriffe insgesamt einsparen.

Hier gibt es ein interessanter Artikel über Performance Bottlenecks.

Mehrere gute Tipps, gibt Till Klampaeckel hier und hier.

The basics

Filed under: Tools — Schlagwörter: , , — Jonathan Gilbert @ 18:00

Um eine neue Entwicklungsumgebung mit PHP, MySQL und co. schnell einzurichten (unter Windows)… man nehme:

Xampp
Eclipse PDT
Subclipse

Und hier noch ein paar nützliche Tools:
Baretail
Putty
Jing Project

Ein paar nützliche Resourcen:
Online Buch zu SVN

Erstelle eine kostenlose Website oder Blog – auf WordPress.com.