Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

L3_NC

.pdf
Скачиваний:
21
Добавлен:
19.04.2015
Размер:
940.03 Кб
Скачать

Опять 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]