Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» InterBase и FireBird: вопросы по работе и их решение

Автор: chAlx
Дата сообщения: 26.11.2014 18:08
xpin2013:

Цитата:
Вопрос меня интересует в смысле чтобы ещё кто проверил

Тогда стоит собраться с силами, отложить сегодняшние 0.5 и задать вопрос чётко, понятно и с тестовым примером. И лучше сразу где-нибудь на ibase.ru или sql.ru -- там и разработчики СУБД, и архитекторы БД. А тут, похоже, только пользователи компонентов.
Автор: xpin2013
Дата сообщения: 26.11.2014 22:57
chAlx
Не согласен, тут мастеры, а на sql.ru снобы и мужланы с которыми не о чём потрындеть. Сделайте триггер с процедурой на Insert Old.Value и у Вас не будет вопросов.
Автор: chAlx
Дата сообщения: 27.11.2014 09:21
xpin2013
Дык вопрос-то не у меня был. Только он так и не сформулирован ;)
Какой-то триггер (BI или AI?) Какая-то процедура (вызывается из триггера или вставляет в таблицу?) Сама таблица (ключи, индексы), запрос на вставку -- ничего нет.

Про мастеров не знаю, а насчёт снобов согласен. Поэтому ibaseforum на первом месте, несмотря на меньшую аудиторию.
Автор: Andryshok
Дата сообщения: 27.11.2014 10:15

Цитата:
каждый день имею ноль пять водки и консерву пожрать
- Именно это я и имел пока не стал кодить под веб на великолепном бесплатном PHP который к тому же оказался намного проще чем я раньше полагал, попробуйте все же IbDac - там под фаер есть абсолютно все что вам нужно + DevArt регулярно его обновляет.
Автор: xpin2013
Дата сообщения: 27.11.2014 13:32
chAlx

Код: CREATE OR ALTER trigger table1_aiu0 for table1
active after insert or update position 0
AS
declare variable tmp integer;
begin
for select pid from make_words(old.id_table1) into :tmp do begin end
end^
Автор: miwa
Дата сообщения: 27.11.2014 13:44
xpin2013
Как сноб и мужлан из sql.ru (там я белый и пушистый, если что), хочу сделать парочу заявлений.

Во-первых, нету firebird 2.5. Есть 2.5.0, 2.5.1, 2.5.2 и так далее. Третья цифырь иногда имеет очень большое значение.

Во-вторых, firebird 2.5.3 не дает использовать old-значения в тригерах BI, так что скорее всего кривой тригер был создан в 2.0.Х или 2.1.Х, а затем при миграции на 2.5.Х никто не прочитал release notes. Так что - да, идти с таким к столь прямолинейным людям, которые крутятся на скуль.ру - чревато
Автор: xpin2013
Дата сообщения: 27.11.2014 14:16
miwa
Firebird-2.5.0.26074_1_Win32
И триггер был добавлен недавно прямо на Firebird-2.5.0.26074_1_Win32. Не мной. Но стала тормозить вставка и пришлось разбираться из-за чего. Просто меня поразило такое поведение триггера, ведь вполне очевидно что оно неправильное. Так зачем тогда был придуман этот механизм для OLD при вставке???


Цитата:
Так что  - да, идти с таким к столь прямолинейным людям, которые крутятся на скуль.ру

Я тоже прямолинейный человек. Видимо по этому мы не ужились с скуль.ру. Ведь я не умею придумывать бесполезных механизмов - это ведь тоже черевато?
Автор: russko
Дата сообщения: 27.11.2014 14:52
Доброго времени суток.
Столкнулся с задачкой, никак решить не получается.
Существует процедура npc_dv, которая возвращает порядка 100 000 записей и на ее выполнение уходит от силы 5 минут.
Но чтобы все пользователи ее не запускали (большая нагрузка) приняли решение результат процедуры ежедневно записывать в таблицу и конечные пользователи работают только с ней.

Проблема в том, что выполнение операции:

Цитата:

insert into npc_active_dv_temp
select * from npc_dv(-1,-1,2,2);

осуществляется больше 2-х часов ((( Каким образом можно это дело поправить?
Запрос

Цитата:

select * from npc_dv(-1,-1,2,2);

выполняется всего 5 минут!!!
Автор: OXDBA
Дата сообщения: 27.11.2014 15:19

Цитата:
insert into npc_active_dv_temp
select * from npc_dv(-1,-1,2,2);

Это реальный запрос или для примера выложен?
Автор: ant0ni02004
Дата сообщения: 27.11.2014 16:00
russko
скорее всего, там при вставке индексы перестраиваются долго, или триггера отрабатывают
попробуйте перед запуском процедуры это всё отключать а после - включать
Автор: OXDBA
Дата сообщения: 27.11.2014 16:16
ant0ni02004
Продолжаем дружно тереть хрустальный шар...

Цитата:
select * from npc_dv(-1,-1,2,2);

Ставлю на FetchAll = ~ 2 часа
Автор: chAlx
Дата сообщения: 27.11.2014 16:45
xpin2013:

Цитата:

Код: for select pid from make_words(old.id_table1) into :tmp do begin end
Автор: xpin2013
Дата сообщения: 27.11.2014 17:48
chAlx
Спасибо, я бы так не смог (про sql.ru). Я очень уважаю miwa и знаю его давно, ещё с прошлого моего ника (не хочу светить - адвансом был). Но Вы объяснили суть - моему коллеге потребовался suspend. А то что с 2.5.3 нельзя old в insert я и так знал, только забыл цифры и miwa вполне справедливо подметил.

На sql.ru если ты Newbye с тобой общяются как с сосунком, а они при этом круче Шварцнеггера и всего Голливуда. Меня как-то взбесило это, и я высказался. Был бан, хотя я пришёл на sql.ru купить IBReplicator. Так что в уравновешенности аппонентов из sql.ru я сильно сомневаюсь. Но вот miwa достоен серьёзного уважения.

Ещё раз простите - сказанное IMHO.



Добавлено:
Да забыл, жаль что OXDBA редко заглядывает. Он всегда пишет по делу - талант у него такой.
Автор: russko
Дата сообщения: 27.11.2014 19:56

Цитата:
Это реальный запрос или для примера выложен?


Запрос вполне реальный.


Цитата:
Ставлю на FetchAll  = ~ 2 часа


Что вы имеете ввиду? Откуда там фэтч?
Автор: chAlx
Дата сообщения: 27.11.2014 20:24
russko:

Перевожу вопросы, не раскрытые в постановке задачи:

1. select count(*) from npc_dv(-1,-1,2,2) как долго выполняется?

2. Какие у npc_active_dv_temp есть индексы и триггеры? И как она вообще создаётся -- временная, в отдельном файле или нормальная?
Автор: miwa
Дата сообщения: 27.11.2014 22:52
russko
Дополню абсолютно правильные уточнения chAlx еще одним:

2.5 Покажите результат выполнения комманды
show table npc_active_dv_temp
в isql, либо же весь текст кроме комментариев из вкладки ddl в IBExpert.

chAlx

Цитата:
На ЭсКуЭльРу же принято красоваться друг перед другом, изысканно обсирая нубов, но ни в коем случае не объяснять, что неправильно и как исправить. По-меньшей мере это характерно для ветки про Interbase.  

На скуль.ру отвечают в основном достаточно компетентные люди, которые предполагают, что у спрашивающего есть минимальные понятия о том, о чем он спрашивает. Не более и не менее. Или у вас есть ссылка, где на заданный вопросс не был дан конкретный ответ или не менее конкретный уточняющий вопросс?


Цитата:
Самое печальное, что тамошние старпёры таким же высоким слогом порой несут ахинею, а чтобы не признавать ошибки, ещё больше провоцируют нубов на агрессию и с довольным видом банят их на нарушения.

Ну и с этого места - можно поподробнее? Просто интерессно стало - когда я такое веселье пропустил.

OXDBA

Цитата:
Ставлю на FetchAll  = ~ 2 часа

Ну, если натираем хрусталь, то я, пожалуй, поддержу версию ant0ni02004 насчет тригеров


xpin2013

Цитата:
. Я очень уважаю miwa и знаю его давно, ещё с прошлого моего ника (не хочу светить - адвансом был

Спасибо. Если что, я знаю и ваш предыдущий ник и помню вас на скуле. Поэтому пользуясь случаем хочу сказать, что на вас иногда находит довольно серьезное косноязычие и понять написанное решительно невозможно. Не знаю, могло ли это быть причиной бана, но это точно было причиной одного обмена публичными сообщениями "на грани фола" между нами здесь, на руборде.
Автор: chAlx
Дата сообщения: 28.11.2014 02:13
miwa

Цитата:
На скуль.ру отвечают в основном достаточно компетентные люди, которые предполагают, что у спрашивающего есть минимальные понятия о том, о чем он спрашивает. Не более и не менее. Или у вас есть ссылка, где на заданный вопросс не был дан конкретный ответ или не менее конкретный уточняющий вопросс?

Блин, открыл старые темы там -- как в повидле весь измазался...

Честно говоря, это было давно. И даже не один раз: уходил, через несколько лет приходил -- всё так же, всё те же. Я даже у администрации пытался выяснить, должно ли так быть или ошибка какая-то. Но им было в общем-то пофигу.

Вот, например, один из типичных примеров, и с моим участием (просто открыл одну из последних тем, где отписывался). Сценарий стандартный:

Нуб или простой DBA, у которого, как у любого, остались где-то пробелы в знаниях, приходит эти пробелы заполнить на примере своего практического вопроса. Умники лениво отстреливаются дежурными "наводящими вопросами", не упуская шанса поглумиться над тупым автором. При первом же шансе съехать на что-то менее актуальное, но более интересное, про изначальный вопрос забывают и начинают перетирать отвлечённые темы. При этом отчаянно лажают, но не подают виду (а скорее всего, с высоты своего полёта даже не допускают такой вероятности). Автора достают в край, он ругается и уходит. Аксакалы потирают руки, довольные, что наставили на путь ещё одну заблудшую душу. Отчасти, так и есть: души находят пристанище в более приличных местах.
Автор: russko
Дата сообщения: 28.11.2014 06:22

Цитата:
Перевожу вопросы, не раскрытые в постановке задачи:

1. select count(*) from npc_dv(-1,-1,2,2) как долго выполняется?

2. Какие у npc_active_dv_temp есть индексы и триггеры? И как она вообще создаётся -- временная, в отдельном файле или нормальная?


1. Данный запрос, как я говорил выше, выполняется около 5-ти минут.

2. У таблицы npc_active_dv_temp нет не индексов, не триггеров. Это временная нормальная таблица-буфер, которая ежедневно чистится. Добавление различных индексов влияния не оказывает...

Структура таблицы npc_active_dv_temp
[more=структура]
SCH_ID INTEGER,
NP_SROK_OPLATY TIMESTAMP,
NP_DATA TIMESTAMP,
SROK_POSTAVKI INTEGER,
SROK_POSTAVKI_DATA TIMESTAMP,
KLASSIF_GRUPPA_2 VARCHAR(255),
KLASSIF_GRUPPA_1 VARCHAR(255),
DATY_PRIHODOV TIMESTAMP,
DATA_OPL_LAST TIMESTAMP,
DATA_OPL_FIRST TIMESTAMP,
POSTAVSHIK_ID INTEGER,
SCHET_DATA TIMESTAMP,
SCHET_N VARCHAR(128),
OPLACHENO_RUB DOUBLE PRECISION,
OPLACHENO_SCH_RUB DOUBLE PRECISION,
SUMMA_RUB_S_NDS_DOLYA DOUBLE PRECISION,
SUMMA_RUB_S_NDS DOUBLE PRECISION,
OTV_LICO VARCHAR(255),
SUMMA_SCH_RUB_S_NDS DOUBLE PRECISION,
ZAY_OSTATOK DOUBLE PRECISION,
ZAY_KOLVO DOUBLE PRECISION,
TEMATIKA INTEGER,
N_DOG VARCHAR(50),
TIP INTEGER,
DOGOVOR_ID INTEGER,
SLZ_N VARCHAR(200),
NAZVANIE VARCHAR(1000),
GRUPPA INTEGER,
DV_FAKT_DATA_POST TIMESTAMP,
DV_NOTE VARCHAR(200),
OPISANIE VARCHAR(1000),
NAZVANIE_TXT VARCHAR(500),
DV_GOTOVNOST INTEGER,
KOD VARCHAR(32),
NOTES VARCHAR(1000),
KOLVO DOUBLE PRECISION,
ED_IZM INTEGER,
VP_SOSTAV_ID INTEGER,
ID INTEGER,
DV_PEREDANO_NA_OPLATU INTEGER,
POTREB_PERVICH_KOLVO DOUBLE PRECISION,
PERVICH_ED_IZM INTEGER,
PRISHLO_KOLVO DOUBLE PRECISION,
NP_SROK_VYDACHI_VP TIMESTAMP,
SCHET_DATA_PODPIS TIMESTAMP,
SLZ_DATA TIMESTAMP,
KOLVO_SPISANO DOUBLE PRECISION,
OPLACHENO_PROCENTOV DOUBLE PRECISION,
AKCEPT TIMESTAMP,
KONSTRUKTOR_ID INTEGER,
SUMMA_PO_POTREB DOUBLE PRECISION,
PODSOSTAV1_ID INTEGER,
NE_OPLACHENO_RUB DOUBLE PRECISION,
ARHIV INTEGER,
DOG_SPIS VARCHAR(1000),
CENA DOUBLE PRECISION,
GRUPPA_KLASSIF VARCHAR(64),
NN_SPISANIYA VARCHAR(1000),
NN_PRIHODA VARCHAR(1000)
[/more]

После наполнения таблицы npc_active_dv_temp происходит перенос всех данных в рабочую npc_active_dv. Данная операция проходит секунд за 10-15.

Цитата:

insert into npc_active_dv
select * from npc_active_dv_temp;

Для чего был сделан именно такой алгоритм сказать трудно, проект достался в таком виде...вот и разбираемся.
Автор: exteris
Дата сообщения: 28.11.2014 07:14

Цитата:
1. Данный запрос, как я говорил выше, выполняется около 5-ти минут.

Вы говорили про select * from ...
А вас спросили за select count(*) from ...
Автор: russko
Дата сообщения: 28.11.2014 07:45

Цитата:
Вы говорили про select * from ...
А вас спросили за select count(*) from ...


Виноват...слеповат к старости стал ))
Запрос на count выполняется также чуть больше 2-х часов.
Автор: exteris
Дата сообщения: 28.11.2014 08:23
Вооот, OXDBA прав.
В случае когда запрос выполняется 5 минут, вычитываются не все данные, а только первая порция. А на все уходит 2 часа.
Автор: russko
Дата сообщения: 28.11.2014 08:32

Цитата:
В случае когда запрос выполняется 5 минут, вычитываются не все данные, а только первая порция. А на все уходит 2 часа.

Это конечно понятно...вопрос тогда состоит в следующем - каким образом можно еще ускорить запрос передачи данных из ХП в таблицу. Саму хранимую процедуру уже оптимизировали как смогли ((( Может есть какие-то нюансы, о которых в силу своей нубости я не знаю?
Автор: exteris
Дата сообщения: 28.11.2014 09:33
Скорость передачи данных тут не при чем. Всё упирается в скорость выполнения процедуры.

Добавлено:
Можете, кстати, привести ее здесь+DDL+планы выполнения. Может чего и подскажут.
Автор: miwa
Дата сообщения: 28.11.2014 09:35
russko

Цитата:
вопрос тогда состоит в следующем - каким образом можно еще ускорить запрос передачи данных из ХП в таблицу. Саму хранимую процедуру уже оптимизировали как смогли ((( Может есть какие-то нюансы, о которых в силу своей нубости я не знаю?

Надо тогда полный текст процедуры. Дьявол ведь - он в деталях.

Если полный текст - коммерческая тайна, тогда максимально точное описание того, что она делает.

chAlx

Цитата:
Вот, например, один из типичных примеров, и с моим участием (просто открыл одну из последних тем, где отписывался). Сценарий стандартный:

Ух, голова моя-головушка...

Вижу полностью некомпетентного человека, который пытается администрировать базу данных на несколько сотен одновременных подключений. Ему задают вопросы (в том числе и лично вы; вопросы компетентные и при наличии ответов можно пытаться помочь человеку), сбрасывают ссылку на похожие проблемы. Отдельно один учасник форума пытается троллить другого (не ТС-а). Плюс не забываем контекст - ТС уже один раз успел всем поднадоесть другим топиком о выборе сервера парой дней раньше. И во всей этой карусели ни одного ответа от человека, которому нужна помощь - только "да смотрю я, все нормально" и сразу же "ладно, я ухожу, вы все плохие".

Где там наезды на ТСа ДО ТОГО как он сам начал обижаться? И где попытки ТСа разобраться в его же проблеме?

Вот тогда паралель. У пользователя russko здесь тоже проблема с производительностью. Мы тоже задаем ему вопросы, пытаемся гадать на хрустальном шаре. Паралельно обсуждаем какие-то посторонные темы; старожилы по-дружески толкают друг друга. Если при этом russko вдруг решит, что "все, ладно, пошли вы все" - реакция тоже может быть разной. Правда, отличие есть: russko отвечает на вопросы и пытается разобраться в своей проблеме
Автор: russko
Дата сообщения: 28.11.2014 09:47

Цитата:
Надо тогда полный текст процедуры. Дьявол ведь - он в деталях.

Если полный текст - коммерческая тайна, тогда максимально точное описание того, что она делает.


Прикладываю скрипт процедуры...тайны особой, кроме интеллектуальной нет ))
[more=Процедура]
create or alter procedure NPC_DV (
PODSOSTAV_ID integer = -1,
IN_DOG_ID integer = -1,
RZ integer = -1,
SHOW_ARHIV integer = -1)
returns (
SCH_ID integer,
NP_SROK_OPLATY timestamp,
NP_DATA timestamp,
SROK_POSTAVKI integer,
SROK_POSTAVKI_DATA timestamp,
KLASSIF_GRUPPA_2 varchar(255),
KLASSIF_GRUPPA_1 varchar(255),
DATY_PRIHODOV timestamp,
DATA_OPL_LAST timestamp,
DATA_OPL_FIRST timestamp,
POSTAVSHIK_ID integer,
SCHET_DATA timestamp,
SCHET_N varchar(128),
OPLACHENO_RUB double precision,
OPLACHENO_SCH_RUB double precision,
SUMMA_RUB_S_NDS_DOLYA double precision,
SUMMA_RUB_S_NDS double precision,
OTV_LICO varchar(255),
SUMMA_SCH_RUB_S_NDS double precision,
ZAY_OSTATOK double precision,
ZAY_KOLVO double precision,
TEMATIKA integer,
N_DOG varchar(50),
TIP integer,
DOGOVOR_ID integer,
SLZ_N varchar(200),
NAZVANIE varchar(1000),
GRUPPA integer,
DV_FAKT_DATA_POST timestamp,
DV_NOTE varchar(200),
OPISANIE varchar(1000),
NAZVANIE_TXT varchar(500),
DV_GOTOVNOST integer,
KOD varchar(32),
NOTES varchar(1000),
KOLVO double precision,
ED_IZM integer,
VP_SOSTAV_ID integer,
ID integer,
DV_PEREDANO_NA_OPLATU integer,
POTREB_PERVICH_KOLVO double precision,
PERVICH_ED_IZM integer,
PRISHLO_KOLVO double precision,
NP_SROK_VYDACHI_VP timestamp,
SCHET_DATA_PODPIS timestamp,
SLZ_DATA timestamp,
KOLVO_SPISANO double precision,
OPLACHENO_PROCENTOV double precision,
AKCEPT timestamp,
KONSTRUKTOR_ID integer,
SUMMA_PO_POTREB double precision,
PODSOSTAV1_ID integer,
NE_OPLACHENO_RUB double precision,
ARHIV integer,
DOG_SPIS varchar(1000),
CENA double precision,
GRUPPA_KLASSIF varchar(64),
NN_SPISANIYA varchar(1000),
NN_PRIHODA varchar(1000))
as
declare variable PROD_DOLYA_PO_SUMME double precision;
declare variable SCH_PROD_KOLVO double precision;
declare variable SCH_PROD_CENA_V_VALUTE double precision;
declare variable SCH_SUM double precision;
declare variable SCH_PROD_ID integer;
declare variable PREV_SCH_ID integer = -1;
declare variable RESULT_ROWS_COUNT integer = 0;
begin



for

SELECT
nvp.ID,
nvp.VP_SOSTAV_ID,
nvp.ED_IZM,
nsp.kolvo, --nvp.KOLVO,

nvp.NOTES,
nvp.KOD,
nvp.NAZVANIE_TXT,
nvp.opisanie,
nvp.dv_gotovnost,
nvp.dv_note,
nvp.DV_FAKT_DATA_POST,
nvp.Gruppa,
nvp.DV_PEREDANO_NA_OPLATU,
nvp.POTREB_PERVICH_KOLVO,
nvp.KOLVO_SPISANO,
nvp.AKCEPT,
nvp.podsostav1_id,
nvp.SUMMA_PO_POTREB,

nvs.ed_izm,

nvs.NAZVANIE,

nv.SLZ_N,
nv.DOGOVOR_ID,
nv.tip,
nv.SLZ_DATA,
nv.KONSTRUKTOR_ID,

nd.N_DOG,
nd.tematika,

(select coalesce(sum(kolvo_real),0) from NPC_ZAYAVKI_PROD where VP_PODSOSTAV_ID=nvp.ID) zay_kolvo,
(nvp.KOLVO-(select coalesce(sum(kolvo_real),0) from NPC_ZAYAVKI_PROD where VP_PODSOSTAV_ID=nvp.ID)) zay_ostatok

,ns.OTV_LICO
,nsp.SUMMA_TEXT SUMMA_RUB_S_NDS

,ns.SCHET_N
,ns.SCHET_DATA
,ns.Postavshik_ID
,(select RESULT_SUMMA from NPC_SCHETA_OPL_NEOPL(NS.ID,1,2,null,NS.summa_v_valute_sch)) OPLACHENO_PROCENTOV

,(select min(Data_Opl) from NPC_Scheta_Oplata nso where nso.Schet_ID=nsp.Schet_ID ) DATA_OPL_FIRST --(select min(Data_Opl) from NPC_Scheta_prod nsp,NPC_Scheta_Oplata nso where nsp.VP_PODSOSTAV_ID=nvp.ID and nso.Schet_ID=nsp.Schet_ID ) DATA_OPL_FIRST
,(select case when max(Data_Opl)<>min(Data_Opl) then max(Data_Opl) end from NPC_Scheta_Oplata nso where nso.schet_ID=nsp.Schet_ID ) DATA_OPL_LAST --(select case when max(Data_Opl)<>min(Data_Opl) then max(Data_Opl) end from NPC_Scheta_prod nsp,NPC_Scheta_Oplata nso where nsp.VP_PODSOSTAV_ID=nvp.ID and nso.schet_ID=nsp.Schet_ID ) DATA_OPL_LAST

,
case when (select sum(KOLVO) from NPC_SKLAD_PRIHOD_PROD where schet_prod_id=nsp.id)>=nsp.kolvo then
(select cast(max(nsp1.DATA_SOSTAVLENIYA/*prihod_data*/)as date) from NPC_SKLAD_PRIHOD nsp1,NPC_SKLAD_PRIHOD_PROD nspp1
where nspp1.schet_prod_id=nsp.id and nsp1.id=nspp1.sklad_prihod_id) end daty_prihodov

,(select sum(KOLVO) from NPC_SKLAD_PRIHOD_PROD where schet_prod_id=nsp.id) PRISHLO_KOLVO

-- ,(select ELEMENT_NAME from NPC_KLASSIF_GET_ELEMENT_NAME(nvp.kod,1)) klassif_gruppa_1
-- ,(select ELEMENT_NAME from NPC_KLASSIF_GET_ELEMENT_NAME(nvp.kod,2)) klassif_gruppa_2
,(select gruppa_1_FIX from NPC_Klassifikator where kod_global_fix=nvp.kod) klassif_gruppa_1
,(select gruppa_2_FIX from NPC_Klassifikator where kod_global_fix=nvp.kod) klassif_gruppa_2


,nsp.SROK_POSTAVKI_DATA
,nsp.SROK_POSTAVKI

,case nv.tip
when 0 then (select coalesce(DATA_PLAN,DATA_DIREKTIVNAYA) from NPC_DOGOVORA_NP where Dogovor_ID=nd.ID and Action_ID=20)
when 1 then (select coalesce(DATA_PLAN,DATA_DIREKTIVNAYA) from NPC_DOGOVORA_NP where Dogovor_ID=nd.ID and Action_ID=21)
end NP_DATA
,(case nv.tip
when 0 then (select coalesce(DATA_PLAN,DATA_DIREKTIVNAYA) from NPC_DOGOVORA_NP where Dogovor_ID=nd.ID and Action_ID=20)
when 1 then (select coalesce(DATA_PLAN,DATA_DIREKTIVNAYA) from NPC_DOGOVORA_NP where Dogovor_ID=nd.ID and Action_ID=21)
end - nsp.Srok_postavki /*(select max(Srok_postavki) from NPC_Scheta_prod nsp where VP_PODSOSTAV_ID=nvp.ID)*/) NP_Srok_Oplaty
,case nv.tip
when 0 then (select coalesce(Data_Fakt,coalesce(DATA_PLAN,DATA_DIREKTIVNAYA)) from NPC_DOGOVORA_NP where Dogovor_ID=nd.ID and Action_ID=4)
when 1 then (select coalesce(Data_Fakt,coalesce(DATA_PLAN,DATA_DIREKTIVNAYA)) from NPC_DOGOVORA_NP where Dogovor_ID=nd.ID and Action_ID=10)
end np_srok_vydachi_vp

,ns.id SCH_ID
,ns.data_podpisaniya
,nsp.id
,nsp.cena_v_valute
,nsp.kolvo

,nd.arhiv
,
null--(select list(distinct (select N_Dog from NPC_DOGOVORA nd,npc_vp_podsostav nvp2 where nd.ID=nvp2.DOG_ID and nvp2.id=nssf.otkuda_spisano_podsost_id),', ') from npc_sklad_spisanie_fakt nssf where vp_podsostav_id=nvp.id)DOG_SPIS
,/*nsp.cena*/(select max((select SUMMA from SK_SCHETA_SUMMA(1,nsp2.cena,ns2.nds,0,0))) from npc_scheta ns2,npc_scheta_prod nsp2 where nsp2.vp_podsostav_id=nvp.podsostav_id_source and ns2.id=nsp2.schet_id)
,(select Gruppa_kl from NPC_KLASSIFIKATOR where kod_global_fix=nvp.KOD) Gruppa_KLASSIF
,(select list(distinct n_treb_nakl,', ') from npc_sklad_spisanie_fakt where kuda_spisano_podsost_id=nvp.id)NN_SPISANIYA
,(select list(distinct SPP_PRIHOD_ORDER_N,', ') from NPC_SKLAD_PRIHOD_PROD where schet_prod_id=nsp.id) NN_PRIHODA
--*/
FROM
NPC_VP_PODSOSTAV nvp left join NPC_VP_SOSTAV nvs on nvp.VP_SOSTAV_ID=nvs.ID
left join NPC_VP nv on nvs.VP_ID=nv.ID
left join NPC_DOGOVORA nd on nv.DOGOVOR_ID=nd.ID
left join NPC_Scheta_prod nsp on nsp.VP_PODSOSTAV_ID=nvp.ID
left join NPC_Scheta ns on ns.ID=nsp.Schet_ID
where
--ns.id=10713 and
((:SHOW_ARHIV=-1 and nd.Arhiv is null)or(:SHOW_ARHIV=1 and nd.Arhiv=1)or(:SHOW_ARHIV=2))
and coalesce(nvp.DV_ANNULIROVANO,0)=0 and coalesce(nd.ocenka,0)=0
and ((:RZ=-1 and nd.Tematika<>8)or(:RZ=1 and nd.Tematika=8)or(:RZ=2))
and ( (:PODSOSTAV_ID=-1)or((:PODSOSTAV_ID>-1)and(nvp.ID=:PODSOSTAV_ID)) )
and ( (:IN_DOG_ID=-1)or((:IN_DOG_ID>-1)and(nv.DOGOVOR_ID=:IN_DOG_ID)) )
order by
ns.id

into

ID,
VP_SOSTAV_ID,
ED_IZM,
KOLVO,

NOTES,
KOD,
NAZVANIE_TXT,
opisanie,
dv_gotovnost,
dv_note,
DV_FAKT_DATA_POST,
Gruppa,
DV_PEREDANO_NA_OPLATU,
POTREB_PERVICH_KOLVO,
KOLVO_SPISANO,
AKCEPT,
PODSOSTAV1_ID,
SUMMA_PO_POTREB,

PERVICH_ED_IZM,

NAZVANIE,

SLZ_N,
DOGOVOR_ID,
tip,
SLZ_DATA,
KONSTRUKTOR_ID,

N_DOG,
tematika,

zay_kolvo,
zay_ostatok

-- ,SUMMA_SCH_RUB_S_NDS
,OTV_LICO
,SUMMA_RUB_S_NDS
-- ,SUMMA_RUB_S_NDS_Dolya

-- ,OPLACHENO_SCH_RUB
-- ,OPLACHENO_RUB
,SCHET_N
,SCHET_DATA
,Postavshik_ID
,OPLACHENO_PROCENTOV

,DATA_OPL_FIRST
,DATA_OPL_LAST

,daty_prihodov
,PRISHLO_KOLVO

,klassif_gruppa_1
,klassif_gruppa_2


,SROK_POSTAVKI_DATA
,SROK_POSTAVKI

,NP_DATA
,NP_Srok_Oplaty
,NP_SROK_VYDACHI_VP

,SCH_ID
,SCHET_DATA_PODPIS
,SCH_PROD_ID
,SCH_PROD_cena_v_valute
,SCH_PROD_kolvo

,ARHIV
,DOG_SPIS
,cena
,Gruppa_KLASSIF
,NN_SPISANIYA
,NN_PRIHODA
do






BEGIN

if (not(PODSOSTAV1_ID is null)) then
Begin

for select
nsz.OTV_LICO
,nspz.SUMMA_TEXT SUMMA_RUB_S_NDS

,nsz.SCHET_N
,nsz.SCHET_DATA
,nsz.Postavshik_ID
,(select RESULT_SUMMA from NPC_SCHETA_OPL_NEOPL(NSz.ID,1,2,null,NSz.summa_v_valute_sch)) OPLACHENO_PROCENTOV

,(select min(Data_Opl) from NPC_Scheta_Oplata nso where nso.Schet_ID=nspz.Schet_ID ) DATA_OPL_FIRST --(select min(Data_Opl) from NPC_Scheta_prod nsp,NPC_Scheta_Oplata nso where nsp.VP_PODSOSTAV_ID=nvp.ID and nso.Schet_ID=nsp.Schet_ID ) DATA_OPL_FIRST
,(select case when max(Data_Opl)<>min(Data_Opl) then max(Data_Opl) end from NPC_Scheta_Oplata nso where nso.schet_ID=nspz.Schet_ID ) DATA_OPL_LAST --(select case when max(Data_Opl)<>min(Data_Opl) then max(Data_Opl) end from NPC_Scheta_prod nsp,NPC_Scheta_Oplata nso where nsp.VP_PODSOSTAV_ID=nvp.ID and nso.schet_ID=nsp.Schet_ID ) DATA_OPL_LAST

,case when (select sum(KOLVO) from NPC_SKLAD_PRIHOD_PROD where schet_prod_id=nspz.id)>=nspz.kolvo then
(select max(nsp1.prihod_data) from NPC_SKLAD_PRIHOD nsp1,NPC_SKLAD_PRIHOD_PROD nspp1
where nspp1.schet_prod_id=nspz.id and nsp1.id=nspp1.sklad_prihod_id) end daty_prihodov

,(select sum(KOLVO) from NPC_SKLAD_PRIHOD_PROD where schet_prod_id=nspz.id) PRISHLO_KOLVO

-- ,(select ELEMENT_NAME from NPC_KLASSIF_GET_ELEMENT_NAME(nvp.kod,1)) klassif_gruppa_1
-- ,(select ELEMENT_NAME from NPC_KLASSIF_GET_ELEMENT_NAME(nvp.kod,2)) klassif_gruppa_2
--,(select gruppa_1_FIX from NPC_Klassifikator where kod_global_fix=nvp.kod) klassif_gruppa_1
--,(select gruppa_2_FIX from NPC_Klassifikator where kod_global_fix=nvp.kod) klassif_gruppa_2

,nspz.SROK_POSTAVKI_DATA
,nspz.SROK_POSTAVKI

,:NP_Srok_Oplaty+:SROK_POSTAVKI-nspz.Srok_postavki
--,(case nv.tip
-- when 0 then (select coalesce(DATA_PLAN,DATA_DIREKTIVNAYA) from NPC_DOGOVORA_NP where Dogovor_ID=nd.ID and Action_ID=20)
-- when 1 then (select coalesce(DATA_PLAN,DATA_DIREKTIVNAYA) from NPC_DOGOVORA_NP where Dogovor_ID=nd.ID and Action_ID=21)
--end - nsp.Srok_postavki /*(select max(Srok_postavki) from NPC_Scheta_prod nsp where VP_PODSOSTAV_ID=nvp.ID)*/) NP_Srok_Oplaty

,nsz.id SCH_ID
,nsz.data_podpisaniya
,nspz.id
,nspz.cena_v_valute
,nspz.kolvo
,(select list(distinct SPP_PRIHOD_ORDER_N,', ') from NPC_SKLAD_PRIHOD_PROD where schet_prod_id=nspz.id) NN_PRIHODA

from NPC_Scheta_prod nspz
left join NPC_Scheta nsz on nsz.ID=nspz.Schet_ID
where nspz.VP_PODSOSTAV_ID=:PODSOSTAV1_ID
--where если запись PODSOSTAV1_ID аннулирована, то она всё равно учитывается
into

OTV_LICO
,SUMMA_RUB_S_NDS

,SCHET_N
,SCHET_DATA
,Postavshik_ID
,OPLACHENO_PROCENTOV

,DATA_OPL_FIRST
,DATA_OPL_LAST

,daty_prihodov
,PRISHLO_KOLVO

--,klassif_gruppa_1
--,klassif_gruppa_2

,SROK_POSTAVKI_DATA
,SROK_POSTAVKI

,NP_Srok_Oplaty

,SCH_ID
,SCHET_DATA_PODPIS
,SCH_PROD_ID
,SCH_PROD_cena_v_valute
,SCH_PROD_kolvo
,NN_PRIHODA
do
BEGIN
select SUMMA_RUB_S_NDS from NPC_Scheta where ID=:Sch_ID into SUMMA_SCH_RUB_S_NDS;
select OPLACHENO_RUB from NPC_Scheta where ID=:Sch_ID into OPLACHENO_SCH_RUB;
summa_rub_s_nds_dolya=null;
OPLACHENO_RUB=null;
END
End
else
BEGIN
if (PREV_SCH_ID<>SCH_ID) then
begin
select SUMMA_RUB_S_NDS from NPC_Scheta where ID=:Sch_ID into SUMMA_SCH_RUB_S_NDS;
select OPLACHENO_RUB from NPC_Scheta where ID=:Sch_ID into OPLACHENO_SCH_RUB;
select coalesce(sum(kolvo*cena_v_valute),0) from npc_scheta_prod where schet_ID=:sch_id and annulirovano=0 into sch_sum;

PREV_SCH_ID=SCH_ID;
end
else
if (SCH_ID is null) then
BEGIN
SUMMA_SCH_RUB_S_NDS=null;
OPLACHENO_SCH_RUB=0;
sch_sum=0;
END
------------------- summa_rub_s_nds_dolya
if (sch_sum<>0) then
BEGIN
PROD_DOLYA_PO_SUMME=(SCH_PROD_kolvo*SCH_PROD_cena_v_valute)/sch_sum; -- доля от общей суммы счёта
summa_rub_s_nds_dolya=PROD_DOLYA_PO_SUMME*SUMMA_SCH_RUB_S_NDS;
END else summa_rub_s_nds_dolya=null;
--================= summa_rub_s_nds_dolya
--------------------- OPLACHENO_RUB
if (sch_sum>0) then OPLACHENO_RUB=PROD_DOLYA_PO_SUMME*OPLACHENO_SCH_RUB;
else OPLACHENO_RUB=null;
--===================
END
--=================================
NE_OPLACHENO_RUB=SUMMA_RUB_S_NDS_DOLYA-coalesce(OPLACHENO_RUB,0);


--if (RESULT_ROWS_COUNT>41860) then
suspend;
--RESULT_ROWS_COUNT=RESULT_ROWS_COUNT+1;
END
[/more]

Проблема очевидно кроется во втором подзапросе. Без него все выполняется в считанные минуты.
[more=Подзапрос]
for select
nsz.OTV_LICO
,nspz.SUMMA_TEXT SUMMA_RUB_S_NDS

,nsz.SCHET_N
,nsz.SCHET_DATA
,nsz.Postavshik_ID
,(select RESULT_SUMMA from NPC_SCHETA_OPL_NEOPL(NSz.ID,1,2,null,NSz.summa_v_valute_sch)) OPLACHENO_PROCENTOV

,(select min(Data_Opl) from NPC_Scheta_Oplata nso where nso.Schet_ID=nspz.Schet_ID ) DATA_OPL_FIRST --(select min(Data_Opl) from NPC_Scheta_prod nsp,NPC_Scheta_Oplata nso where nsp.VP_PODSOSTAV_ID=nvp.ID and nso.Schet_ID=nsp.Schet_ID ) DATA_OPL_FIRST
,(select case when max(Data_Opl)<>min(Data_Opl) then max(Data_Opl) end from NPC_Scheta_Oplata nso where nso.schet_ID=nspz.Schet_ID ) DATA_OPL_LAST --(select case when max(Data_Opl)<>min(Data_Opl) then max(Data_Opl) end from NPC_Scheta_prod nsp,NPC_Scheta_Oplata nso where nsp.VP_PODSOSTAV_ID=nvp.ID and nso.schet_ID=nsp.Schet_ID ) DATA_OPL_LAST

,case when (select sum(KOLVO) from NPC_SKLAD_PRIHOD_PROD where schet_prod_id=nspz.id)>=nspz.kolvo then
(select max(nsp1.prihod_data) from NPC_SKLAD_PRIHOD nsp1,NPC_SKLAD_PRIHOD_PROD nspp1
where nspp1.schet_prod_id=nspz.id and nsp1.id=nspp1.sklad_prihod_id) end daty_prihodov

,(select sum(KOLVO) from NPC_SKLAD_PRIHOD_PROD where schet_prod_id=nspz.id) PRISHLO_KOLVO

-- ,(select ELEMENT_NAME from NPC_KLASSIF_GET_ELEMENT_NAME(nvp.kod,1)) klassif_gruppa_1
-- ,(select ELEMENT_NAME from NPC_KLASSIF_GET_ELEMENT_NAME(nvp.kod,2)) klassif_gruppa_2
--,(select gruppa_1_FIX from NPC_Klassifikator where kod_global_fix=nvp.kod) klassif_gruppa_1
--,(select gruppa_2_FIX from NPC_Klassifikator where kod_global_fix=nvp.kod) klassif_gruppa_2

,nspz.SROK_POSTAVKI_DATA
,nspz.SROK_POSTAVKI

,:NP_Srok_Oplaty+:SROK_POSTAVKI-nspz.Srok_postavki
--,(case nv.tip
-- when 0 then (select coalesce(DATA_PLAN,DATA_DIREKTIVNAYA) from NPC_DOGOVORA_NP where Dogovor_ID=nd.ID and Action_ID=20)
-- when 1 then (select coalesce(DATA_PLAN,DATA_DIREKTIVNAYA) from NPC_DOGOVORA_NP where Dogovor_ID=nd.ID and Action_ID=21)
--end - nsp.Srok_postavki $$IBEC$$*/ /*(select max(Srok_postavki) from NPC_Scheta_prod nsp where VP_PODSOSTAV_ID=nvp.ID)*/ /*$$IBEC$$ ) NP_Srok_Oplaty

,nsz.id SCH_ID
,nsz.data_podpisaniya
,nspz.id
,nspz.cena_v_valute
,nspz.kolvo
,(select list(distinct SPP_PRIHOD_ORDER_N,', ') from NPC_SKLAD_PRIHOD_PROD where schet_prod_id=nspz.id) NN_PRIHODA

from NPC_Scheta_prod nspz
left join NPC_Scheta nsz on nsz.ID=nspz.Schet_ID
where nspz.VP_PODSOSTAV_ID=:PODSOSTAV1_ID
--where если запись PODSOSTAV1_ID аннулирована, то она всё равно учитывается
into

OTV_LICO
,SUMMA_RUB_S_NDS

,SCHET_N
,SCHET_DATA
,Postavshik_ID
,OPLACHENO_PROCENTOV

,DATA_OPL_FIRST
,DATA_OPL_LAST

,daty_prihodov
,PRISHLO_KOLVO

--,klassif_gruppa_1
--,klassif_gruppa_2

,SROK_POSTAVKI_DATA
,SROK_POSTAVKI

,NP_Srok_Oplaty

,SCH_ID
,SCHET_DATA_PODPIS
,SCH_PROD_ID
,SCH_PROD_cena_v_valute
,SCH_PROD_kolvo
,NN_PRIHODA
do
BEGIN
select SUMMA_RUB_S_NDS from NPC_Scheta where ID=:Sch_ID into SUMMA_SCH_RUB_S_NDS;
select OPLACHENO_RUB from NPC_Scheta where ID=:Sch_ID into OPLACHENO_SCH_RUB;
summa_rub_s_nds_dolya=null;
OPLACHENO_RUB=null;
END
[/more]

Добавлено:

Цитата:
Правда, отличие есть: russko отвечает на вопросы и пытается разобраться в своей проблеме


Я бы может и забил на это...но кол-во записей, выводимых данной процедурой, растет ежедневно на 100-200 и следовательно времени на обработку тратиться все больше и больше. Скоро можно придти к ситуации, когда и ночи не хватит на выполнение и пополнение (
Автор: exteris
Дата сообщения: 28.11.2014 10:09

Цитата:
Проблема очевидно кроется во втором подзапросе.

Ну так и продолжайте выцеплять, что в это подзапросе тормозит.
Лично меня смущают множественные подселекты, типа - ,(select RESULT_SUMMA from NPC_SCHETA_OPL_NEOPL(NSz.ID,1,2,null,NSz.summa_v_valute_sch)) OPLACHENO_PROCENTOV
Автор: miwa
Дата сообщения: 28.11.2014 10:22
russko

Цитата:
Проблема очевидно кроется во втором подзапросе. Без него все выполняется в считанные минуты.

Тогда выполните только этот подзапрос, выполните его и покажите его план выполнения и статистику (все что выводит ИБексперт после выполнения запроса в нижней части экрана).
Автор: russko
Дата сообщения: 28.11.2014 10:56
Спасибо всем за участие...навели на путь истинный )
Причина всех тормозов получается в двух таблицах, в которых программист напихал кучу вычисляемых полей..даже простой фэтч по любой из этих таблиц происходит крайне долго.

Теперь буду искать где эти поля используются и как от них отказаться...если конечно получится (
Автор: miwa
Дата сообщения: 28.11.2014 12:34
Ну это надо очень постараться, чтобы вычисляемыми полями затормозить простую выборку. Дело ваше, но я бы таки посмотрел на DDL этой таблицы, а также на статистику и план обсуждаемого запроса. Возможно, еще пара путей найдется. Всегда лучше больше путей, чем меньше
Автор: chAlx
Дата сообщения: 28.11.2014 15:54

miwa:

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

А все люди в чём-то некомпетентны. (Sic: 300 не одновременных подключений, а всего клиентов.) Есть такие, кто тупит и разбираться не хочет, а есть просто неопытные. На том форуме принято заранее считать всех тупыми: мол, не смог решить квесты и продраться через строй насмешников -- не очень-то и хотел. Это не всем подходит и едва ли может считаться нормой.

Наводящие вопросы должны помогать разобраться, а не иллюстрировать, какой автор недоумок, раз не знает про тонкости реализации разных версий сервера, которые знают все 10 местных завсегдатаев (половина, по-совместительству, пишет код сервера или статьи про него). Если намёк, понятный своим, непонятен адресату -- скорее всего, он неправильно сформулирован. А точнее, он вообще написан, чтобы между собой поржать над тупицей, а не чтобы помочь.


Цитата:
Отдельно один учасник форума пытается троллить другого (не ТС-а). Плюс не забываем контекст - ТС уже один раз успел всем поднадоесть другим топиком

А не надо троллить, переходить на личности, учитывать контекст не относящихся к теме топиков, учить жить. Для этого есть другие разделы.


Цитата:
Мы тоже задаем ему вопросы, пытаемся гадать на хрустальном шаре.


Ответ в стиле sql.ru:
Ставлю на FetchAll = ~ 2 часа
Это вообще не ответ на вопрос, это как бы обращение к окружающим ("своим"). Да, прошаренному пользователю оно может помочь, но если не помогло -- это не значит, что он лишается права на помощь. И так понятно, что самые прошаренные таких вопросов не задают.
Хотя в единичном намёке нет ничего плохого, если после него не разворачивается троллинг про то, "как можно не допереть до тривиальных вещей, когда уже тыкнули носом". Здесь вот последовали уточнения и решение проблемы, на sql.ru скорее всего никто бы не удосужился "разжевать очевидную истину". Наводку не осилил -- лох. А вот это надо тут же обсудить -- на фоне нубов легко казаться асом.

Сравни с нормальными ответами:
попробуйте перед запуском процедуры это всё отключать а после - включать
Вы говорили про select * from ... А вас спросили за select count(*) from ...
Это -- конкретные действия, которые можно реально выполнить и продвинуться в решении. Не все попадают пальцем в небо, но и в личность ТСа вообще не тыкают. А на флуд на РуБорде модераторы реагируют чётко, а не "пусть тешатся, они же ветераны".


Просто надо понимать, что IT -- тема реально сложная. Да, очень интересно общаться с профессионалами, узнавать от них что-то новое. Но объективная реальность такова, что профессионалы далеко не все. Если не хочешь с такими общаться -- сиди и помалкивай, никто не тянет. Если полез отвечать -- сделай так, чтобы помочь автору решить заданный вопрос, а не осознать свою ничтожность. В конце-концов, такие площадки в сети создаются в первую очередь для взаимопомощи (и извлечения прибыли из уникального трафика), а потом уж для пустого трёпа завсегдатаев.

В IT постоянно встречаются системы с сотнями переменных факторов. Даже опытному специалисту непросто сформулировать вопрос и перечислить все нужные для ответа условия, не вытаскивая простыню лишних. Да и мало кто станет решать (да и ставить) задачи типа "вот дамп моей виртуалки, что-то тормозит" -- всем подавай локализованную проблему. Поэтому абсолютное большинство пользователей поначалу задаёт вопросы некорректно: очевидно, что раз вопрос возник, то автор не настолько разбирается в теме, чтобы угадать все параметры сразу. И это нормально.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465

Предыдущая тема: Сравнение двух строк


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.