Download - Трудовые будни инженера производительности
![Page 1: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/1.jpg)
© 2015 NetCracker Technology Corporation Confidential
Трудовые будни performance engineer
Владимир Ситниковjokerconf university 2015
![Page 2: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/2.jpg)
2© 2015 NetCracker Technology Corporation Confidential
Кто я
• Владимир Ситников• Инженер-ускорятор в NetCracker• [email protected]• @VladimirSitnikv
![Page 3: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/3.jpg)
3© 2015 NetCracker Technology Corporation Confidential
Характерные требования в enterprise
• Время отклика‒ 100мс … 1с … 1ч
• Частота выполнений‒ 1/день … 1/с … 100/с
• Объём обрабатываемых данных‒ 10КиБ … 1Миб … 1ГиБ
![Page 4: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/4.jpg)
4© 2015 NetCracker Technology Corporation Confidential
Основная ошибка при проверке производительности
Проверку требований нужно выполнять на приближенных к боевым условиях
![Page 5: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/5.jpg)
5© 2015 NetCracker Technology Corporation Confidential
Основная ошибка при проверке производительности
Проверку требований нужно выполнять на приближенных к боевым условиях• Та же версия java, OS, application server
![Page 6: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/6.jpg)
6© 2015 NetCracker Technology Corporation Confidential
Основная ошибка при проверке производительности
Проверку требований нужно выполнять на приближенных к боевым условиях• Та же версия java, OS, application server• Тот же объём данных
![Page 7: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/7.jpg)
7© 2015 NetCracker Technology Corporation Confidential
Основная ошибка при проверке производительности
Проверку требований нужно выполнять на приближенных к боевым условиях• Та же версия java, OS, application server• Тот же объём данных• Та же входная нагрузка
![Page 8: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/8.jpg)
8© 2015 NetCracker Technology Corporation Confidential
Основная ошибка при проверке производительности
Проверку требований нужно выполнять на приближенных к боевым условиях• Та же версия java, OS, application server• Тот же объём данных• Та же входная нагрузка• Тот же процент ошибочных сценариев
![Page 9: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/9.jpg)
9© 2015 NetCracker Technology Corporation Confidential
Проблемы в Production• Создан работающий код
• Пройдено тестирование
![Page 10: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/10.jpg)
10© 2015 NetCracker Technology Corporation Confidential
Проблемы в Production• Создан работающий код
• Пройдено тестирование
• Production Проблемы производительности, недоступность приложения, и т.п.
![Page 11: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/11.jpg)
11© 2015 NetCracker Technology Corporation Confidential
Проблемы в Production• Создан работающий код
• Пройдено тестирование
• Production Проблемы производительности, недоступность приложения, и т.п.
• Customer Support передает проблему в System Performance
![Page 12: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/12.jpg)
12© 2015 NetCracker Technology Corporation Confidential
Проблемы в Production• Создан работающий код
• Пройдено тестирование
• Production Проблемы производительности, недоступность приложения, и т.п.
• Customer Support передает проблему в System Performance
• SP находит причину, и автор кода о ней не знает
![Page 13: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/13.jpg)
13© 2015 NetCracker Technology Corporation Confidential
Сложение строк
• StringBuilder vs StringBuffer
• String + String vs SB.append
![Page 14: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/14.jpg)
14© 2015 NetCracker Technology Corporation Confidential
Сложение строк
• StringBuilder vs StringBuffer• Без разницы
• String + String vs SB.append• В циклах лучше SB
![Page 15: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/15.jpg)
15© 2015 NetCracker Technology Corporation Confidential
Когда же нужен StringB***er?
String res = ""; String names[] = ...; for(int i=0; i<length; i++) { res += (i==0 ? "" : ", ") + names[i]; }
StringBuilder полезен в циклах/if’ах
![Page 16: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/16.jpg)
16© 2015 NetCracker Technology Corporation Confidential
Когда же нужен StringB***er?
String res = ""; String names[] = ...; for(int i=0; i<length; i++) { res += new SB() .append(i==0 ? "" : ", ") .append(names[i]).toString(); }
StringBuilder полезен в циклах/if’ах
![Page 17: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/17.jpg)
17© 2015 NetCracker Technology Corporation Confidential
Когда же нужен StringB***er?
StringBuilder res = new StringBuilder(); String names[] = ...; for(int i=0; i<length; i++) { res .append(i==0 ? "" : ", ") .append(names[i]); }
StringBuilder полезен в циклах/if’ах
![Page 18: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/18.jpg)
18© 2015 NetCracker Technology Corporation Confidential
Добавляем вишенку
StringBuilder res = new StringBuilder(100500); String names[] = ...; for(int i=0; i<length; i++) { res .append(i==0 ? "" : ", ") .append(names[i]); }
StringBuilder полезен в циклах/if’ах
![Page 19: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/19.jpg)
19© 2015 NetCracker Technology Corporation Confidential
GC друг или враг?
• Основная масса проблем с java в enterprise – java GC или OS swap
![Page 20: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/20.jpg)
20© 2015 NetCracker Technology Corporation Confidential
GC друг или враг?
• Основная масса проблем с java в enterprise – java GC или OS swap
• Для анализа всегда сохраняем логи работы GC: -Xloggc
![Page 21: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/21.jpg)
21© 2015 NetCracker Technology Corporation Confidential
GC друг или враг?
• Основная масса проблем с java в enterprise – java GC или OS swap
• Для анализа всегда сохраняем логи работы GC: -Xloggc
• Открываем программой GCViewer
![Page 22: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/22.jpg)
22© 2015 NetCracker Technology Corporation Confidential
GC друг или враг?
• Основная масса проблем с java в enterprise – java GC или OS swap
• Для анализа всегда сохраняем логи работы GC: -Xloggc
• Открываем программой GCViewer
• GC наносит ответный удар: лог пишется синхронно• Не стоит размещать gc.log на сетевых дисках (NFS):
http://mail.openjdk.java.net/pipermail/hotspot-gc-use/2014-April/001849.html
![Page 23: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/23.jpg)
23© 2015 NetCracker Technology Corporation Confidential
GCViewer: пример случая, когда «всё пропало»
• Без GC логов не понять хватило ли памяти
![Page 24: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/24.jpg)
24© 2015 NetCracker Technology Corporation Confidential
Где может встретиться regexp
• «Маскирование» (~засекречивание) данных: pin коды, номера карт, …
• Обработка XML: логирование, проверка success/fail, …
• Много где ещё
![Page 25: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/25.jpg)
25© 2015 NetCracker Technology Corporation Confidential
Решили использовать regexp
Стоит избегать .*, .+ и подобных не специфичных конструкцийhttp://www.regular-expressions.info/catastrophic.html
![Page 26: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/26.jpg)
26© 2015 NetCracker Technology Corporation Confidential
Решили использовать regexp
Стоит избегать .*, .+ и подобных не специфичных конструкцийhttp://www.regular-expressions.info/catastrophic.html
Пример медленного выражения:Pattern.compile(
"<(\\S+:)?processID.*>(\\d+)</(\\S+:)?processID>"
![Page 27: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/27.jpg)
27© 2015 NetCracker Technology Corporation Confidential
Решили использовать regexp
Стоит избегать .*, .+ и подобных не специфичных конструкцийhttp://www.regular-expressions.info/catastrophic.html
Пример медленного выражения:Pattern.compile(
"<(\\S+:)?processID.*>(\\d+)</(\\S+:)?processID>"
Встречались экземпляры, работающие 30 секунд на 100КиБ строкеВстречались SQL запросы, работающие по 30 минут вместо 30 секунд
![Page 28: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/28.jpg)
28© 2015 NetCracker Technology Corporation Confidential
/^.*ab$/.match("ab")
|ab.*ab
a|b.*ab
ab|.*ab
ab|.*ab
a|b.*abоткатились
a|b.*abне помогло
|ab.*abоткатились
ab|.*abУра!
.* – жадная конструкция. Ест как не в себя
![Page 29: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/29.jpg)
29© 2015 NetCracker Technology Corporation Confidential
Чиним
Стоит избегать .*, .+ и подобных неспецифичных конструкцийhttp://www.regular-expressions.info/catastrophic.html
Пример быстрого выражения:Pattern.compile(
"[:<]processID[^>]*>(\\d+)</([^>:]+:)?processID>"
Решение: [^>]* и [^>:]+ остановятся на первом неподходящем символе. За границу xml тэга наш regexp не уйдёт.
![Page 30: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/30.jpg)
30© 2015 NetCracker Technology Corporation Confidential
Чиним ещё чуть-чуть
Добавляем плюсик для отмены откатов:Pattern.compile(
"[:<]processID[^>]*+>(\\d+)</([^>:]++:)?processID>“
Меньше вариантов на проверку – быстрее работает
![Page 31: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/31.jpg)
31© 2015 NetCracker Technology Corporation Confidential
График скорости .*, .*?, [^>]
1 КиБ 2 КиБ 3 КиБ 4 КиБ0
50100150200250300350
.*
.*?[^>]*
Быст
рее,
оп/
мс
![Page 32: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/32.jpg)
32© 2015 NetCracker Technology Corporation Confidential
График скорости .*, .*?, [^>], шаблон не найден
1 КиБ 2 КиБ 3 КиБ 4 КиБ0
10
20
30
40
50
.*
.*?[^>]*
Быст
рее,
оп/
мс
Поиск тормозил, т.к. шаблон не нашёлся
![Page 33: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/33.jpg)
33© 2015 NetCracker Technology Corporation Confidential
График скорости .*, .*, [^>], шаблон не найден
1 КиБ 2 КиБ 3 КиБ 4 КиБ0
20
40
60
80
100
.*
.*?[^>]*(?>
Быст
рее,
оп/
мс <ROW>(?>.*?<RSACCTNMBR>)(?>[^<]*</RSACCTNMBR>)…
![Page 34: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/34.jpg)
34© 2015 NetCracker Technology Corporation Confidential
Признаки хорошего регулярного выражения
• Кушает только нужные символы• [^>]* vs .*• .(!=hello)
![Page 35: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/35.jpg)
35© 2015 NetCracker Technology Corporation Confidential
Признаки хорошего регулярного выражения
• Кушает только нужные символы• [^>]* vs .*• .(!=hello)
• Не содержит лишних конструкций• <MAC\\d{5} vs (<MAC\\d{5}\\s)
![Page 36: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/36.jpg)
36© 2015 NetCracker Technology Corporation Confidential
Признаки хорошего регулярного выражения
• Кушает только нужные символы• [^>]* vs .*• .(!=hello)
• Не содержит лишних конструкций• <MAC\\d{5} vs (<MAC\\d{5}\\s)
• Не выполняется вообще• Например, если мы маскируем значения, то делать это нужно только если реально
выводим данные• Если XML всё равно парсить, то стоит посмотреть на XPath
![Page 37: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/37.jpg)
37© 2015 NetCracker Technology Corporation Confidential
А давайте ускорим String?
String.format("...") использует java.util.regex.Pattern для разбора формата
formatSpecifier = "%(\\d+\\$)?([-#+ 0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";
![Page 38: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/38.jpg)
38© 2015 NetCracker Technology Corporation Confidential
Откуда взять тестовые данные?
Возьмём шаблон из Java Microbenchmark Harness:
(min, avg, max) = (%s, %s, %s), stdev = %s%n CI (99.9%%): [%s, %s] (assumes normal distribution)
![Page 39: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/39.jpg)
39© 2015 NetCracker Technology Corporation Confidential
Добавляем плюсов по вкусу
formatSpecifier = "%(\\d+\\$)?([-#+ 0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";
fastSpecifier = "%(\\d++\\$)?+([-#+ 0,(\\<]+)?+(\\d++)?+(\\.\\d++)?+([tT])?+([a-zA-Z%])";
![Page 40: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/40.jpg)
40© 2015 NetCracker Technology Corporation Confidential
Бесплатный сыр
Benchmark Cnt Score Error Unitsjdk18u45 60 1,067 ± 0,025 us/opoptimized 60 0,917 ± 0,021 us/op
![Page 41: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/41.jpg)
41© 2015 NetCracker Technology Corporation Confidential
HashMap$Entry
• HashMap создаёт вспомогательные Entry объекты для хранения связки ключ-значение
![Page 42: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/42.jpg)
42© 2015 NetCracker Technology Corporation Confidential
HashMap$Entry
• HashMap создаёт вспомогательные Entry объекты для хранения связки ключ-значение
• Если большинство ключей оказываются одинаковыми, то очень хочется не хранить ключи в каждом отдельном объекте Map
![Page 43: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/43.jpg)
43© 2015 NetCracker Technology Corporation Confidential
HashMap
HashMap Entry[]
Entryid
41
Entryname
qwe
![Page 44: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/44.jpg)
44© 2015 NetCracker Technology Corporation Confidential
HashMap: entry лишние
HashMap Entry[]
Entryid
41
Entryname
qwe
![Page 45: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/45.jpg)
45© 2015 NetCracker Technology Corporation Confidential
HashMap
HashMap Entry[]
Entryid
41
Entryname
qwe
![Page 46: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/46.jpg)
46© 2015 NetCracker Technology Corporation Confidential
CompactMap
CMap1 Object[]41
qwe
CMap2
keyposid=0
name=1
Object[]42
rty
![Page 47: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/47.jpg)
47© 2015 NetCracker Technology Corporation Confidential
CompactHashMap: границы применимости
• Работает, если форма (состав ключей) у многих объектов одинаковая• Например, у всех объектов есть запись “width”=“100%”
• https://github.com/vlsi/compactmap• См. v8/design.html#prop_access
![Page 48: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/48.jpg)
48© 2015 NetCracker Technology Corporation Confidential
CompactHashMap: первые тесты
HashMap -> CompactHashMap в реальном проекте:
• 500МиБ –> 290МиБ• 3.0 сек / 1M обращений -> 150 сек / 1M обращений
![Page 49: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/49.jpg)
49© 2015 NetCracker Technology Corporation Confidential
CompactHashMap
HashMap -> CompactHashMap в реальном проекте:
• 500МиБ –> 290МиБ• 3.0 сек / 1M обращений -> 150 сек / 1M обращений
![Page 50: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/50.jpg)
50© 2015 NetCracker Technology Corporation Confidential
ReservedCodeCacheSize
• Если у JIT компилятора заканчивается память, то он перестаёт компилировать
![Page 51: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/51.jpg)
51© 2015 NetCracker Technology Corporation Confidential
ReservedCodeCacheSize
• Если у JIT компилятора заканчивается память, то он перестаёт компилировать
• В приложении с большим количеством кода стандартных 64M мало
![Page 52: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/52.jpg)
52© 2015 NetCracker Technology Corporation Confidential
ReservedCodeCacheSize
• Если у JIT компилятора заканчивается память, то он перестаёт компилировать
• В приложении с большим количеством кода стандартных 64M мало
• -XX:+ReservedCodeCacheSize=128m/192m
![Page 53: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/53.jpg)
53© 2015 NetCracker Technology Corporation Confidential
CompactHashMap
HashMap -> CompactHashMap, -XX:+ReservedCodeCacheSize=128m:
• 500МиБ –> 290МиБ• 3.0 сек / 1M обращений -> 3.5 сек / 1M обращений
![Page 54: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/54.jpg)
54© 2014 NetCracker Technology Corporation Confidential
SQL
![Page 55: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/55.jpg)
55© 2015 NetCracker Technology Corporation Confidential
Типичные проблемы в SQL
• Выборка лишних данных• max(order_number)+1, count(*)>0, большая иерархия
• Нет ясного порядка выполнения запроса• Лишние таблицы в части FROM• Неверное использование связанных переменных
![Page 56: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/56.jpg)
56© 2015 NetCracker Technology Corporation Confidential
Типичные проблемы в SQL
• Выборка лишних данных• max(order_number)+1, count(*)>0, большая иерархия
• Нет ясного порядка выполнения запроса• Лишние таблицы в части FROM• Неверное использование связанных переменных
![Page 57: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/57.jpg)
57© 2015 NetCracker Technology Corporation Confidential
Один запрос – один правильный план выполнения
1. В “Folder for Orders” найти Order, ссылающийся на нужный Instance
Как бы решал человек:
2. По ссылкам находим ордера, и проверяем Folder
![Page 58: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/58.jpg)
58© 2015 NetCracker Technology Corporation Confidential
Один запрос – один правильный план выполнения
2. В “Service Order’е” найти компоненту, ссылающуюся на нужный Template
Как бы решал человек:
3. Находим дочерние компоненты и проверяем Template
10
101
![Page 59: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/59.jpg)
59© 2015 NetCracker Technology Corporation Confidential
Один запрос – один правильный план выполненияЗадачи:
1. В “Folder for Service Orders” найти Service Order, ссылающийся на нужный Service Instance
2. В “Service Order’е” найти компоненту, ссылающуюся на нужный Template
В обоих случаях может получиться одинаковый запрос (например, EAV):select o.object_id from objects o, references ref where o.parent_id = :1 and o.object_id = ref.object_id and ref.reference = :2 and ref.property = :3
![Page 60: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/60.jpg)
60© 2015 NetCracker Technology Corporation Confidential
Один запрос – один правильный план выполнения
• Разработчик должен хотя бы задумываться о плане выполнения• Без explain plan никуда
![Page 61: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/61.jpg)
61© 2015 NetCracker Technology Corporation Confidential
Один запрос – один правильный план выполнения
• Разработчик должен хотя бы задумываться о плане выполнения• Без explain plan никуда
• Если в запросе несколько условий, то хинты обязательны
![Page 62: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/62.jpg)
62© 2015 NetCracker Technology Corporation Confidential
Один запрос – один правильный план выполнения
• Разработчик должен хотя бы задумываться о плане выполнения• Без explain plan никуда
• Если в запросе несколько условий, то хинты обязательны
• Основные хинты:• leading(a b c) – указываем с каких таблиц начинать
выполнение запроса• index(o index_name) – указываем какой индекс нужно
использовать• no_merge – запрещаем раскрывать подзапросы• use_nl/use_hash – основные способы объединения таблиц
![Page 63: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/63.jpg)
63© 2015 NetCracker Technology Corporation Confidential
А нужны ли хинты?
• База умная,сама ускорит запросы
![Page 64: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/64.jpg)
64© 2015 NetCracker Technology Corporation Confidential
А нужны ли хинты?
• База умная, статистику собрали,сама ускорит запросы
![Page 65: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/65.jpg)
65© 2015 NetCracker Technology Corporation Confidential
А нужны ли хинты?
• База умная, статистику собрали, собираем статистику регулярно,запросы сами будут хорошие
![Page 66: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/66.jpg)
66© 2015 NetCracker Technology Corporation Confidential
А нужны ли хинты?
• База умная, статистику собрали, собираем статистику регулярно,запросы сами будут хорошиебаза не понимает бизнес-смысл
• Без хинтов не взлетит
![Page 67: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/67.jpg)
67© 2015 NetCracker Technology Corporation Confidential
А нужна ли тогда статистика?
• Если всё равно хинты, то зачем статистика?
![Page 68: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/68.jpg)
68© 2015 NetCracker Technology Corporation Confidential
А нужна ли тогда статистика?
• Если всё равно хинты, то зачем статистика?
![Page 69: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/69.jpg)
69© 2015 NetCracker Technology Corporation Confidential
А нужна ли тогда статистика?
• Если всё равно хинты, то зачем статистика?• Повторяемость production и dev/test
окружений
![Page 70: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/70.jpg)
70© 2015 NetCracker Technology Corporation Confidential
А нужна ли тогда статистика?
• Если всё равно хинты, то зачем статистика?• Повторяемость production и dev/test
окружений• Отсутствие out-of-thin air проблем
![Page 71: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/71.jpg)
71© 2015 NetCracker Technology Corporation Confidential
А как же любимые cost/rows?
• База оценивает количество строк на основе собранной статистики
![Page 72: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/72.jpg)
72© 2015 NetCracker Technology Corporation Confidential
А как же любимые cost/rows?
• База оценивает количество строк на основе собранной статистики
• В статистику входят• Общее количество строк• Количество уникальных записей в колонке• Количество null записей в колонке
![Page 73: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/73.jpg)
73© 2015 NetCracker Technology Corporation Confidential
А как же любимые cost/rows?
• База оценивает количество строк на основе собранной статистики
• В статистику входят• Общее количество строк• Количество уникальных записей в колонке• Количество null записей в колонке
• Rows – оценка базы о том, сколько строк вернёт запрос
• Cost – оценка базы о том, сколько дисковых операций потребуется для выполнения запроса
![Page 74: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/74.jpg)
74© 2015 NetCracker Technology Corporation Confidential
А как же любимые cost/rows?
• База оценивает количество строк на основе собранной статистики
• В статистику входят• Общее количество строк• Количество уникальных записей в колонке• Количество null записей в колонке• Бизнес-смысл данных в статистику не входит!
• Rows – оценка базы о том, сколько строк вернёт запрос
• Cost – оценка базы о том, сколько дисковых операций потребуется для выполнения запроса
![Page 75: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/75.jpg)
75© 2015 NetCracker Technology Corporation Confidential
Кто я
• Владимир Ситников• Инженер-ускорятор в NetCracker• [email protected]• @VladimirSitnikv
![Page 76: Трудовые будни инженера производительности](https://reader033.vdocuments.mx/reader033/viewer/2022052514/586fdbd71a28ab18428b62ad/html5/thumbnails/76.jpg)
Спасибо
76© 2014 NetCracker Technology Corporation Confidential