L3_NC
.pdfТехническая поддержка программных решений 3/10 Методы выявления ошибок в SQL приложениях
© 2013 NetCracker Technology Corporation Confidential
Цель лекции
•Оптимизация запросов
•SQL injection
•Выявление ошибок в запросе
•Отладка в Oracle SQL Developer
© 2013 NetCracker Technology Corporation Confidential |
2 |
Разминка
SQL> descr |
emp |
|
Name |
Null? |
Type |
------ |
-------- ----------- |
|
EMPNO |
NOT NULL NUMBER(4) |
|
ENAME |
|
VARCHAR2(20) |
JOB |
|
VARCHAR2(9) |
MGR |
|
NUMBER(4) |
HIREDATE |
|
DATE |
В следующей SELECT команде четыре ошибки.
SAL |
NUMBER(7,2) |
COMM |
NUMBER(7,2) |
DEPTNO |
NUMBER(2) |
SELECT empno, ename
salary x 12 ANNUAL SALARY FROM emp;
© 2013 NetCracker Technology Corporation Confidential |
3 |
Понимание SQL
Troubleshooting does not depend on magic, mystique, or myth; it depends on understanding, observation, and interpretation
Christian Antognini
По материалам «Troubleshooting SQL queries» Виталий Платонов, NC |
4 |
© 2013 NetCracker Technolo y Corporation Confidential |
План
•Жизненный цикл запроса
•Что такое синтаксический анализ и как он работает
•Связанные переменные – преимущества и недостатки
•Как Oracle хранит данные
•План запроса – как получить, как интерпретировать
•Неоптимальные запросы – как идентифицировать
•Способы улучшения запросов
© 2013 NetCracker Technology Corporation Confidential |
5 |
Жизненный цикл запроса
© 2013 NetCracker Technology Corporation Confidential |
6 |
Parsing (синтаксический анализ)
Примеры:
SELECT NAME FROM nc_objects WHERE rownum = 1
SELECT NAME FROM nc_OBJECTS WHERE rownum = 1
© 2013 NetCracker Technology Corporation Confidential |
7 |
Bind variables (Cвязанные переменные)
Преимущества:
•Нет лишних hard parses
•Легче манипулировать данными
•Противодействие SQL injections
•Bind variable graduation
Недостатки:
•Оптимизатор неправильно выбирает план
•Bind variable peeking
© 2013 NetCracker Technology Corporation Confidential |
8 |
Bind variable peeking
select name from NC_objects where object_id < 999999999999999999999;
select name from NC_objects where object_id < 1010;
variable id number;
exec :id := 999999999999999999999;
select name from NC_objects where object_id < :id;
exec :id := 1010;
select name from NC_objects where object_id < :id;
© 2013 NetCracker Technology Corporation Confidential |
9 |
План запроса – как получить
• EXPLAIN PLAN
explain plan for select name from nc_objects where object_id < 1010;
select * from table(dbms_xplan.display);
• Запрос к library cache
v$sql_plan, v$sql_plan_statistics, v$sql_workarea, v$sql_plan_statistics_all statistics level, gather_plan_statistics hint
select /*+ gather_plan_statistics */ select name from NC_objects where object_id < 1010; SELECT * FROM TABLE (DBMS_XPLAN.DISPLAY_CURSOR (NULL, NULL, 'ALLSTATS LAST'));
•AWR aka Automatic Workload Repository
•Activate tracing
© 2013 NetCracker Technology Corporation Confidential |
10 |