Python / Python sqlite3: Находим медленные запросы

в 9:25, , рубрики: logging, python, sqlite3, метки: , ,

Python / Python sqlite3: Находим медленные запросы
Привет, коллеги!
При работе с базами данных sqlite передо мной возникла задача поиска медленных запросов и их логгирования.
Спросив всезнающий Google я к сожалению не обнаружил ни одного решения (плохо искал?).
Поэтому я хочу предложить свой вариант протоколирования.
Подсчет времени выполнения запроса мы будем вести на уровне курсора.
Для этого переопределим данный класс добавив в него подсчет времени выполнения запроса.
import sqlite3import time
 class mycursor(sqlite3.Cursor):
    def execute(self, *args, **kwargs):
        timestart = time.clock()
        query = super(mycursor, self).execute(*args, **kwargs)
        idle = time.clock() - timestart
        if idle >= 0.1:
            file = open("sqlite_slow.log", "a+")
            file.write(*args)
            file.write("    IDLE = "+str(idle)+"n")
            file.close()
        return query
 

В данном примере все запросы, выполнение которых превышает 0.1 секунду будут попадать в лог-файл. Соответственно, при необходимости вы можете изменить критерий.
Вызов же полученного курсора необходимо делать следующим образом:
dbconnection = sqlite3.connect("some_slqite_base.db)
dbcursor = dbconnection.cursor(mycursor)
dbcursor.execute("SELECT * FROM sqlite_master")

В лог файл информация попадает в следующем виде:
insert into objects ('comment', 'xmlns', 'name') values ('Patch number 125124', 'http://oval.mitre.org/XMLSchema/oval-definitions-5#solaris', 'patch_object')    IDLE = 1.5530665503253545
 
insert into advisory_cpe ('advisory_id', 'cpe_id') values ('665', '158')    IDLE = 0.19326974126357754

Где значение IDLE это время выполнения команды.
Спасибо за уделенное время. Надеюсь Вам это будет тоже полезным.


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js