Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
select top 1000
[ObjectType] = N'Scv',
[SourceCodeId] = d.[IDOBJ],
[ParameterName] = N'DlitZamera',
[DateTime] = l1.[VALUEDATE],
[Value] = l1.[PERIOD],
[vValue] = NULL, [IsLive] = 1
from tm_mn_c8_kust.[dbo].[Lg] as l1
left join tm_mn_c8_kust.[dbo].[Lg] as l2 on (l1.IDOBJ=l2.IDOBJ and l1.ValueDATE<l2.ValueDATE)
inner join tm_mn_c8_kust.[dbo].[TiiDat] as d on d.IDDAT = l1.IDOBJ
where l1.TYPEOBJ=330 and
l1.IDPAR=15 and
l2.ValueDATE is null
Задание:
Выбрать последнее добавленное значение из таблицы и заджойнить данные из другой таблицы
Решение:
Join таблицы с самой собой по условию l1.ValueDATE<l2.ValueDATE и взять только строки, которые не сростились :)
(Строки 9 и 13)
юзать логику "последнее добавленное значение из таблицы" на таблице с 13.5 млн записей без адекватных рахитектурных решений - ну ок
постройте индекс typeobj, idpar, idobj, valuedate и добавьте в условие джойна все эти колонки, если такой поиск реально нужен постоянно
когда же мне нужна была такая логика, я не обломался выделить специальную "булевую" колонку, в которой стоит true, если эта запись является конечной для своей группы, заиндексироваться вместе с этой колонкой и при инсерте новой записи сделать дополнительный апдейт по предыдущей последней записи
и что не так? это классика
далее уже оптимизатор разруливает задачу плана запроса
можно ещё rank(), если поддерживается субд (судя [по] [этому] кромешному [пиздецу] - поддерживается)
главное, не max() в подзапросе
Юзать "классику" в таблице с 13,5 млн записей? ну, ок...
постройте индекс typeobj, idpar, idobj, valuedate и добавьте в условие джойна все эти колонки, если такой поиск реально нужен постоянно
когда же мне нужна была такая логика, я не обломался выделить специальную "булевую" колонку, в которой стоит true, если эта запись является конечной для своей группы, заиндексироваться вместе с этой колонкой и при инсерте новой записи сделать дополнительный апдейт по предыдущей последней записи
какой вариант получения "последнего значения" я ещё не учел?
наверное, это единственная ошибка?