вычисляемые поля

Тема в разделе "SQL", создана пользователем jcolor, 28 апр 2007.

  1. jcolor

    jcolor Гость

    Всем, привет:rolleyes:
    Столкнулась со следующей проблемой:
    необходимо связать между собой две таблицы по вычисляемому полю - записей в таблицах больше миллиона и запрос выполняется очень долго:(

    Что можно сделать для ускорения отрабатывания запроса?
    Работаю в MS SQL 2005
     
  2. Barmutik

    Barmutik Гость

    Как вариант попытаться избавиться от вычисляемого поля.. хранить его значение в поле записи и обновлять по мере изменения любого из полей которые Вы сейчас используете в рассчётах..
     
  3. jcolor

    jcolor Гость

    А есть еще какие-то варианты??
    Может какие-то параметры в вычисляемых полях?

    Так чтобы не затрагивать процедуры заполнения таблиц?
     
  4. Barmutik

    Barmutik Гость

    Как вариант сначла аналогать все критери отбора что бы максимально минизировать курсор и только потмо проводить связку по вычислимому полю .. но совет риторический я думаю что вы и так уже так делаете .. ну или оптимизатор запросов за Вас так делает :) Хотя у MS оптимизатор местами меня очень прикалывал своими оптимизационными штучками...

    А Вы вообще execution plan смотрели ? Какая операция занимает больше всего времени ?
     
  5. jcolor

    jcolor Гость

    запрос по себе совсем не навороченный:
    Код (Text):
    SELECT * FROM STAT.tb_hit AS hit
    JOIN STAT.tb_resource AS res ON hit.resource_id=res.resource_id
    JOIN PT.tb_document AS doc ON res.dcm_identifier=doc.dcm_identifier
    WHERE hit.hitdate>='2007-03-01' AND hit.hitdate<='2007-03-02'
    связь таблиц tb_resource и tb_document осуществляется по полю dcm_identifier,
    в таблице tb_resource это поле вычисляемое (индекс по нему построить нельзя - недетерминированное),
    а в таблице tb_document поле dcm_identifier обычное и по нему построен индекс.
     
  6. jcolor

    jcolor Гость

    поле изменить нельзя (расчитывается на основе нескольких полей), и соответственно индекс не построить.

    ограничения условий в запросе по выбору данных - ничего не дают :rolleyes:
    выбор просто двух записей осуществляется 2 минуты:(

    Execution plan dslftn 70 % на сканирование таблицы PT.tb_document


    Пока переписала запросы с использованием временных таблиц - так все работает нормально
     
  7. Barmutik

    Barmutik Гость

    Чт переписывание на испоьлзование временных таблиц дало значительное улучшение ?
     
  8. jcolor

    jcolor Гость

    да, с временными таблицами получилось - и быстродействие хорошее
     
  9. Barmutik

    Barmutik Гость

    Хммм.. интересно мне стало .. и во сколько раз увеличилась производительность ?

    Покажите код запроса .. как он стал сейчас ...
     
  10. jcolor

    jcolor Гость

    результат первого запроса я так и не дождалась даже через 20 минут :rolleyes:

    а новый запрос через временную таблицу выдает результ где-то 30 000 записей через 20 секунд
    (сначала во временную таблицу вносится 80 000 записей, после объединения с tb_document = результат 30 000 записей)
    вот изменения:

    Код (Text):
    DECLARE @T1 TABLE(resource_id INT, dcm_identifier CHAR(12))

    INSERT INTO @T1 (resource_id, dcm_identifier)
    SELECT hit.resource_id, res.dcm_identifier FROM Stat.tb_hit AS hit
    JOIN Stat.tb_resource AS res ON hit.resource_id=res.resource_id
    WHERE hit.hitdate>='2007-03-01' AND hit.hitdate<='2007-03-02'


    SELECT * FROM @T1 AS t1
    JOIN PT.tb_document AS doc ON t1.dcm_identifier=doc.dcm_identifier
     
  11. Barmutik

    Barmutik Гость

    Хммм.. странно как-то .. честно .. по мне так должно было стать меделннее .. на ваших то объёмах ...

    Аааа.. tb_hit имеет много полей дополниельно в структуре таблицы? Сдаётся тут дело не в связывании по вычисляемому полю ...
     
  12. jcolor

    jcolor Гость

    да, в этой таблице есть еще 10 полей - просто если в первом запросе вывести только два поля - то ничего не изменится все равно,
    Код (Text):
    SELECT hit.resource_id, res.dcm_identifier FROM STAT.tb_hit AS hit
    JOIN STAT.tb_resource AS res ON hit.resource_id=res.resource_id
    JOIN PT.tb_document AS doc ON res.dcm_identifier=doc.dcm_identifier
    WHERE hit.hitdate>='2007-03-01' AND hit.hitdate<='2007-03-02'
    и объединение таблиц только по двум полям - остальные вообще не участвуют -- или все таки это может тормозить запрос?
     
Загрузка...

Поделиться этой страницей