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

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

    Комментарии 15

      +3
      sqlite3_profile
        0
        К сожалению я не нашел способа вызвать данный метод на Python. Не могли бы вы подсказать решение?
          +1
            0
            Спасибо.
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              чем такой вариант лучше указанного в статье?
              • НЛО прилетело и опубликовало эту надпись здесь
                • НЛО прилетело и опубликовало эту надпись здесь
            +3
            Не называйте переменную «file». Для логированья используйте не «open(»sqlite_slow.log", «a+»)", а logging. Для такого логирования и тайминга отлично подойдет декоратор с использованием contextlib.
              0
              Спасибо за советы. Заменю операции с файлом на логгер.
              +1
              Вы уж извините, но это недостойно отдельной статьи на хабре. Переопределить execute — ну просто охренеть какая магия.
                0
                Классы желательно называть с большой буквы.
                  0
                  Классы необходимо называть с большой буквы.

                  Almost without exception, class names use the CapWords convention.
                  Classes for internal use have a leading underscore in addition.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое