Start · Sprachen · PHP · Referenz · pg_result_memory_size

pg_result_memory_size

Funktion

Gibt die Anzahl der Bytes zurück, die für ein PostgreSQL-Abfrageergebnis im Speicher reserviert sind.

seit PHP 8.1.0 Kategorie: db

Signatur

pg_result_memory_size(PgSql\Result $result): int

Beschreibung

pg_result_memory_size() liefert die Speichergröße in Bytes, die ein PostgreSQL-Ergebnis-Objekt (vom Typ PgSql\Result) intern belegt. Die Funktion ermöglicht es, den Ressourcenverbrauch einzelner Datenbankabfragen zur Laufzeit zu messen und zu überwachen.

Dies ist besonders nützlich bei der Performance-Analyse und beim Debugging: Werden sehr große Ergebnismengen geladen, kann der belegte Speicher schnell in den Megabyte-Bereich wachsen. Mit dieser Funktion lässt sich gezielt erkennen, welche Abfragen unverhältnismäßig viel RAM belegen, und es können Optimierungen wie Paginierung oder LIMIT-Klauseln gezielt eingesetzt werden.

Die zurückgegebene Zahl entspricht dem von der libpq-Bibliothek für dieses Ergebnis reservierten Speicher und kann leicht von der tatsächlichen PHP-Speichernutzung abweichen, da PHP eigene Overhead-Strukturen hinzufügt. Dennoch ist der Wert ein guter Indikator für die Größe des Ergebnisses.

Die Funktion steht erst ab PHP 8.1.0 zur Verfügung und erwartet das neue objektorientierte PgSql\Result-Handle, das seit PHP 8.1 anstelle der älteren Resource-Handles verwendet wird.

Parameter

Name Typ Default Beschreibung
$result Pflicht PgSql\Result Ein PgSql\Result-Objekt, das von Funktionen wie pg_query(), pg_query_params() oder pg_execute() zurückgegeben wurde.

Rückgabewert

Typ
int
Beschreibung
Gibt die Anzahl der Bytes zurück, die für das PostgreSQL-Abfrageergebnis im Speicher reserviert sind. Der Wert ist stets eine nicht-negative Ganzzahl.

Beispiele

Speicherbedarf einer einfachen Abfrage messen

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=geheim');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

$result = pg_query($conn, 'SELECT * FROM benutzer');
if (!$result) {
    die('Abfrage fehlgeschlagen: ' . pg_last_error($conn));
}

$bytes = pg_result_memory_size($result);
echo 'Speicherbedarf des Ergebnisses: ' . $bytes . ' Bytes' . PHP_EOL;
echo 'Das entspricht ca. ' . round($bytes / 1024, 2) . ' KB' . PHP_EOL;

pg_free_result($result);
pg_close($conn);
Speicherbedarf des Ergebnisses: 8312 Bytes Das entspricht ca. 8.12 KB

Speicherbedarf mehrerer Abfragen vergleichen

<?php
$conn = pg_connect('host=localhost dbname=testdb user=postgres password=geheim');
if (!$conn) {
    die('Verbindung fehlgeschlagen');
}

$abfragen = [
    'Alle Benutzer'      => 'SELECT * FROM benutzer',
    'Nur Admins'         => "SELECT * FROM benutzer WHERE rolle = 'admin'",
    'Nur IDs und Namen'  => 'SELECT id, name FROM benutzer',
];

foreach ($abfragen as $bezeichnung => $sql) {
    $result = pg_query($conn, $sql);
    if ($result) {
        $bytes = pg_result_memory_size($result);
        printf("%-25s: %d Bytes\n", $bezeichnung, $bytes);
        pg_free_result($result);
    }
}

pg_close($conn);
Alle Benutzer : 24680 Bytes Nur Admins : 3210 Bytes Nur IDs und Namen : 9870 Bytes

// Wichtig · Fallstricke

Versionshinweis: Diese Funktion ist erst ab PHP 8.1.0 verfügbar. In älteren PHP-Versionen gibt es keine direkte Entsprechung. Wer den Speicherbedarf unter älteren Versionen schätzen möchte, kann sich mit memory_get_usage() vor und nach der Abfrage behelfen.

Genauigkeit: Der zurückgegebene Wert spiegelt den von libpq intern verwalteten Speicher wider. PHP-eigene Strukturen, Zend-Engine-Overhead und Referenz-Zähler sind darin nicht enthalten. Der Wert ist daher als Richtwert zu verstehen.

Speicher freigeben: Nach der Verwendung eines Ergebnisses sollte pg_free_result() aufgerufen werden, um den reservierten Speicher umgehend freizugeben, insbesondere bei großen Ergebnismengen in langlebigen Prozessen.