Подскажите алгоритм быстрого left join (ms t-sql)
От: paradok  
Дата: 19.05.22 07:32
Оценка:
Приветствую!

ОПИСАНИЕ:
Есть две таблицы, без индексов, по 200..300к записей, таблицы частично обновляются 1 раз 2-3 мин.
делаем left join по id (вы выводим всю результирующую таблицу в csv или excel)
id в обеих таблицах чуток не уникальный, порядка 1..2% дубликатов по id (но не всех полей строк) — принципиально не устранимо (!)
(id не уникальны, но есть метки времени, которые тоже не уникальны, но не коррелированы с id и не коррелированы между таблицами, по ним left join не сделать)

ПРОБЛЕМА:
Из sql studio запрос left join по id выполняется за 3..5 сек, отлично! (с компа разраба, с повыш. правами)
из хранимой процедуры — 5..10 минут! Кошмар ! (с компов обычных юзеров)
код строго один и тот же!

Кажется не хватает юзерам выполняющему вызов хранимой процедуры каких-о прав и ресурсов (памяти например)...
Изменить права нет возможности, я не сисадмин, а он ничего менять не будет, т.к. в сети под 1к компов с разыми правами "агрессивных и хитрых" юзеров
и любое изменение в стабильно работающей системе чревато дырами в безопасности и проблемами с чрезмерной нагрузкой на сервера (по его словам).
(дать процедуре более высокие права, чем вызывающему ее юзеру тоже нельзя — отказ от сисадмина)

ВОПРОС:
Подскажите какие алгоритмы применяются для быстрого left join
и можно ли их как-то имплементировать их (на ms t-sql) с меньшими требованиями по памяти,
но хотя бы укладываться в 10 сек, а не в 5 минут?

P.S. что-то смутно промелькнула мысль про слияние таблиц и сортировку по id с последующими траспозицией ... очень смутно ... не?

----
вот примитивная и очень медленная имплементация со сстэковерфллоу
там есть фраза итерэйт фроф ол валью оф табле
How to implement Left Outer Join in C language
https://stackoverflow.com/questions/28620977/how-to-implement-left-outer-join-in-c-language
Отредактировано 19.05.2022 10:44 paradok . Предыдущая версия . Еще …
Отредактировано 19.05.2022 9:50 paradok . Предыдущая версия .
Отредактировано 19.05.2022 9:11 paradok . Предыдущая версия .
Отредактировано 19.05.2022 7:33 paradok . Предыдущая версия .
Re: Подскажите алгоритм быстрого left join (ms t-sql)
От: BlackEric http://black-eric.lj.ru
Дата: 19.05.22 08:15
Оценка:
Здравствуйте, paradok, Вы писали:

P>ОПИСАНИЕ:

P>Есть две таблицы, без индексов, по 200..300к записей, таблицы частично обновляются 1 раз 2-3 мин.
P>делаем left join по id (вы выводим всю результирующую таблицу в csv или excel)
P>id в обеих таблицах чуток не уникальный, порядка 1..2% дубликатов по id (но не всех полей строк) — принципиально не устранимо (!)
P>(id не уникальны, но есть метки времени, которые тоже не уникальны, но не коррелированы с id и не коррелированы между таблицами, по ним left join не сделать)

P>ПРОБЛЕМА:

P>Из sql studio запрос left join по id выполняется за 3..5 сек, отлично!
P>из хранимой процедуры — 5..10 минут! Кошмар !
P>код строго один и тот же!


Сравнивайте планы запросов. А после этого можно будет делать выводы.
Ну и без самого запроса что-то подсказать
https://github.com/BlackEric001
Re: Подскажите алгоритм быстрого left join (ms t-sql)
От: vaa  
Дата: 19.05.22 08:27
Оценка: +1
Здравствуйте, paradok, Вы писали:

P>ПРОБЛЕМА:

P>Из sql studio запрос left join по id выполняется за 3..5 сек, отлично!
P>из хранимой процедуры — 5..10 минут! Кошмар !
P>код строго один и тот же!

А где хранимка выполняется?
в студии вы фетчите первые 1000 записей, а прога клиента может все засасывать на локалку и еще потом
обрабатывать как-то хитро отсюда и дополнительные 10 минут.
включите профайлер и посмотрите есть ли действительно разница в скорости запросов.
скорее всего нет.
могу посоветовать добавить индексы на поля которые id или сделать из запроса view(они вроде бы кэшироваться умеют).
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Подскажите алгоритм быстрого left join (ms t-sql)
От: paradok  
Дата: 19.05.22 08:46
Оценка:
Здравствуйте, vaa, Вы писали:


vaa>А где хранимка выполняется?


из excel как exec имя_процедуры

vaa>в студии вы фетчите первые 1000 записей,


там можно все 300к вывести, необязательно первые 1000
я вывожу все 300к и сохраняют в файл csv или xls
на скорость это не влияет, все равно 3..5 сек, очень быстро.

> а прога клиента может все засасывать на локалку и еще потом

vaa>обрабатывать как-то хитро отсюда и дополнительные 10 минут.

нет, вся прога это exec имя_процедуры

внутри

select * from tabl1 left join tabl2 on table1.id = table2.id


vaa> могу посоветовать добавить индексы на поля которые id


попробую, но таблицы все время обновляются...
можете примерно сказать время создания индекса?

>>или сделать из запроса view(они вроде бы кэшироваться умеют).

не очень, данные все врем меняются...
Отредактировано 19.05.2022 8:49 paradok . Предыдущая версия .
Re[2]: Подскажите алгоритм быстрого left join (ms t-sql)
От: paradok  
Дата: 19.05.22 08:47
Оценка:
Здравствуйте, BlackEric, Вы писали:


BE>Ну и без самого запроса что-то подсказать


select * from table1 left join table2 on table1.id = table2.id
Re[3]: Подскажите алгоритм быстрого left join (ms t-sql)
От: vaa  
Дата: 19.05.22 08:48
Оценка:
Здравствуйте, paradok, Вы писали:

P>Здравствуйте, vaa, Вы писали:



vaa>>А где хранимка выполняется?


P>из excel как exce имя_процедуры


все понятно, отключите на время работы процедуры пересчет ячеек:
https://stackoverflow.com/questions/37591804/how-to-stop-automatic-recalculation-in-excel

With ActiveSheet
  .EnableCalculation = False
  .EnableCalculation = True
  .Calculate
End With
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 19.05.2022 8:50 Разраб . Предыдущая версия .
Re[4]: Подскажите алгоритм быстрого left join (ms t-sql)
От: paradok  
Дата: 19.05.22 08:54
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, paradok, Вы писали:


P>>Здравствуйте, vaa, Вы писали:



vaa>>>А где хранимка выполняется?


P>>из excel как exce имя_процедуры


vaa>все понятно, отключите на время работы процедуры пересчет ячеек:

vaa>https://stackoverflow.com/questions/37591804/how-to-stop-automatic-recalculation-in-excel

все отключено!

Если обе таблицы по очереди вывожу отдельными хранмками тиипа select * from table1
на листы эксель — время работы — 4 сек.
И да 300 тыс. для эксель не проблема. Все очень быстро.

Я уже думаю соединить эти таблицы уже в эксель через олап — модель данных — сводная таблица — это занимает около 2-х минут, в 2 раз быстрее чем в хранимке!

проблема точно не в эксель.
Отредактировано 19.05.2022 8:55 paradok . Предыдущая версия .
Re[5]: Подскажите алгоритм быстрого left join (ms t-sql)
От: BlackEric http://black-eric.lj.ru
Дата: 19.05.22 08:55
Оценка:
Здравствуйте, paradok, Вы писали:

P>проблема точно не в эксель.


Тогда сравнивайте планы запросов
https://github.com/BlackEric001
Re[6]: Подскажите алгоритм быстрого left join (ms t-sql)
От: paradok  
Дата: 19.05.22 08:59
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, paradok, Вы писали:


P>>проблема точно не в эксель.


BE>Тогда сравнивайте планы запросов


нет доступа, это высоко нагруженная система с тысячами юзеров
— админ жесток, ничего не дает.

да и какой там план ?!
select * from table1 left join table2 on table1.id = table2.id
это полный реальный запрос.
Re[5]: Подскажите алгоритм быстрого left join (ms t-sql)
От: vaa  
Дата: 19.05.22 08:59
Оценка:
Здравствуйте, paradok, Вы писали:


P>проблема точно не в эксель.


а в студии хранимка за сколько отрабатывает?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[6]: Подскажите алгоритм быстрого left join (ms t-sql)
От: paradok  
Дата: 19.05.22 09:00
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, paradok, Вы писали:



P>>проблема точно не в эксель.


vaa>а в студии хранимка за сколько отрабатывает?


10 сек

студия на компе разраба с повыш. правами
Тормозит на компах (логинах) обычных юзеров.
Отредактировано 19.05.2022 9:01 paradok . Предыдущая версия .
Re[7]: Подскажите алгоритм быстрого left join (ms t-sql)
От: BlackEric http://black-eric.lj.ru
Дата: 19.05.22 09:12
Оценка:
Здравствуйте, paradok, Вы писали:

P>Здравствуйте, vaa, Вы писали:


vaa>>Здравствуйте, paradok, Вы писали:



P>>>проблема точно не в эксель.


vaa>>а в студии хранимка за сколько отрабатывает?


P>10 сек


P>студия на компе разраба с повыш. правами

P>Тормозит на компах (логинах) обычных юзеров.


Проверяйте тогда под логином обычного юзера. Воткните логи в хранимку. Точно ли она тормозит.
https://github.com/BlackEric001
Re[7]: Подскажите алгоритм быстрого left join (ms t-sql)
От: vaa  
Дата: 19.05.22 09:12
Оценка:
Здравствуйте, paradok, Вы писали:

P>Здравствуйте, vaa, Вы писали:


vaa>>Здравствуйте, paradok, Вы писали:



P>>>проблема точно не в эксель.


vaa>>а в студии хранимка за сколько отрабатывает?


P>10 сек


P>студия на компе разраба с повыш. правами

P>Тормозит на компах (логинах) обычных юзеров.
уточните, на компах или логинах?
1) создайте sql-пользователя с правами юзера и проверьте на пк разраба, аналогичным образом.

2) в студии есть Sql profiler там есть профили T-SQL запустить на базе(Фильтр по имени)
и посмотрите действительно ли он 10 минут выполняется.

просто слабо верится что права влияют так на скорость запроса. не встречал такого.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[6]: Подскажите алгоритм быстрого left join (ms t-sql)
От: paradok  
Дата: 19.05.22 09:13
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, paradok, Вы писали:



P>>проблема точно не в эксель.


vaa>а в студии хранимка за сколько отрабатывает?


организационными мерами решить не удается, админ посылает на 3 русских буквы

потому и спрашиваю про алгоритмы !

как вообще скажем на С++ или C# сделать аналог лефт джойн двух 2-х мерных таблиц ?
Отредактировано 19.05.2022 9:35 paradok . Предыдущая версия .
Re[8]: Подскажите алгоритм быстрого left join (ms t-sql)
От: paradok  
Дата: 19.05.22 09:18
Оценка:
Здравствуйте, BlackEric, Вы писали:


BE>Проверяйте тогда под логином обычного юзера. Воткните логи в хранимку. Точно ли она тормозит.


точно она, и точно что только под ограниченным юзером.
проверено
select getdate() as Time_of_Start;
exec процедура;
select getdate() as Time_of_End;

проверил — процедура всегда вызывается с правами вызвавшего его юзера
потому на разрабовском компе все летает, а у юзеров тормозит.
Re[8]: Подскажите алгоритм быстрого left join (ms t-sql)
От: paradok  
Дата: 19.05.22 09:26
Оценка:
Здравствуйте, vaa, Вы писали:


vaa>уточните, на компах или логинах?

у разраба можно логин а можно к серверу sql и через аутентификацию виндов — работает одинаково быстро.
(но разраб не может залогиниться с юзерскго компа, как-то хитро настроено)

если под логином юзера то везде медленно.
Но именно left join на двух обновляемых таблицах
Есть еще внутри-системные таблицы с индексами и 100-миллионными записями — там left join работает быстро везде.

Ну тут гадать не надо.
Админ sql сервера сказал, что он специально все так настроил по правам групп юзеров,
и менять ничего не будет и как конкретно он это сделал секрета не расскажет.

vaa>просто слабо верится что права влияют так на скорость запроса. не встречал такого.

я тоже, но факт на лицо!

в доках ms sql сервера когда-т попадалось.. что для групп юзеров можно много чего настроить, в том числе лимиты на оперативку, лимиты на врем. табы, на врем жизни скрипта, и тд.
Отредактировано 19.05.2022 9:39 paradok . Предыдущая версия . Еще …
Отредактировано 19.05.2022 9:30 paradok . Предыдущая версия .
Re[9]: Подскажите алгоритм быстрого left join (ms t-sql)
От: vaa  
Дата: 19.05.22 09:54
Оценка: 18 (1)
Здравствуйте, paradok, Вы писали:


P>в доках ms sql сервера когда-т попадалось.. что для групп юзеров можно много чего настроить, в том числе лимиты на оперативку, лимиты на врем. табы, на врем жизни скрипта, и тд.


ну тогда это не в алгоритмы, это к начальнику — ругаться!
можно конечно и на vb хреначить, но это же не наш метод.
на крайняк может есть коннектор к локальным БД типа sqlite в память грузить и там джоинить.
или в excel прямо там же тоже что-то имеется для объедиения.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[10]: Подскажите алгоритм быстрого left join (ms t-sql)
От: paradok  
Дата: 19.05.22 10:04
Оценка:
Здравствуйте, vaa, Вы писали:

vaa>Здравствуйте, paradok, Вы писали:



P>>в доках ms sql сервера когда-т попадалось.. что для групп юзеров можно много чего настроить, в том числе лимиты на оперативку, лимиты на врем. табы, на врем жизни скрипта, и тд.


vaa>ну тогда это не в алгоритмы, это к начальнику — ругаться!

vaa>можно конечно и на vb хреначить, но это же не наш метод.
vaa>на крайняк может есть коннектор к локальным БД типа sqlite в память грузить и там джоинить.
vaa>или в excel прямо там же тоже что-то имеется для объедиения.

в excel можно
1) функция ВПР() но она еще медленнее
2) можно через olap -> модель данных -> язык olap запросов MDX -> сводная таблица, но это для меня пока сложновато — это целый отдельный мир непохожий на sql

я думал кто-то подскажет как вообще на уровне кода на C# делается аналог лефт джойна на многомерных массивах чисел
мысль было что как-то через объединение массивов и быструю сортировку по id (на быстрых алгоритмах сортировки)

типа где-то вот так... примерно...

пусть есть два массива чисел (id)
сделать left join можно было бы
дописав второй массив в конец первому
затем сортировку по id
далее транспонирование по повторяющимся id
получаем двух мерную таблицу — аналог left join
тут нет сканирующего поиска, а только быстра сортировка — должно работать очень быстро.
Отредактировано 19.05.2022 10:13 paradok . Предыдущая версия . Еще …
Отредактировано 19.05.2022 10:11 paradok . Предыдущая версия .
Re[11]: Подскажите алгоритм быстрого left join (ms t-sql)
От: BlackEric http://black-eric.lj.ru
Дата: 19.05.22 10:16
Оценка:
Здравствуйте, paradok, Вы писали:

P>Здравствуйте, vaa, Вы писали:


vaa>>Здравствуйте, paradok, Вы писали:



P>>>в доках ms sql сервера когда-т попадалось.. что для групп юзеров можно много чего настроить, в том числе лимиты на оперативку, лимиты на врем. табы, на врем жизни скрипта, и тд.


vaa>>ну тогда это не в алгоритмы, это к начальнику — ругаться!

vaa>>можно конечно и на vb хреначить, но это же не наш метод.
vaa>>на крайняк может есть коннектор к локальным БД типа sqlite в память грузить и там джоинить.
vaa>>или в excel прямо там же тоже что-то имеется для объедиения.

P>в excel можно

P>1) функция ВПР() но она еще медленнее
P>2) можно через olap -> модель данных -> язык olap запросов MDX -> сводная таблица, но это для меня пока сложновато — это целый отдельный мир непохожий на sql

P>я думал кто-то подскажет как вообще на уровне кода на C# делается аналог лефт джойна на многомерных массивах чисел

P>мысль было что как-то через объединение массивов и быструю сортировку по id (на быстрых алгоритмах сортировки)

Можно сделать join с помощью linq. Не знаю как будет по скорости.

Join two tables using LINQ Query and order based two parameters
https://github.com/BlackEric001
Re[12]: Подскажите алгоритм быстрого left join (ms t-sql)
От: paradok  
Дата: 19.05.22 10:20
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Можно сделать join с помощью linq. Не знаю как будет по скорости.

BE>Join two tables using LINQ Query and order based two parameters

попробую!, но скорее всего оно все равно транслируетсz в sql left join и отправляется на сервер.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.