powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Ускорение запроса, который переводит строки в столбцы.
6 сообщений из 6, страница 1 из 1
Ускорение запроса, который переводит строки в столбцы.
    #38827819
есть 3 таблицы:
1. R_Register (id int (PK), date_register datetime)
2. S_Component(id int (PK), name varchar(100), caption varchar(100), type_value int)
3. R_Value(id int(PK), registerID(FK), componentID(FK),value varchar(512))
Нужно получить в виде столбцов порядка 100 значений из таблицы R_Value, по именам из таблицы S_Component, для записи из таблицы R_Register
При извлечении большого кол-ва записей, время выполнения запроса настолько большое, что происходит отвал, по таймауту.
Я пробовал сделать 1 запроса с объединением в виде join, получил, блокировки таблицы S_Component при вводе данных.
Сделал View, c использованием вложенных select, и использованием для получения значений по имени функцией, получил уменьшение времени выполнения на 10%. Когда пришлось усложнить функцию для преобразования значения в зависимости от типа, то view упала, слишком сложный запрос.
...
Рейтинг: 0 / 0
Ускорение запроса, который переводит строки в столбцы.
    #38828471
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чикуров В.В.,

Вы хоть на примере покажите, что вам надо получтить, какие запросы вы делаете для этого...
...
Рейтинг: 0 / 0
Ускорение запроса, который переводит строки в столбцы.
    #38834322
Mark Barinstein,

Вариант 1:
select r.ID
,(select v.VALUE from R_VALUE as v where v.ID_Reg = r.ID and v.ID_COMPONENT = (select c.ID from S_COMPONENT as c where c.NAME like 'nomReg')) as nomReg -- таких запросов около 100
from R_REGISTER as r
where r.DATE_REGISTER between '01.01'2014' and '31.12/2014'
Вариант 2:
select r.ID
,getValue_component(r.id, 'nomReg') as nomeg -- таких вызовов около 100
from R_REGISTER as r
where r.DATE_REGISTER between '01.01'2014' and '31.12.2014'

Create Function (idReg int, name_comp varchar(256)) returns varchar(256)
begin atomic
declare res varchar(256);
set res = (select v.VALUE from R_VALUE as v where v.ID_Reg = idReg and v.ID_COMPONENT = (select c.ID from S_COMPONENT as c where upper(c.NAME) like upper(name_comp)));
return res;
end;
Существует несколько функций, которые собирают несколько полей в одно.
...
Рейтинг: 0 / 0
Ускорение запроса, который переводит строки в столбцы.
    #38834591
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чикуров В.В.,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with 
  R_Register (id, date_register) as (values (1, date('2014-12-31')), (2, date('2014-12-31')))
, S_Component(id, name) as (values (1, 'N1 name'), (2, 'N2 name'), ...)
, R_Value(registerID, componentID, value) as (values 
  (1, 1, 'v11')
, (1, 2, 'v12')
, (2, 1, 'v21')
, (2, 2, 'v22')
)
select r.id
, max(case when c.name like 'N1%' then v.value end) N1
, max(case when c.name like 'N2%' then v.value end) N2
...
from R_Register r
join R_Value v on v.registerID=r.ID
join S_Component c on c.ID=v.componentID
where r.DATE_REGISTER between '2014-01-01' and '2014-12-31'
group by r.id
...
Рейтинг: 0 / 0
Ускорение запроса, который переводит строки в столбцы.
    #38835000
Mark Barinstein,

Проблема, в том что join ,блокирует работу по вводу данных в таблицу R_VALUE.
У меня первый вариант был через join, похожий на ваш.
...
Рейтинг: 0 / 0
Ускорение запроса, который переводит строки в столбцы.
    #38835180
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Чикуров В.В.,

Так выполняйте его с уровнем изоляции UR...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Ускорение запроса, который переводит строки в столбцы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]