Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Проблема с update с left join  [new]
dmitry1000
Member

Откуда:
Сообщений: 100
Здравствуйте.

При некотором добавлении данных в таблицы (не более 10%) появилась проблема при update этой таблицы.

Имеется запрос вида:

update t
set x = coalesce(a.a, b.a, c.a, 0)
from table t 
left join (select top 1 with ties a, b, c from table1 order by ROW_NUMBER() OVER(Partition by a order by b desc, c desc) a
on <условие1>
left join (select top 1 with ties a, b, c from table1 order by ROW_NUMBER() OVER(Partition by a order by b desc, c desc) b
on <условие2>
left join (select top 1 with ties a, b, c from table1 order by ROW_NUMBER() OVER(Partition by a order by b desc, c desc) c
on <условие3>


Запрос зависает на неопределенное время.
Эту задачу я решил, когда занес результаты подзапросов в темповые таблицы, а потом проапдейтил отдельно с каждой темповой таблицей. Но это типовой код и мне нужно знать, что нужно сделать, чтобы этого не повторилось.
План запроса посмотрел, но ничего подозрительного не обнаружил. Хотя я в этом не сильно разбираюсь.

Как обнаружить проблему?
6 ноя 16, 11:28    [19862246]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
aleks2
Guest
Типовой говнокод?

1. Чаво тут гении программирования предполагают, рисуя with ties?
from table t 
left join (select top 1 with ties a, b, c from table1 order by ROW_NUMBER() OVER(Partition by a order by b desc, c desc) a
on <условие1>


Оне предполагают более 1 строки на одну строку таблицы table?
Уроды.

2. Гюльчатай, открой личико!
on <условие1>
6 ноя 16, 12:12    [19862305]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
Сид
Member

Откуда: Москва
Сообщений: 305
dmitry1000,

Подумайте ещё раз и полностью перепишите запрос. Если это действительно типовой код, глубоко сочувствую. Лучше перенаправьте эту задачку разработчику, который на "ты" с MS SQL.
6 ноя 16, 15:10    [19862530]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
dmitry1000
Member

Откуда:
Сообщений: 100
Сид, спасибо Кэп.

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

Дайте хотя бы гипотезы, что это может быть, я сам покопаю.
6 ноя 16, 15:48    [19862573]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
dmitry1000,

как автор этого запроса хотя бы в нескольких словах расскажите, зачем такой запрос нужен.
Почему один и тот же подзапрос приджойнивается три раза с разными условиями?
6 ноя 16, 16:39    [19862638]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
dmitry1000
Member

Откуда:
Сообщений: 100
iap,

Ну как известно, фантазия пользователя не имеет границ, и это один из случаев.
Ну предположим такую задачу - две таблицы сравниваются по текстовому полю и нужно связать пару записей, в которых совпадает с начала строки максимальное количество символов. Например, сначала нужно увидеть сколько совпадает строк по первым 5-ти символам, потом по 6-ти, потом по 7-ми. Это упрощенное условие, возможно добавление дополнительных условий, но для понимания должно быть достаточно.
6 ноя 16, 17:24    [19862705]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Строка в t будет апдейтиться несколько раз.
Согласно документации результат такого апдейта будет неопределён.
Вся идея какая-то кривая.
6 ноя 16, 17:31    [19862712]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
aleks2
Guest
dmitry1000
Дайте хотя бы гипотезы, что это может быть, я сам покопаю.


Дарагой наш "разработчик", это
select top 1 with ties a, b, c from table1 order by ROW_NUMBER() OVER(Partition by a order by b desc, c desc)

читает ВСЮ таблицу и выполняет ГРУППИРОВКУ каждый раз, когда выполняется.

При некотором росте размеров таблицы, это неиллюзорный тормоз.
А у тя - три тормоза.
7 ноя 16, 06:01    [19863929]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Нельзя, что ли, во временную таблицу выбрать промежуточный результат? Что за навороты?
7 ноя 16, 10:47    [19864591]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
dmitry1000
Member

Откуда:
Сообщений: 100
Владислав Колосов,

В конечном итоге я так и сделал. Но пришлось делать отдельные update с inner join.
В случае подключения одновременно хотя бы двух временных таблиц, запрос опять "сваливался" в неизвестное время выполнения.
Такое впечатление, что эти таблицы друг друга зацикливают.
8 ноя 16, 18:34    [19871808]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
dmitry1000,

в таком случае Ваш запрос отличается от того, что показано в первом сообщении.
Таблетки, которая лечит любую болезнь, не существует.
9 ноя 16, 12:40    [19874229]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
dmitry1000
Member

Откуда:
Сообщений: 100
Владислав Колосов,

Ничего особо не поменяется, будет примерно так (для 2-х условий)
select top 1 with ties a, b, c from table1
	INTO #temp_1
	from table1
      order by ROW_NUMBER() OVER(Partition by a order by b desc, c desc

select top 1 with ties a, b, c from table1
	INTO #temp_2
	from table1
      order by ROW_NUMBER() OVER(Partition by a, c order by b, c desc, c desc

update t
set x = coalesce(a.a, b.a, 0)
from table t 
left join  #table_1 a
on <условие1>
left join  #table_2 b
on <условие2>


Я хочу напомнить, это не реальный пример, а переработанный, но принцип остается таким же.
Все равно этот запрос не выполняется. Мне нужны гипотезы и желательно методы для проверки этих гипотез.
Пока у меня есть гипотеза, что запрос как-то зацикливает апдейт записей. Но как это проверить? Как найти проблему.
11 ноя 16, 01:16    [19881449]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
aleks2
Guest
dmitry1000
Пока у меня есть гипотеза, что запрос как-то зацикливает апдейт записей. Но как это проверить? Как найти проблему.

Бред.
Проблемы не в сортире - проблемы в голове.

PS. Дурацкий запрос сервер и выполняет по-дурацки. Кесарю - кесарево.
11 ноя 16, 06:08    [19881500]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с update с left join  [new]
aleks2
Guest
ЗЗЫ. Ты, страдалец, замени UPDATE на SELECT, посмотри чего перелопачивает твой сервер и удавись. (в последнем слове ошибки нет)
11 ноя 16, 06:11    [19881502]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить