Bookmarks

Yahoo Gmail Google Facebook Delicious Twitter Reddit Stumpleupon Myspace Digg

Search queries

192.168.1.41:8000, Www.xxxcon., %s wwwxxxcon, %s wwwxxxcon, www.xxxcon, xxxxdup, bitlord outgoing port settings, ckowwwxxx, 192.168.1.41:8000/nor-482.html, php.ini "Unable to initialize module"

Links

XODOX
Impressum

#1: PDO: Cache von Prepared Statements

Posted on 2008-01-29 18:58:13 by steffen bruentjen

Hallo,

Prepared Statements haben neben dem Schutz vor SQL-Injections noch den
Vorteil, dass ihre Optimierung nur einmalig vom Server durchgeführt
werden muss. Nun ist es so, dass ein solches optimiertes
Statement-Objekt im Allgemeinen in einer Methode erzeugt und dort so
oft wie eben nötig ausgeführt wird. Wenn die Methode verlassen und zu
einem späteren Zeitpunkt nochmal aufgerufen wird, muss das
Statement-Objekt neu erzeugt werden. Es stellt sich nun die Frage, ob
DBMSs optimierte Statements intern cachen und bei erneutem Aufruf eine
gecachte Version des bereits optimierten Statements zurückliefern.
Dies wäre sehr effizient, da die Optimierung unabhängig vom jeweiligen
Client laufen würde. Das scheint allerdings (zumindest bei MySQL) so
nicht zu sein, denn im MySQL-Handbuch steht über die C-API:

"The server parses the statement and sends the okay status back to the
client by assigning a statement ID. [...] All syntax and semantics of
the statement are checked by the server during this call.
The client uses this statement ID for the further operations, so that
the server can identify the statement from among its pool of
statements."

Unterschiedliche Clients erhalten also stets unterschiedliche
Statement IDs (was gleichbedeutend damit ist, dass nur clientbezogen
optimiert wird).

Warum wird das so gehandhabt?

Nun könnte die PDO-Erweiterung noch die Zuordnung von einer SQL-Query
zur Statement ID selbst verwalten. Im Quelltext von PDO hab ich dazu
nichts finden können. Eine eigene Klasse könnte etwa so aussehen:

class PDOWhatever extends PDO
{
private $stmtCache = array();

function prepare($sql, $options = array())
{
if (!isset($this->stmtCache[$sql]) ||
!is_object($this->stmtCache[$sql]))
{
$this->stmtCache[$sql] = parent::prepare($sql, $options);
}
return $this->stmtCache[$sql];
}

function clearStmtCache($sql)
{
if (isset($this->stmtCache[$sql]))
{
unset($this->stmtCache[$sql]);
}
}
}

Diese Unterklasse würde optimierte Statement-Objekte automatisch
zwischenspeichern und diese bei erneuter Anfrage (genauer: bei jeder
Anfrage mit identischem SQL-String) zurückliefern. clearStmtCache()
kann z.B. nötig sein, wenn sich Optionen ändern. Der Cache bleibt
allerdings natürlich client- und laufzeitspezifisch.

Meiner Meinung nach erübrigen sich damit die Vorteile der prepared
Statements; zum einen wegen des fehlenden Query Cache, zum anderen
weil die prepared Statements nicht wiederverwendet werden.

Mit dem angekündigten PHP-eigenen Treiber für MySQL, welcher sowohl
einen Prepared Statement Cache als auch Query Cache auf Client-Seite
unterstützen soll, werden sich diese Probleme wohl selbst erledigt
haben, aber der braucht ja noch ein wenig.

WeiÃč jemand noch etwas darüber?


Schöne GrüÃče, Steffen

--
Das Tastaturlayout für Programmierer:
http://eurkey.steffen.bruentjen.eu

Report this message

#2: Re: PDO: Cache von Prepared Statements

Posted on 2008-01-29 19:30:48 by Christoph Herrmann

steffen bruentjen schrieb:
> function prepare($sql, $options = array())
> {
> if (!isset($this->stmtCache[$sql]) ||
> !is_object($this->stmtCache[$sql]))

Wofür prüfen, ob es sich um ein Objekt handelt?

> Diese Unterklasse würde optimierte Statement-Objekte automatisch
> zwischenspeichern und diese bei erneuter Anfrage (genauer: bei jeder
> Anfrage mit identischem SQL-String) zurückliefern. clearStmtCache()
> kann z.B. nötig sein, wenn sich Optionen ändern. Der Cache bleibt
> allerdings natürlich client- und laufzeitspezifisch.
>
> Meiner Meinung nach erübrigen sich damit die Vorteile der prepared
> Statements; zum einen wegen des fehlenden Query Cache, zum anderen
> weil die prepared Statements nicht wiederverwendet werden.

Solange das Objekt existiert werden diese wiederverwendet. AuÃčerdem ist
das automatische Maskieren für viele der gröÃčere Vorteil und sollte
nicht auÃčer acht gelassen werden. Ein Cache wäre vielleicht sinnvoll,
aber dann über ein Seitenaufruf hinweg eher. Da stellt sich nur die
Frage, ob sich der benötigte Platz zum Speichern der optimierten
Statements lohnt im Gegenzug zur gewonnenen Performance.

--
Mit freundlichen GrüÃčen,
Christoph Herrmann

http://dragonprojects.de/

Report this message

#3: Re: PDO: Cache von Prepared Statements

Posted on 2008-01-29 20:20:31 by Axel Schwenke

steffen bruentjen wrote:
>=20
> Prepared Statements haben neben dem Schutz vor SQL-Injections noch den
> Vorteil, dass ihre Optimierung nur einmalig vom Server durchgef=FChrt
> werden muss. Nun ist es so, dass ein solches optimiertes
> Statement-Objekt im Allgemeinen in einer Methode erzeugt und dort so
> oft wie eben n=F6tig ausgef=FChrt wird. Wenn die Methode verlassen und =
zu
> einem sp=E4teren Zeitpunkt nochmal aufgerufen wird, muss das
> Statement-Objekt neu erzeugt werden. Es stellt sich nun die Frage, ob
> DBMSs optimierte Statements intern cachen und bei erneutem Aufruf eine
> gecachte Version des bereits optimierten Statements zur=FCckliefern.
> Dies w=E4re sehr effizient, da die Optimierung unabh=E4ngig vom jeweili=
gen
> Client laufen w=FCrde. Das scheint allerdings (zumindest bei MySQL) so
> nicht zu sein, denn im MySQL-Handbuch steht =FCber die C-API:
>=20
> "The server parses the statement and sends the okay status back to the
> client by assigning a statement ID. [...] All syntax and semantics of
> the statement are checked by the server during this call.
> The client uses this statement ID for the further operations, so that
> the server can identify the statement from among its pool of
> statements."
>=20
> Unterschiedliche Clients erhalten also stets unterschiedliche
> Statement IDs (was gleichbedeutend damit ist, dass nur clientbezogen
> optimiert wird).
>=20
> Warum wird das so gehandhabt?

Weil MySQL im Gegensatz zu anderen DBMS den Ausf=FChrungsplan f=FCr das
Statement nicht in der Prepare- sondern in der Execute-Phase bestimmt.
Das vermindert den Wert eines Caches f=FCr das pr=E4parierte Statement
erheblich, hat aber den Vorteil, da=DF der Optimizer ein paar M=F6glichke=
iten
mehr hat.

> Nun k=F6nnte die PDO-Erweiterung noch die Zuordnung von einer SQL-Query=

> zur Statement ID selbst verwalten.
=2E..

Ich wei=DF von zumindest einem (nicht =F6ffentlichen) Projekt, wo ein Cac=
he
dieser Art implementiert wurde; pro Connection ein Pool von prepared
Statements Handles, die bei Bedarf wieder verwendet wurden. Der Gewinn du=
rch
einen solchen Cache ist eher bescheiden. Caching auf Resultat-Ebene (a'la=

Query-Cache) bringt wesentlich mehr.


XL
--=20
In der klassischen Kryptographie verschl=FCsselt Alice Nachrichten an Bob=
um
sie vor Carol zu sch=FCtzen. Bei DRM sind Bob und Carol die gleiche Perso=
n.

Report this message

#4: Re: PDO: Cache von Prepared Statements

Posted on 2008-01-29 20:33:58 by steffen bruentjen

Christoph Herrmann wrote:
>steffen bruentjen schrieb:
>> function prepare($sql, $options = array())
>> {
>> if (!isset($this->stmtCache[$sql]) ||
>> !is_object($this->stmtCache[$sql]))
>
>Wofür prüfen, ob es sich um ein Objekt handelt?

Wenn die Datenbank aus irgendeinem Grund die Anfrage nicht verarbeiten
kann, wird FALSE zurückgeliefert. Das kann, wenn sich beispielsweise
das Schema ändert, bei der nächsten, gleichen Anfrage anders sein.

Man könnte die optimierten Statements auch manuell clientseitig
speichern [zum Beispiel in einer Datenbank :-)] und diese für alle
Zugriffe gleichermaÃčen verwenden.

>> Diese Unterklasse würde optimierte Statement-Objekte automatisch
>> zwischenspeichern und diese bei erneuter Anfrage (genauer: bei jeder
>> Anfrage mit identischem SQL-String) zurückliefern. clearStmtCache()
>> kann z.B. nötig sein, wenn sich Optionen ändern. Der Cache bleibt
>> allerdings natürlich client- und laufzeitspezifisch.
>>
>> Meiner Meinung nach erübrigen sich damit die Vorteile der prepared
>> Statements; zum einen wegen des fehlenden Query Cache, zum anderen
>> weil die prepared Statements nicht wiederverwendet werden.
>
>Solange das Objekt existiert werden diese wiederverwendet. AuÃčerdem ist
>das automatische Maskieren für viele der gröÃčere Vorteil und sollte
>nicht auÃčer acht gelassen werden. Ein Cache wäre vielleicht sinnvoll,
>aber dann über ein Seitenaufruf hinweg eher. Da stellt sich nur die
>Frage, ob sich der benötigte Platz zum Speichern der optimierten
>Statements lohnt im Gegenzug zur gewonnenen Performance.

Prepared Statements werden so häufig durch die mit ihnen einhergehende
Performance-Verbesserung motiviert. Ich konnte das vor allem wegen des
Wegfalls des Query Cache nicht nachvollziehen und suche deshalb nach
Hinweisen dazu.

Schöne GrüÃče, Steffen

--
Das Tastaturlayout für Programmierer:
http://eurkey.steffen.bruentjen.eu

Report this message

#5: Re: PDO: Cache von Prepared Statements

Posted on 2008-01-29 20:47:27 by Christoph Herrmann

steffen bruentjen schrieb:
> Wenn die Datenbank aus irgendeinem Grund die Anfrage nicht verarbeiten
> kann, wird FALSE zurückgeliefert. Das kann, wenn sich beispielsweise
> das Schema ändert, bei der nächsten, gleichen Anfrage anders sein.

Hätte jetzt eher in der Methode abgefangen, sodass immer nur Statement
Objekte in der Liste stehen hast:

function prepare($sql, $options = array())
{
if (!isset($this->stmtCache[$sql]))
{
if($stmt = parent::prepare($sql, $options))
{
$this->stmtCache[$sql] = $stmt;
} else
{
return false;
}
}
return $this->stmtCache[$sql];
}

Aber ist sicherlich Geschmackssache. :)

> Prepared Statements werden so häufig durch die mit ihnen einhergehende
> Performance-Verbesserung motiviert. Ich konnte das vor allem wegen des
> Wegfalls des Query Cache nicht nachvollziehen und suche deshalb nach
> Hinweisen dazu.

Haben Sie ja auch so, vor allem wenn man innerhalb einer Methode oder
Allgemein mit einem Statement mehrere hunderte oder tausende
Ausführungen macht.

Aber hast natürlich Recht, das Ganze auch über die Lebensdauer hinweg zu
cachen hätte weitere Performancevorteile. Aber halt auch Nachteile wegen
Platzbedarf, deswegen würde ich es nicht generell nutzen, sondern nur
für Statements, die sehr oft (bei jedem Aufruf) benötigt werden.

--
Mit freundlichen GrüÃčen,
Christoph Herrmann

http://dragonprojects.de/

Report this message

#6: Re: PDO: Cache von Prepared Statements

Posted on 2008-01-29 20:51:53 by steffen bruentjen

Axel Schwenke wrote:
>steffen bruentjen wrote:
>
>> Nun könnte die PDO-Erweiterung noch die Zuordnung von einer SQL-Query
>> zur Statement ID selbst verwalten.
>...
>
>Ich weiÃč von zumindest einem (nicht öffentlichen) Projekt, wo ein Cache
>dieser Art implementiert wurde; pro Connection ein Pool von prepared
>Statements Handles, die bei Bedarf wieder verwendet wurden. Der Gewinn durch
>einen solchen Cache ist eher bescheiden. Caching auf Resultat-Ebene (a'la
>Query-Cache) bringt wesentlich mehr.

Deshalb bin ich so verwundert. 'Prepared Statements ohne Cache' vs.
'Query Cache'. Aber gut, wenn das nur bei MySQL der Fall ist (und
selbst dort anscheinend bald behoben sein wird), soll das nicht weiter
stören.

Danke für die Antwort & schöne GrüÃče, Steffen

--
Das Tastaturlayout für Programmierer:
http://eurkey.steffen.bruentjen.eu

Report this message