PostgreSQL-Query in eine MicrosoftSQL-Query konvertieren - chatGPT hilft nur bedingt.

Zrebna

Bekanntes Mitglied
Hi!

Folgende PostgreSQL-Query ist als Ausgangspunkt gegeben:

SQL:
SELECT pid, usename, application_name, client_addr, backend_start, state, wait_event, pg_blocking_pids(pid), datid, query
FROM pg_stat_activity;

Gem. chatGPT würde die Query unter Verwendung von MicrosoftSQL folgendermaßen aussehen:

SQL:
SELECT
    es.session_id AS pid,
    es.login_name AS usename,
    es.program_name AS application_name,
    c.client_net_address AS client_addr,
    er.start_time AS backend_start,
    er.status AS state,
    er.wait_type AS wait_event,
    COALESCE(er.blocking_session_id, 0) AS pg_blocking_pids,
    DB_NAME(er.database_id) AS datname,
    t.text AS query
FROM sys.dm_exec_sessions AS es
JOIN sys.dm_exec_requests AS er ON es.session_id = er.session_id
JOIN sys.dm_exec_connections AS c ON es.session_id = c.session_id
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS t;

Aber leider matchen die erhaltenen Values nicht überall.
Z.b. holt sich obige Abfrage nur die Session-IDs, statt die benötigten Prozess-IDs.

Kurzum, evtl. hat Jemand mit diesen 2 DBMS Erfahrung und kann mir aushelfen, ohne dass ich Ewigkeiten googlen muss, was seitens PostgreSQL äquivalent bei MSQL ist.

Über Hilfe bin ich in jedem Fall dankbar.

Lg,
Zrebna
 
Die Frage ist, was du ganz genau brauchst. Ist die 1:1 Übersetzung wirklich das, was du willst?

Mein Ansatz bei sowas ist immer:
  • Was ist die genaue Anforderung?
  • wie kann ich diese am Besten mit der Datenbank umsetzen?

Diese Fragestellung drängt sich mir auch direkt auf, da du ja irgendwelche Daten bereits hast aber Dir irgendwas nicht passt bzw. Dir noch etwas fehlt.

Und wenn du nach den konkreten Anforderungen suchst, dann wirst du auch bestimmt sehr viele Treffer erhalten mit Details.
 
Hast du dir schon die Dokumentation zu den benannten Tabellen angesehen? Da sind alle Spalten aufgelistet die es gibt, unter anderem auch sowas wie host_process_id.

Fuer eine "blocking_host_process_id" musst du wahrscheinlich nochmal ein JOIN machen von sys.dem_exec_requests auf sys.dm_exec_sessions, denke ich, muesste ich mir genauer ansehen.

Ich habe mittlerweile mal mehrere Verbindungen gestartet, wo sich Verbindungen blockieren.
Provoziert habe ich das mit Hilfe der Infos in diesem alten Thread:

Es scheint mir, dass die analogen blocking_Pids zu PostgresSQL eher so abgefragt werden können:
SQL:
SELECT
    es.session_id AS pid,
    COALESCE(er.blocking_session_id, 0) AS pg_blocking_pids,
    DB_NAME(er.database_id) AS datname,
    t.text AS query
FROM sys.dm_exec_sessions AS es
JOIN sys.dm_exec_requests AS er ON es.session_id = er.session_id;

Komisch ist aber, dass der Datentyp für pg_blocking_pids ein Varchar ist, d.h. es kann beliebige viele PIDs enthalten.
Dagegen ist der Datentyp des analogen Attributs/Spalte 'blocking_session_id' bei MSQL ein smallint.

Kann eine Verbindung nicht nur immer von einer einzigen Verbindung geblockt werden?
Z.b: Connection 1 könnte einen Lock haben und Connection 2 und 3 blocken.
Sowwohl Connection 2 als auch 3 hätten dann in der Spalte 'blocking_session_id' lediglich einen Zahlenwert, und zwar die PID von connection 1.

Kann das überhaupt möglich sein, dass da mehrere Zahlenwerte auftauchen können?

Ansonsten, Danke für den Link zur Doku - ich werde da auf jeden Fall auf Suche gehen.
 

Zurück
Oben