Тюнинг oracle 8i под linux redhat 7.3
3123
10
Есть сервер 2Gb памяти, два процессора(Туалатин).
Отправляю друг за другом 30 запросов вида:
SELECT count(distinct patron_id) AS Visits FROM circ_transaction_log WHERE transaction_date BETWEEN '" + currentDay + ".01.2006' AND '" + nextDay + ".01.2006'";

Имею тормоза и почти 100% загрузку на одном из процессоров и достаточно длительный таймаут пока нет ответа. Неужели она так и должна тормозить(я про Oracle).

Просто есть запросы и посерьезней, но тут просто полный таймаут и никакого результата:улыб:

Подскажите или что есть на русском почитать про тюниг.
hamster
Используете ли вы statspack? он прояснит ситуацию. Сам по себе запрос неинформативен, приведите план выполнения. Лучше трэйс файл.
Ну и стандартный вопрос - статистику как часто собираете?...)

можете заглянуть на sql.ru. но там вам зададут те же вопросы что и я)

Книжек на русском - полно, но я бы посоветовал родную доку - Concepts, Sql reference
lex3002
Цепляю trc файл. К сожалению не нашел у себя TKPROF.EXE.
У меня только utlbstat и utlestat.
hamster
Если посылать не 30 запросов, а один - таймаут тоже чувствуется?
Какого клиента используете? Попробуйте прогнать то же самое через sqlplus.
hamster
Вот результат работы tkprof.
В нём видно что проблем нет.
Всё выполнилось (что трассировалось) мгновенно.

Вопрос - что именно трассировалось? И каким образом? Сессия была закрыта прежде чем трассировка была закончена?

Попробуйте:
1. включить трассировку
2. запустить один этот запрос в каком нибудь редакторе (sql*plus, pl/sql developer)
3. Дождаться окончания работы запроса
4. Отключить трассировку

ну и посмотреть что там... там должно быть в поле elapsed какое-нибудь большое число (время затраченное на выполнение). Если там 0 (как сейчас) - значит всё OK... %)
hamster
Кстати, в любом случае подобные запросы гонять к базе НЕЛЬЗЯ. Используйте связываемые переменные и запрос должен быть один!
Такой - SELECT count(distinct patron_id) AS Visits FROM circ_transaction_log WHERE transaction_date BETWEEN :p1 and :p2;

а уж конкретные даты подставляйте какие душе угодно...
Anomander
Запускал именно через sqlplus прямо на сервере.
На sql.ru нашел:
SQL> alter session set sql_trace=true;
SQL> "запуск процедуры";
SQL> exit
Собственно так и сделал. Запрос выполняется примерно минуту с копейками. В программе заложены и более тяжелые поисковые запросы (отправляются через клиента на CGI(perl)) и вот тут вообще тормозит.
Просто несколько сумщает, что по тестам все нормально и наналогичная система на двухголовом ксеоне работает без тормозов причем с большим объемом данных.
lex3002
Повторил экперимент, я так понял e=0 это и есть тот самый
elapsed.
lex3002
var currentDay CHAR(11);
var nextDay CHAR(11);
BEGIN
:currentDay := '01-MAR-2006';
:nextDay := '02-MAR-2006';
END;
/
SELECT count(distinct patron_id) AS Visits FROM circ_transaction_log WHERE transaction_date BETWEEN :currentDay AND :nextDay;

Теперь не знаю, как из C# такое отправлять. Даже var currentDay CHAR(11); var nextDay CHAR(11); в одну строчку дают ошибку в том числе и в sqlplus.
hamster
В .NET, при использовании OracleClient параметры передаются вместе с OracleCommand.
пример на vb.net:
Imports System.Data.OracleClient
Dim parm As OracleParameter
Dim cmd As OracleCommand
cmd = New OracleCommand(query_string, connection)
parm = cmd.Parameters.Add(определяем параметр)
parm.SourceVersion = DataRowVersion.Original
parm.Value = now
hamster
При использовании в запросе литералов (констант) каждый запрос является для СУБД абсолютно новым, никогда ранее не выполнявшимся. Его надо разбирать, уточнять (определять объекты, соответствующие именам), проверять права доступа, оптимизировать и т.д. — короче, каждый выполняемый уникальный оператор придется компилировать при каждом выполнении.
Во случае использования связываемых переменных, значение которых подставляется в запрос при выполнении, такой запрос компилируется один раз, а затем план его выполнения запоминается в разделяемом пуле (в библиотечном кэше), из которого его можно выбрать для повторного выполнения. Различие между этими двумя вариантами в плане производительности и масштабируемости — огромное, даже принципиальное. (с) Tom Kyte