Погода: −2 °C
16.11−2...−1пасмурно, небольшой снег
17.11−5...−3пасмурно, без осадков
  • Есть сервер 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).

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

    Подскажите или что есть на русском почитать про тюниг.

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

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

    Книжек на русском - полно, но я бы посоветовал родную доку - Concepts, Sql reference

  • Цепляю trc файл. К сожалению не нашел у себя TKPROF.EXE.
    У меня только utlbstat и utlestat.

  • Если посылать не 30 запросов, а один - таймаут тоже чувствуется?
    Какого клиента используете? Попробуйте прогнать то же самое через sqlplus.

  • Вот результат работы tkprof.
    В нём видно что проблем нет.
    Всё выполнилось (что трассировалось) мгновенно.

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

    Попробуйте:
    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;

    а уж конкретные даты подставляйте какие душе угодно...

  • Запускал именно через sqlplus прямо на сервере.
    На sql.ru нашел:
    SQL> alter session set sql_trace=true;
    SQL> "запуск процедуры";
    SQL> exit
    Собственно так и сделал. Запрос выполняется примерно минуту с копейками. В программе заложены и более тяжелые поисковые запросы (отправляются через клиента на CGI(perl)) и вот тут вообще тормозит.
    Просто несколько сумщает, что по тестам все нормально и наналогичная система на двухголовом ксеоне работает без тормозов причем с большим объемом данных.

  • Повторил экперимент, я так понял e=0 это и есть тот самый
    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.

  • В .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

  • При использовании в запросе литералов (констант) каждый запрос является для СУБД абсолютно новым, никогда ранее не выполнявшимся. Его надо разбирать, уточнять (определять объекты, соответствующие именам), проверять права доступа, оптимизировать и т.д. — короче, каждый выполняемый уникальный оператор придется компилировать при каждом выполнении.
    Во случае использования связываемых переменных, значение которых подставляется в запрос при выполнении, такой запрос компилируется один раз, а затем план его выполнения запоминается в разделяемом пуле (в библиотечном кэше), из которого его можно выбрать для повторного выполнения. Различие между этими двумя вариантами в плане производительности и масштабируемости — огромное, даже принципиальное. (с) Tom Kyte

Записей на странице:

Перейти в форум

Модераторы: