18 октября, четверг 23:25
Bankir.Ru

Объявление

Свернуть
Пока нет объявлений.

производительность select'а

Свернуть
X
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • производительность select'а

    Добрый день, коллеги.

    Вопрос из области академических, но тем не менее.. Вот такой вот запросик :

    SELECT acct.acct, signs.xattr-value, signs.code-value, signs.surrogate
    FROM
    acct, signs
    WHERE
    TRIM(acct.acct)="номер_счета" AND
    signs.file-name="acct" AND
    signs.surrogate=TRIM(STRING(acct.acct))
    .

    Так вот этот запрос не отработался за 4 часа, опосля чего был жестоко прерван. Нет, я все уже решил, но кто бы мне объяснил где собака порылась? Отчего именно select такой тормознутый?

    Мозгом я понимаю, что ошибка где-то в ДНК, но где именно?

    И пару слов о себе:
    PROGRESS Version 9.1D09,
    # uname -a
    UnixWare bisq 5 7.1.3 i386 x86at SCO UNIX_SVR5

  • #2
    На нормальном 4GL:

    for first acct where acct.acct = 'string_account_num' no-lock,
    each sign where signs.file-name = 'acct'
    and signs.surrogate = acct.acct + ',' + acct.currency
    no-lock:
    display acct.acct, signs.xattr-value, signs.code-value, signs.code.

    end.

    -----------------------

    Если всё-таки через sql, then:

    SELECT acct.acct, signs.xattr-value, signs.code-value, signs.code
    FROM
    acct, signs
    WHERE
    acct.acct="номер_счета" AND
    signs.file-name="acct" AND
    signs.surrogate=(acct.acct + ',' + acct.currency)
    .

    Комментарий


    • #3
      Я к прогресу запросы через сикюль пишу, иногда аналогичные запросы мне делают программисты на 4gl - на порядок быстрее получается.

      Комментарий


      • #4
        Наверно я не очень точно сформулировал свой вопрос.
        Меня интересует не способ добывания данных, а производительность. То есть, обращаясь к вашему SQL примеру, Andry, за сколько он у вас отработал? У меня ему не хватило 4-х часов. Подозреваю, у меня что-то не в порядке..

        Комментарий


        • #5
          DELPHIN В тексте 4GL программ лучше не использовать SQL конструкции. Не уверен, что в последних версиях прогресса вообще можно использовать SQL.

          Комментарий


          • #6
            Сообщение от DELPHIN Посмотреть сообщение
            Я к прогресу запросы через сикюль пишу, иногда аналогичные запросы мне делают программисты на 4gl - на порядок быстрее получается.
            А с какой скоростью у вас исполняется вот такой вот простой запрос, который приведен у меня в качестве примера, или у Andry, не суть важно что вернет - вопрос за сколько времени?

            Комментарий


            • #7
              mer1in Так, все зависит от объема анализируемых данных и мощностей сервера, т.е количества записей. Если у Вас в acct, signs по 3 записи, то и выполняться будет 5 сек .

              А вообще самые долгие запросы у меня висели по 1,5 часа, при анализе 3-х больших таблиц (одна из них возможно была миллионником, другие десятки - сотни тысяч), условия похожие на ваши,т.е. 3-5 штук.

              Комментарий


              • #8
                Сообщение от Andry Посмотреть сообщение
                В тексте 4GL программ лучше не использовать SQL конструкции. Не уверен, что в последних версиях прогресса вообще можно использовать SQL.
                Я к сожелению не пишу программы на 4GL, запросы к прогресу делаю из Actuate, дизайнер отчетов.

                Комментарий


                • #9
                  mer1in Еще бы. Твой запрос перебирает всё содержимое таблицы acct, не используя индекс по полю acct.acct
                  Зачем пишешь выражение TRIM(acct.acct) для сравнения ?
                  Дальше = signs.surrogate по таблице acct должен содержать acct.acct acct.currenty через запятую.

                  Опять-же - ты хочешь извлечь _все_ Допреквизиты каждого счёта, или только один из них? Если один - указывай signs.code

                  И напоследой - если ты точно знаешь номер счёта, зачем залезать в таблицу acct? сделай
                  select * from signs where signs.file-name = 'acct' and signs surrogate begins 'acct_num'.

                  А этот Actuate куда и через что лезет за данными?

                  Комментарий


                  • #10
                    Дальше = signs.surrogate по таблице acct должен содержать acct.acct acct.currenty через запятую.
                    Я думаю, это самое существенное замечание по представленному запросу.
                    Чем больше связей, тем меньше степеней свободы.

                    Комментарий

                    Пользователи, просматривающие эту тему

                    Свернуть

                    Присутствует 1. Участников: 0, гостей: 1.

                    Обработка...
                    X