На информационном ресурсе применяются cookie-файлы. Оставаясь на сайте, вы подтверждаете свое согласие на их использование.
Тюнинг oracle 8i под linux redhat 7.3
3124
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).
Просто есть запросы и посерьезней, но тут просто полный таймаут и никакого результата
Подскажите или что есть на русском почитать про тюниг.
Отправляю друг за другом 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).
Просто есть запросы и посерьезней, но тут просто полный таймаут и никакого результата

Подскажите или что есть на русском почитать про тюниг.
Используете ли вы statspack? он прояснит ситуацию. Сам по себе запрос неинформативен, приведите план выполнения. Лучше трэйс файл.
Ну и стандартный вопрос - статистику как часто собираете?...)
можете заглянуть на sql.ru. но там вам зададут те же вопросы что и я)
Книжек на русском - полно, но я бы посоветовал родную доку - Concepts, Sql reference
Ну и стандартный вопрос - статистику как часто собираете?...)
можете заглянуть на sql.ru. но там вам зададут те же вопросы что и я)
Книжек на русском - полно, но я бы посоветовал родную доку - Concepts, Sql reference
Цепляю trc файл. К сожалению не нашел у себя TKPROF.EXE.
У меня только utlbstat и utlestat.
У меня только utlbstat и utlestat.
Если посылать не 30 запросов, а один - таймаут тоже чувствуется?
Какого клиента используете? Попробуйте прогнать то же самое через sqlplus.
Какого клиента используете? Попробуйте прогнать то же самое через sqlplus.
Вот результат работы tkprof.
В нём видно что проблем нет.
Всё выполнилось (что трассировалось) мгновенно.
Вопрос - что именно трассировалось? И каким образом? Сессия была закрыта прежде чем трассировка была закончена?
Попробуйте:
1. включить трассировку
2. запустить один этот запрос в каком нибудь редакторе (sql*plus, pl/sql developer)
3. Дождаться окончания работы запроса
4. Отключить трассировку
ну и посмотреть что там... там должно быть в поле elapsed какое-нибудь большое число (время затраченное на выполнение). Если там 0 (как сейчас) - значит всё OK... %)
В нём видно что проблем нет.
Всё выполнилось (что трассировалось) мгновенно.
Вопрос - что именно трассировалось? И каким образом? Сессия была закрыта прежде чем трассировка была закончена?
Попробуйте:
1. включить трассировку
2. запустить один этот запрос в каком нибудь редакторе (sql*plus, pl/sql developer)
3. Дождаться окончания работы запроса
4. Отключить трассировку
ну и посмотреть что там... там должно быть в поле elapsed какое-нибудь большое число (время затраченное на выполнение). Если там 0 (как сейчас) - значит всё OK... %)
Кстати, в любом случае подобные запросы гонять к базе НЕЛЬЗЯ. Используйте связываемые переменные и запрос должен быть один!
Такой - SELECT count(distinct patron_id) AS Visits FROM circ_transaction_log WHERE transaction_date BETWEEN :p1 and :p2;
а уж конкретные даты подставляйте какие душе угодно...
Такой - SELECT count(distinct patron_id) AS Visits FROM circ_transaction_log WHERE transaction_date BETWEEN :p1 and :p2;
а уж конкретные даты подставляйте какие душе угодно...
Запускал именно через sqlplus прямо на сервере.
На sql.ru нашел:
SQL> alter session set sql_trace=true;
SQL> "запуск процедуры";
SQL> exit
Собственно так и сделал. Запрос выполняется примерно минуту с копейками. В программе заложены и более тяжелые поисковые запросы (отправляются через клиента на CGI(perl)) и вот тут вообще тормозит.
Просто несколько сумщает, что по тестам все нормально и наналогичная система на двухголовом ксеоне работает без тормозов причем с большим объемом данных.
На sql.ru нашел:
SQL> alter session set sql_trace=true;
SQL> "запуск процедуры";
SQL> exit
Собственно так и сделал. Запрос выполняется примерно минуту с копейками. В программе заложены и более тяжелые поисковые запросы (отправляются через клиента на CGI(perl)) и вот тут вообще тормозит.
Просто несколько сумщает, что по тестам все нормально и наналогичная система на двухголовом ксеоне работает без тормозов причем с большим объемом данных.
Сейчас читают
ВОПРОС-ОТВЕТ. Прямое общение с ветеринарным врачом
305014
762
красота и материнство (часть 129)
238784
1000
Ассоциации игра (часть 61)(NF)
221844
1000
Повторил экперимент, я так понял e=0 это и есть тот самый
elapsed.
elapsed.
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.
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.
В .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
пример на 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
При использовании в запросе литералов (констант) каждый запрос является для СУБД абсолютно новым, никогда ранее не выполнявшимся. Его надо разбирать, уточнять (определять объекты, соответствующие именам), проверять права доступа, оптимизировать и т.д. — короче, каждый выполняемый уникальный оператор придется компилировать при каждом выполнении.
Во случае использования связываемых переменных, значение которых подставляется в запрос при выполнении, такой запрос компилируется один раз, а затем план его выполнения запоминается в разделяемом пуле (в библиотечном кэше), из которого его можно выбрать для повторного выполнения. Различие между этими двумя вариантами в плане производительности и масштабируемости — огромное, даже принципиальное. (с) Tom Kyte
Во случае использования связываемых переменных, значение которых подставляется в запрос при выполнении, такой запрос компилируется один раз, а затем план его выполнения запоминается в разделяемом пуле (в библиотечном кэше), из которого его можно выбрать для повторного выполнения. Различие между этими двумя вариантами в плане производительности и масштабируемости — огромное, даже принципиальное. (с) Tom Kyte