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

Откуда:
Сообщений: 15
Всем добрый день.

Есть большая таблица из которой в визуализацию (типа дашборда) вытаскиваются около 20 показателей. По сути это 20 маленьких запросов типа таких:

SELECT И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Контрагент AS Контрагент,
SUM(И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Сумма) AS Сумма_SUM
FROM И_0c0d3b63_12b1_4d13_a603_8994723e47fe_5bd0f485_6a87_4b5b_9ca4_6bc0fae48b59_v2 AS И_0c0d3b63_12b1_4d13_a603_8994723e47fe
 WHERE (И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Номенклатура = 'Номенклатура.3a6b0749-9cd9-11e5-8a2f-005056c00008                                                                                                     ')
 GROUP BY И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Контрагент




SELECT И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Год AS Год
FROM И_0c0d3b63_12b1_4d13_a603_8994723e47fe_5bd0f485_6a87_4b5b_9ca4_6bc0fae48b59_v2 AS И_0c0d3b63_12b1_4d13_a603_8994723e47fe
 WHERE (И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Номенклатура = 'Номенклатура.3a6b0749-9cd9-11e5-8a2f-005056c00008                                                                                                     ')
 GROUP BY И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Год



SELECT И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Месяц AS Месяц
FROM И_0c0d3b63_12b1_4d13_a603_8994723e47fe_5bd0f485_6a87_4b5b_9ca4_6bc0fae48b59_v2 AS И_0c0d3b63_12b1_4d13_a603_8994723e47fe
 WHERE (И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Номенклатура = 'Номенклатура.3a6b0749-9cd9-11e5-8a2f-005056c00008                                                                                                     ')
 GROUP BY И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Месяц



Особенность в том что у них у всех одинаковый отбор. Т.е. юзер выбрал что то (наложил отбор) - все 20 визуализаций пересчитываются с учетом этого отбора.

клиент работает с ms sql через ADODB и на текущий момент это около 10 секунд (по 0.5 на каждую визуализацию).

Хотелось бы ускорить. прошу совета в какую сторону искать.

Пробовал:
1. разбить на несколько потоков выполнение этих запросиков - работает не понятно, то быстрее, то сервер "зависает" на догое время
2. выбрать сначала из большой таблицы данные во временную с учетом отбора и затем уже делать эти 20 запросов к этой временной. выигрыша по времени не дало.
23 июл 19, 16:47    [21932914]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
PizzaPizza
Member

Откуда:
Сообщений: 309
seperblunt

 WHERE (И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Номенклатура = 'Номенклатура.3a6b0749-9cd9-11e5-8a2f-005056c00008                                                                                                     ')
 GROUP BY И_0c0d3b63_12b1_4d13_a603_8994723e47fe.Год



[sarcasm]Очень приятно с рандомом разбираться....[/sarcasm]

Как минимум вам никто не запрещает объединить все эти запросы с помощью СТЕ/подзапросов. Там сервер сам разберется, нужно ли ему сканировать 20 раз вашу таблицу И_0c0d3b63_12b1_4d13_a603_8994723e47fe_5bd0f485_6a87_4b5b_9ca4_6bc0fae48b59_v2 AS И_0c0d3b63_12b1_4d13_a603_8994723e47fe

типа

with И_0c0d3b63_12b1_4d13_a603_8994723e47fe_5bd0f485_6a87_4b5b_9ca4_6bc0fae48b59_v_0c0d3b63_12b1_4d13_a603_8994723e47fe3_a603_8994723e47fe as a
(
SELECT что то там FROM b Where Номенклатура = Номенклатура
)

Select GROUP BY 
Select GROUP BY 
Select GROUP BY 
23 июл 19, 18:11    [21932968]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
Владислав Колосов
Member

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

Одновременное выполнение будет зависеть от количества незадействованных ядер на момент выполнения запросов. Если каждый запрос распараллелится, то это тоже надо учитывать.

Кроме того, Вы номенклатурами заставляете формировать новый план для каждой номенклатуры, помещать его в кеш и так далее. Тоже накладные расходы. Поможет или план выполнения запросов, или, радикально, настроить для базы принудительное прослушивание, но это может иметь последствия.

Могут помочь колоночные индексы, поскольку используется группировка. Также оптимизация tempdb.
23 июл 19, 18:18    [21932977]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
vikkiv
Member

Откуда: London
Сообщений: 2622
зависит от того где появится новое узкое горло в системе,
т.к. агрегация видна только в первом запросе то месяц и год похоже вообще
можно забрать без напряга если проиндексировано нормально (как уже указали выше)
или даже одним запросом а потом на клиенте разбить distinct из каждой колонны
(или получать вместе: год-месяц а потом бить на части)
или вообще вытащить грануляцию клиент/месяц/год - и всё на клиенте/приложении/сервисе
(SSRS/PowerBI/Excel/Access и т.д.) разделять если resultset не тяжелый..
или как советуют выше - получать несколько resultset-ов если клиент позволяет (а это не все)
т.е. зависит от возможностей приложения и прочих факторов (напр. вес разных комбинаций результата).

в общем балансировать к оптимальности в зависимости от нюансов
(которые читателям пока неизвестны)
так-то вариантов ещё несколько можно сгенерировать до кучи.
23 июл 19, 18:51    [21933015]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
seperblunt,

Индексы есть? Планы смотрели?
23 июл 19, 23:34    [21933173]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
uaggster
Member

Откуда:
Сообщений: 767
А насколько быстро устаревают данные?
Может быть, проще сразу пересчитать все возможные варианты вывода (каждый час, при старте системы, раз в N минут), а пользователю выдавать данные из кэша?
Ну, или, например, сформировать некий долгоживущий полуагрегированный кэш, и данные таскать уже из него.

Пользователь большую часть времени - ничего не делает. Пока он ничего не делает - можно пересчитывать устаревшие варианты из списка выбора. Можно даже не для всех это делать, а для тех данных, для которых можно. Данные наверняка полустатичны.
24 июл 19, 09:59    [21933256]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
для дашборда, если только читаете из этой таблицы, может имеет смысл сделать нормальную таблицу с нужными индексами и человеческими названиями полей. заполняйте эту таблицу по мере добавления данных в основную (триггер, репликация, джоб и тд и тп) и пусть ваш клиент с ненагруженной оптимизированной для чтений таблицей работает
24 июл 19, 10:09    [21933264]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
Что вам мешает использовать короткие алиасы?
Если есть открывающая скобка, то должна где-то быть закрывающая? Где закрывающая кавычка у строки?
Ерунда, мелочь, да?
24 июл 19, 10:26    [21933278]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
seperblunt
Member

Откуда:
Сообщений: 15
iap, переместите горизонтальный скролл вправо - и там все будет
25 июл 19, 10:36    [21934091]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
seperblunt
Member

Откуда:
Сообщений: 15
vikkiv
или как советуют выше - получать несколько resultset-ов если клиент позволяет (а это не все).


можно пжл подробнее? Клиент у меня 1С. подключаюсь к серверу через Adodb.connection.


Поставил PowerBI - засосал в него туже табличцу, настроил такие же визуализации - и стал смотреть через профайлер что будет делать при отборах - так вот он в принципе делает теже самые простые запросы, только распараллельвает их по 2 и более, в зависимости от кол-ва ядер (видимо?(
25 июл 19, 12:40    [21934246]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
iiyama
Member

Откуда:
Сообщений: 642
seperblunt,
Если Вы поставили PowerBi, то зачем делаете 20 запросов к одной и той же таблице и по одной и той же номенклатуре ?
Получите данные из таблицы и агрегируете в нужных Вам изменениях в PowerBI
25 июл 19, 13:06    [21934283]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
L_argo
Member

Откуда:
Сообщений: 1137
Кто-то ярко постебался с такими именами объектов.

Я бы отказался работать с такой БД.
25 июл 19, 14:52    [21934427]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
seperblunt
Member

Откуда:
Сообщений: 15
[quot L_argo]Кто-то ярко постебался с такими именами объектов.

это все генериться на лету автоматом, в т.ч. и создаются таблицы, поэтому имена имеют гуид
25 июл 19, 16:02    [21934560]     Ответить | Цитировать Сообщить модератору
 Re: Ускорить 20 однотипных запросов к одному источнику  [new]
vikkiv
Member

Откуда: London
Сообщений: 2622
seperblunt
можно пжл подробнее? Клиент у меня 1С. подключаюсь к серверу через Adodb.connection.


как обеспечить выборку из основной таблицы за один проход уже советовали выше
(хоть из временной через # или @) в зависимости от объёмов
там-же и кэширование срабатывает..
получить несколько resultset по быстрому (без проверок/валидаций) в ADO можно например так: C#
using System;using ADO=System.Data.SqlClient;
class Test{static void Main(){
            string sv="Data Source=my_SQL_Server;Integrated Security=true";
            string qr="select top 5 name,column_id from sys.all_columns;select @@version as x";
            using (ADO.SqlConnection s=new ADO.SqlConnection(sv))
            {   ADO.SqlCommand c=new ADO.SqlCommand(qr,s);s.Open();
                ADO.SqlDataReader d=c.ExecuteReader();Console.WriteLine(s.State);
                Console.WriteLine("                   First result");
                while(d.Read()){Console.WriteLine("{0} {1}",d[1],d[0]);}
                d.NextResult();Console.WriteLine("                  Second result");
                while (d.Read()){Console.WriteLine(d[0]);}
                d.Close();s.Close();Console.ReadKey();}}}
или в PowerShell
using assembly System.Data;using namespace System.Data.SqlClient
$sv="Data Source=my_SQL_Server;Integrated Security=true";
$qr="select top 5 name,column_id from sys.all_columns;select @@version as x";
cls;$s=new-object SqlConnection($sv);$s.Open()
$c=new-object SQLCommand($qr,$s);$d=$c.ExecuteReader()
Write-host "        First Result" -BackgroundColor DarkGreen
while($d.Read()){write-host $d.GetValue(1) $d.GetValue(0)}
$d.NextResult();Write-host "        Second Result" -BackgroundColor DarkGreen
while($d.Read()){write-host $d.GetValue(0)};$d.Close();$s.Close();
Remove-Variable * -ea 0;$error.clear()
25 июл 19, 18:44    [21934715]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить