Книга поможет выработать правильную тактику и оценить перспективы раз



Pdf көрінісі
бет21/24
Дата19.11.2023
өлшемі1.3 Mb.
#483696
1   ...   16   17   18   19   20   21   22   23   24
refaktoringsql-prilozheniy


Глава 1. Оценка
when -1 then datalength(st.text)
else qs.statement_end_offset
end
- qs.statement_start_offset)/2) + 1) as statement_text
from sys.dm_exec_query_stats as qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as st) a
where a. statement_text not like '%select a.*%'
order by a.creation_time
и в результате получить:
execution_count total_elapsed_time total_logical_reads statement_text
228 98590420 3062040 select txid, ...
212270 22156494 849080 select threshold ...
1 2135214 13430 ...
...
Администратор SQL Server заметит, что самыми долгими запросами яв-
ляются, несомненно, операторы select в транзакциях, и сделает то же 
заключение, что и остальные: в таблице транзакций недостает индек-
са . К сожалению, результат исправления разочаровывает . Создание ин-
декса по столбцу accountid увеличивает производительность в скромные 
1,3 раза, всего до четырех минут с небольшим, чего явно недостаточно, 
чтобы этим восторгаться . В табл . 1 .2 показано увеличение скорости, по-
лученное в результате применения нового индекса, для каждой СУБД . 
Таблица 1.2. Коэффициент увеличения скорости после добавления 
индекса к транзакциям 
СУБД
Увеличение скорости
MySQL
3,1
Oracle
1,2
SQL Server
1,3
Настройка путем индексирования очень популярна среди разработчи-
ков, поскольку в код не нужно вносить никаких изменений . Этот прием 
точно так же популярен и среди администраторов баз данных, которые 
не часто видят код и знают, что правильное индексирование со значи-
тельно большей вероятностью приведет к заметным результатам, чем 
изменение малоизученных параметров . Но я хочу повести вас дальше 
и показать, чего вы можете добиться ценой небольших усилий .
Припудривание кода
Я модифицировал код программы FirstExample.java и создал на ее осно-
ве программу SecondExample.java . В исходный код я внес два усовер-
шенствования . Возможно, вам неясно, какова цель оператора order by 
в главном запросе:


Простой пример 
29
select txid,amount,curr
from transactions
where accountid=?
and txdate >= date_sub(?, interval 30 day)
order by txdate
Мы всего лишь берем данные из одной таблицы для заполнения другой .
Если нам нужен отсортированный результат, мы добавим оператор order 
by
в запрос, который получает данные из итоговой таблицы для предо-
ставления конечному пользователю . На нынешнем, промежуточном, 
этапе оператор order by не нужен; это очень распространенная ошибка, 
заметить ее можно только наметанным взглядом .
Второе усовершенствование связано с частой вставкой данных со средней 
скоростью (я получил в общей сложности несколько сотен строк в табли-
це журнала) . По умолчанию для соединения JDBC применяется режим 
автоматической фиксации изменений . В данном случае это означает, 
что после каждой вставки будет срабатывать принудительный опера-
тор commit и каждое изменение будет синхронно записываться на диск . 
Такая запись в постоянное хранилище гарантирует, что изменения не 
будут потеряны даже в случае сбоя системы всего через миллисекунду 
после их внесения, а без фиксации изменения хранятся только в памяти 
и поэтому могут быть потеряны . В данном случае это излишняя предо-
сторожность . Если произойдет сбой системы, можно просто запустить 
программу снова, особенно если удастся сделать ее быстрой – маловеро-
ятно, что сбои будут происходить очень часто . Поэтому я вставил в на-
чале программы оператор, отключающий автоматическую фиксацию, 
а в конце – оператор, принудительно фиксирующий изменения:
// Отключение автоматической фиксации
con.setAutoCommit(false);
и
con.commit();
Эти два очень маленьких изменения дали некоторое ускорение работы 
программы: их совместный эффект на версии для MySQL увеличил ско-
рость примерно на 10% . Однако с Oracle и SQL Server мы не получили 
никаких заметных результатов (табл . 1 .3) . 
Таблица 1.3. Коэффициент увеличения скорости после добавления 
индекса к транзакциям, очистки кода и отключения автоматической 
фиксации изменений


Достарыңызбен бөлісу:
1   ...   16   17   18   19   20   21   22   23   24




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет