Spec-Zone .ru
спецификации, руководства, описания, API

5.7.1.7. Зонды на уровне строки

*row-{start,done} зонды инициированы каждый раз, когда работа строки отталкивается к механизму хранения. Например, если Вы выполняетесь INSERT оператор с 100 строками данных, тогда insert-row-start и insert-row-done зонды будут инициированы 100 раз каждый, поскольку каждая строка вставляет.

insert-row-start(database, table)insert-row-done(status)update-row-start(database, table)update-row-done(status)delete-row-start(database, table)delete-row-done(status)

Параметры, поддерживаемые зондами, являются непротиворечивыми для соответствия start и done зонды в каждом случае:

Поскольку зонды на уровне строки инициированы для каждого отдельного доступа строки, эти зонды могут быть инициированы много тысяч времен каждую секунду, у которых может быть неблагоприятное воздействие и на контролирующий сценарий и на MySQL. Среда DTrace должна ограничить инициирование на этих зондах, чтобы предотвратить оказываемую негативное влияние производительность. Или используйте зонды экономно, или используйте счетчик или функции агрегации, чтобы сообщить относительно этих зондов и затем обеспечить сводку, когда сценарий завершается или как часть a query-done или query-exec-done зонды.

Следующий сценарий в качестве примера суммирует продолжительность каждой работы строки в пределах большего запроса:

#!/usr/sbin/dtrace -s#pragma D option quietdtrace:::BEGIN{   printf("%-2s %-10s %-10s %9s %9s %-s \n",          "St", "Who", "DB", "ConnID", "Dur ms", "Query");}mysql*:::query-start{   self->query = copyinstr(arg0);   self->who   = strjoin(copyinstr(arg3),strjoin("@",copyinstr(arg4)));   self->db    = copyinstr(arg2);   self->connid = arg1;   self->querystart = timestamp;   self->rowdur = 0;}mysql*:::query-done{   this->elapsed = (timestamp - self->querystart) /1000000;   printf("%2d %-10s %-10s %9d %9d %s\n",          arg0, self->who, self->db,          self->connid, this->elapsed, self->query);}mysql*:::query-done/ self->rowdur /{   printf("%34s %9d %s\n", "", (self->rowdur/1000000), "-> Row ops");}mysql*:::insert-row-start{   self->rowstart = timestamp;}mysql*:::delete-row-start{   self->rowstart = timestamp;}mysql*:::update-row-start{   self->rowstart = timestamp;}mysql*:::insert-row-done{   self->rowdur += (timestamp-self->rowstart);}mysql*:::delete-row-done{   self->rowdur += (timestamp-self->rowstart);}mysql*:::update-row-done{   self->rowdur += (timestamp-self->rowstart);}

Выполняя вышеупомянутый сценарий с запросом, который вставляет данные в таблицу, можно контролировать, точное время потратило выполнение необработанной вставки строки:

St Who        DB            ConnID    Dur ms Query 0 @localhost test              13     20767 insert into t1(select * from t2)4827 -> Row ops