L3_NC
.pdf
Опять bind variables
explain plan for SELECT object_id FROM nc_objects WHERE object_type_id = 301;
explain plan for SELECT object_id FROM nc_objects WHERE object_type_id = :type_id;
© 2013 NetCracker Technology Corporation Confidential |
11 |
План запроса - как интерпретировать
•План запроса это дерево
•Каждый узел дерева – операция
•Отношения между операциями – родитель-потомок
•У каждого родительского узла может быть один или много дочерних узлов
•У каждого дочернего узла только один родитель
•Единственный узел без родительского – корень дерева
•В плане запроса дочерние узлы смещены вправо относительно родительских узлов
•В плане запроса родительские узлы идут перед дочерними и ID родительских узлов меньше дочерних
© 2013 NetCracker Technology Corporation Confidential |
12 |
Понимание плана запроса – это просто
•Чтение сложных планов выполнения так же легко, как и чтение простых
•Всё, что нужно - это методично применять описанные правила
•Не имеет значения, насколько большой план выполнения – декомпозируйте его в базовые блоки и определите порядок выполнения
© 2013 NetCracker Technology Corporation Confidential |
13 |
Неоптимальные запросы – как идентифицировать
•Невозможно оптимизировать запрос не зная/понимая его плана
•Неоптимальный запрос тот, для которого существует оптимальная версия
•Нельзя сравнивать cost запросов между собой
•Сравнивайте ожидаемую и реальную мощность выборки для операций
•Баги оптимизатора запросов
© 2013 NetCracker Technology Corporation Confidential |
14 |
Способы улучшения запросов
•Изменить структуру хранения данных
•Индексы
•Изменить запрос
•Простота
•Читабельность
•Эффективный план
•Хинты
•Временное решение
•Фиксирует план
•Трудно проверять
•Настройки уровня базы данных
© 2013 NetCracker Technology Corporation Confidential |
15 |
Ловушка использования хинтов
SELECT object_id FROM nc_objects WHERE object_type_id < 1010; SELECT /*+ full(nc_objects) */ object_id FROM nc_objects WHERE object_type_id < 1010;
SELECT /*+ full(nc_objects) */ object_id FROM nc_objects o WHERE object_type_id < 1010;
© 2013 NetCracker Technology Corporation Confidential |
16 |
Что почитать?
• http://docs.oracle.com/cd/B28359_01/rac.111/b28252/racmon2.htm
© 2013 NetCracker Technology Corporation Confidential |
17 |
Что такое SQL Injection?
conn = pool.getConnection( );
String sql = "select * from user where username='" + username +"' and password='" + password + "'";
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()) {
loggedIn = true;
out.println("Successfully logged in");
} else {
usernameout.println("Username= “admin’ OR ‘1’=‘1”;and/or password not recognized");
}
select * from user where username='admin' OR '1'='1' and password=' '
© 2013 NetCracker Technology Corporation Confidential |
18 |
Другой пример
String query = "SELECT data FROM table WHERE Email = '"+email+"';";
SELECT data FROM table WHERE Email = ‘foo@example.com';
SELECT data FROM table WHERE Email = ‘Y'; UPDATE table
SET email = 'hacker@example' WHERE email = 'foo@example.com';
© 2013 NetCracker Technology Corporation Confidential |
19 |
Как бороться?: Prepared Statements
// This should REALLY be validated too
String custname = request.getParameter("customerName"); // perform input validation to detect attacks
String query = "SELECT account_balance FROM user_data WHERE user_name = ?";
PreparedStatement pstmt = connection.prepareStatement( query );
pstmt.setString( 1, custname);
ResultSet results = pstmt.executeQuery( );
String strUserName = request.getParameter("Txt_UserName"); PreparedStatement prepStmt =
con.prepareStatement("SELECT * FROM user WHERE userId = '+strUserName+'");
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet |
20 |
© 2013 NetCracker Technology Corporation Confidential |
