• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы jcolor
  • Дата начала
J

jcolor

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

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

Barmutik

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

jcolor

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

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

Barmutik

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

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

jcolor

запрос по себе совсем не навороченный:
Код:
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 обычное и по нему построен индекс.
 
J

jcolor

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

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

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


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

Barmutik

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

Barmutik

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

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

jcolor

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

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

Код:
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
 
B

Barmutik

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

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

jcolor

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

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

да, в этой таблице есть еще 10 полей - просто если в первом запросе вывести только два поля - то ничего не изменится все равно,
Код:
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'
и объединение таблиц только по двум полям - остальные вообще не участвуют -- или все таки это может тормозить запрос?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!