PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как мога да получа psycopg2 регистриране на времето за изпълнение на заявка?

Достатъчно лесно да зададете времева марка в началото на изпълнението и да изчислите продължителността в края. Ще ви трябват ваши собствени прости подкласове на LoggingConnection и LoggingCursor. Вижте моя примерен код.

Това се базира на източника на MinTimeLoggingConnection, който можете да намерите в psycopg2/extras.py източник.

import time
import psycopg2
import psycopg2.extensions
from psycopg2.extras import LoggingConnection, LoggingCursor
import logging

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

# MyLoggingCursor simply sets self.timestamp at start of each query                                                                 
class MyLoggingCursor(LoggingCursor):
    def execute(self, query, vars=None):
        self.timestamp = time.time()
        return super(MyLoggingCursor, self).execute(query, vars)

    def callproc(self, procname, vars=None):
        self.timestamp = time.time()
        return super(MyLoggingCursor, self).callproc(procname, vars)

# MyLogging Connection:                                                                                                             
#   a) calls MyLoggingCursor rather than the default                                                                                
#   b) adds resulting execution (+ transport) time via filter()                                                                     
class MyLoggingConnection(LoggingConnection):
    def filter(self, msg, curs):
        return msg + "   %d ms" % int((time.time() - curs.timestamp) * 1000)

    def cursor(self, *args, **kwargs):
        kwargs.setdefault('cursor_factory', MyLoggingCursor)
        return LoggingConnection.cursor(self, *args, **kwargs)

db_settings = {
    ....
}

query_txt = "[query_text_from file]"

conn = psycopg2.connect(connection_factory=MyLoggingConnection, **db_settings)
conn.initialize(logger)

cur = conn.cursor()
cur.execute(query_text)

и ще получите:

DEBUG: __main__:[query]     3 ms

във вашия filter() можете да промените форматирането или да изберете да не се показва, ако е по-малко от някаква стойност.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Намерете редове, където текстовият масив съдържа стойност, подобна на въведената

  2. Защо postgres не използва индекса в моята заявка

  3. Проучване на забавянето на PostGIS (издание 2019 г.)

  4. Как да сравните производителността на PostgreSQL с помощта на Sysbench

  5. Върнете само числовите стойности от колона на PostgreSQL база данни