Привет, коллеги!
При работе с базами данных 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 это время выполнения команды.
Спасибо за уделенное время. Надеюсь Вам это будет тоже полезным.