ОПИСАНИЕ:
Есть две таблицы, без индексов, по 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 с последующими траспозицией ... очень смутно ... не?
Здравствуйте, 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>код строго один и тот же!
Сравнивайте планы запросов. А после этого можно будет делать выводы.
Ну и без самого запроса что-то подсказать
Здравствуйте, 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)
из 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(они вроде бы кэшироваться умеют).
не очень, данные все врем меняются...
Если обе таблицы по очереди вывожу отдельными хранмками тиипа select * from table1
на листы эксель — время работы — 4 сек.
И да 300 тыс. для эксель не проблема. Все очень быстро.
Я уже думаю соединить эти таблицы уже в эксель через олап — модель данных — сводная таблица — это занимает около 2-х минут, в 2 раз быстрее чем в хранимке!
Здравствуйте, paradok, Вы писали:
P>Здравствуйте, vaa, Вы писали:
vaa>>Здравствуйте, paradok, Вы писали:
P>>>проблема точно не в эксель.
vaa>>а в студии хранимка за сколько отрабатывает?
P>10 сек
P>студия на компе разраба с повыш. правами P>Тормозит на компах (логинах) обычных юзеров.
Проверяйте тогда под логином обычного юзера. Воткните логи в хранимку. Точно ли она тормозит.
Здравствуйте, 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)
vaa>уточните, на компах или логинах?
у разраба можно логин а можно к серверу sql и через аутентификацию виндов — работает одинаково быстро.
(но разраб не может залогиниться с юзерскго компа, как-то хитро настроено)
если под логином юзера то везде медленно.
Но именно left join на двух обновляемых таблицах
Есть еще внутри-системные таблицы с индексами и 100-миллионными записями — там left join работает быстро везде.
Ну тут гадать не надо.
Админ sql сервера сказал, что он специально все так настроил по правам групп юзеров,
и менять ничего не будет и как конкретно он это сделал секрета не расскажет.
vaa>просто слабо верится что права влияют так на скорость запроса. не встречал такого.
я тоже, но факт на лицо!
в доках ms sql сервера когда-т попадалось.. что для групп юзеров можно много чего настроить, в том числе лимиты на оперативку, лимиты на врем. табы, на врем жизни скрипта, и тд.
P>в доках ms sql сервера когда-т попадалось.. что для групп юзеров можно много чего настроить, в том числе лимиты на оперативку, лимиты на врем. табы, на врем жизни скрипта, и тд.
ну тогда это не в алгоритмы, это к начальнику — ругаться!
можно конечно и на vb хреначить, но это же не наш метод.
на крайняк может есть коннектор к локальным БД типа sqlite в память грузить и там джоинить.
или в excel прямо там же тоже что-то имеется для объедиения.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[10]: Подскажите алгоритм быстрого left join (ms t-sql)
Здравствуйте, 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
тут нет сканирующего поиска, а только быстра сортировка — должно работать очень быстро.
Здравствуйте, 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. Не знаю как будет по скорости.