Pull to refresh

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

Reading time 2 min
Views 5.9K
Привет, коллеги!
При работе с базами данных sqlite передо мной возникла задача поиска медленных запросов и их логгирования.
Спросив всезнающий Google я к сожалению не обнаружил ни одного решения (плохо искал?).
Поэтому я хочу предложить свой вариант протоколирования.
UPD: Спасибо за подсказку, нативный вариант решения называется APSW

image


Подсчет времени выполнения запроса мы будем вести на уровне курсора.
Для этого переопределим данный класс добавив в него подсчет времени выполнения запроса.

import sqlite3
import 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 это время выполнения команды.
Спасибо за уделенное время. Надеюсь Вам это будет тоже полезным.
Tags:
Hubs:
+12
Comments 15
Comments Comments 15

Articles