Вылетает фаербёрд 1.5

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

Вылетает фаербёрд 1.5

Сообщение Deniska » 10 мар 2005, 12:32

Здравствуйте .
Проблемка такая
select g.doc_id
from get_all_date_sum(1,1) g, pid i
where i.pid=g.doc_id этот запрос работает замечательно

select g.doc_id,g.end_date
from get_all_date_sum(1,1) g, pid i
where i.pid=g.doc_id а на этом вылетает фаербёрд
Вроде всё элементарно просто . уже и джоинить пытался ничего не помогает :(

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 10 мар 2005, 13:44

Давай метаданные, будем проверять.

Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

вот сама процедура

Сообщение Deniska » 10 мар 2005, 14:21

Код: Выделить всё

REATE PROCEDURE GET_ALL_DATE_SUM (
    FIRM INTEGER,
    SOME_CUR NUMERIC(16,4))
RETURNS (
    DOC_ID INTEGER,
    DOC_TO_ID INTEGER,
    DOC_USER_ID INTEGER,
    DOC_TYPE INTEGER,
    DOC_SUM NUMERIC(16,4),
    OT_SUM NUMERIC(16,4),
    OT_DATE DATE,
    OPL_SUM NUMERIC(16,4),
    OPL_DATE DATE,
    END_DATE DATE,
    DOC_AGENT VARCHAR(100),
    DOC_NO VARCHAR(32),
    THE_DATE DATE,
    DOC_CUR_ID INTEGER,
    DOC_CUR_VAL NUMERIC(16,4),
    OLD_END_DATE DATE)
AS
begin
    FOR SELECT DISTINCT i.id, i.TO_ID, i.USER_ID, i.DOC_TYPE, cast((i.doc_sum*i.currency_value) as numeric(16,2)) r_sum, cast(ot.DOC_SUM as numeric(16,2)), ot.THE_DATE, cast(opl.DOC_SUM as numeric(16,2)), opl.THE_DATE, i.DOC_NO, i.THE_DATE, i.CURRENCY_ID, i.CURRENCY_VALUE,i.END_date
    FROM invoices i, pid p, GET_DOC_SUM_SEB ot, GET_DOC_SUM_SEB_OPL opl
    WHERE i.interval_id <> 9000
    AND i.doc_type in (1, 5, 11)
    AND ot.PARENT_ID=i.id
    AND i.CURRENCY_ID = 1
    AND opl.PARENT_ID=i.id
    AND p.pid=i.id
    AND i.from_id in (SELECT id FROM customer WHERE type_id=1 AND firm = :firm)

UNION ALL

SELECT DISTINCT i.id, i.TO_ID, i.USER_ID, i.DOC_TYPE, cast((i.doc_sum*:SOME_CUR) as numeric(16,2)) r_sum, cast(ot.DOC_SUM as numeric(16,2)), ot.THE_DATE, cast(opl.DOC_SUM as numeric(16,2)), opl.THE_DATE, i.DOC_NO, i.THE_DATE, i.CURRENCY_ID, i.CURRENCY_VALUE,i.END_date
    FROM invoices i, pid p, GET_DOC_SUM_SEB ot, GET_DOC_SUM_SEB_OPL opl
    WHERE i.interval_id <> 9000
    AND i.doc_type in (1, 5, 11)
    AND ot.PARENT_ID=i.id
    AND i.CURRENCY_ID <> 1
    AND opl.PARENT_ID=i.id
    AND p.pid=i.id
    AND i.from_id in (SELECT id FROM customer WHERE type_id=1 AND firm = :firm)
    INTO :DOC_ID, :DOC_TO_ID, :DOC_USER_ID, :DOC_TYPE, :DOC_SUM, :OT_SUM, :OT_DATE, :OPL_SUM, :OPL_DATE,  :DOC_NO, :THE_DATE, :DOC_CUR_ID, :DOC_CUR_VAL,:OLD_END_DATE
    DO BEGIN
    END_DATE=null  ;
    if ((OT_SUM = OPL_SUM) AND (OT_SUM = DOC_SUM) AND (DOC_SUM = OPL_SUM)) then
        begin
            if(OT_DATE > OPL_DATE) then END_DATE = OT_DATE;
                else END_DATE = OPL_DATE;
        end
       suspend;
    END
  /* Procedure Text */
end

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 10 мар 2005, 14:35

И что это? :evil:

Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

Сообщение Deniska » 10 мар 2005, 14:53

А чо именно надо ???
дамп всей базы :)?

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 10 мар 2005, 17:14

Deniska писал(а):А чо именно надо ???
дамп всей базы :)?
Еще структура таблиц нужна.

Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

всё что учавствует

Сообщение Deniska » 11 мар 2005, 19:43

Код: Выделить всё

CREATE PROCEDURE GET_DOC_SUM_SEB 
RETURNS (
    PARENT_ID INTEGER,
    DOC_SUM NUMERIC(16,4),
    THE_DATE DATE)
AS
begin
    FOR SELECT DISTINCT h.PARENT_ID out_id, sum(i.doc_sum) out_sum, max(i.the_date) out_date
    FROM GET_DOC_HISTORY h, INVOICES I
    WHERE h.ID=i.id
    AND i.doc_type in (1, 11)
    AND i.interval_id <> 9000
    GROUP BY h.parent_ID
    INTO :PARENT_ID, :DOC_SUM, :THE_DATE
    DO BEGIN
     suspend;
    END
end

CREATE PROCEDURE GET_DOC_SUM_SEB_OPL 
RETURNS (
    PARENT_ID INTEGER,
    DOC_SUM NUMERIC(16,4),
    THE_DATE DATE)
AS
begin
    FOR SELECT DISTINCT h.PARENT_ID out_id, sum(i.doc_sum) out_sum, max(i.the_date) out_date
    FROM GET_DOC_HISTORY h, INVOICES I
    WHERE h.ID=i.id
    AND i.doc_type in (SELECT id FROM DOC_LIST WHERE is_mny = 1 AND is_in=1)
    AND i.interval_id <> 9000
    GROUP BY h.parent_ID
    INTO :PARENT_ID, :DOC_SUM, :THE_DATE
    DO BEGIN
     suspend;
    END
end

CREATE PROCEDURE GET_DOC_HISTORY 
RETURNS (
    PARENT_ID INTEGER,
    ID INTEGER)
AS
DECLARE VARIABLE I INTEGER;
begin
  FOR
    SELECT ID
    FROM invoices
    INTO :PARENT_ID
  DO
    BEGIN
      EXECUTE PROCEDURE GET_ROOT PARENT_ID RETURNING_VALUES ID;
      IF (ID IS NULL) THEN ID = PARENT_ID;
      I = ID;
      SUSPEND;
      IF (I is not null) THEN
      BEGIN
        FOR
            SELECT ID_OUT
            FROM GET_DOC_HIST(:I)
            INTO :ID
        DO BEGIN
          SUSPEND;  
        END
      END
    END
end

CREATE PROCEDURE GET_DOC_HIST (
    ID_IN INTEGER)
RETURNS (
    ID_OUT INTEGER)
AS
DECLARE VARIABLE ID_TEMP INTEGER;
begin
    FOR SELECT ID FROM pid WHERE pid = :ID_IN INTO :ID_TEMP
    DO BEGIN
    ID_OUT = ID_TEMP;
    SUSPEND;

    IF (ID_TEMP IS NOT NULL) THEN
      FOR
        SELECT ID_OUT
        FROM GET_DOC_HIST(:ID_TEMP)
        INTO :ID_OUT
      DO IF (ID_OUT IS NOT NULL) THEN SUSPEND;

    END
end

CREATE TABLE INVOICES (
    ID              IDN /* INTEGER NOT NULL */,
    FROM_ID         IDN /* INTEGER NOT NULL */,
    TO_ID           IDN /* INTEGER NOT NULL */,
    DOC_TYPE        SMALLINT NOT NULL,
    THE_DATE        DATE NOT NULL,
    INTERVAL_ID     SMALLINT NOT NULL,
    DOC_SUM         MNY /* NUMERIC(16,4) */ DEFAULT 0,
    CURRENCY_ID     SMALLINT NOT NULL,
    CURRENCY_VALUE  NUMERIC(16,4) NOT NULL,
    DSC             VARCHAR(200),
    FIRM_ID         SMALLINT NOT NULL,
    DOC_NO          VARCHAR(32),
    USER_ID         INTEGER NOT NULL,
    RESPONSIBLE_ID  INTEGER,
    END_DATE        DATE
);

CREATE TABLE PID (
    ID   IDN /* INTEGER NOT NULL */,
    PID  IDN /* INTEGER NOT NULL */
);

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 12 мар 2005, 08:39

>Deniska
1. Пользуйся кнопкой Code при оформлении!
2. Вот я попросил структуру таблиц, ты ее привел. А вот связи и индексы я не просил, ну и конечно ты их не привел :lol: Возникает вопрос: понимаем что есть метаданные?

Dnico
Сообщения: 12
Зарегистрирован: 18 фев 2005, 16:44

Сообщение Dnico » 12 мар 2005, 16:56

Тааааак ... а версия то какая ? Уж очень подозрительно вылетает ... :roll:

P.S.
Я имел ввиду версию firebird. Знаешь ... там обычно пишется примерно так - WI-V6.3.2.4731 Firebird 1.5

Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

Сообщение Deniska » 14 мар 2005, 19:16

Версия 1.5.1.4481

ALTER TABLE INVOICES ADD PRIMARY KEY (ID);


CREATE INDEX IDX_INVOICES1 ON INVOICES (FROM_ID);
ALTER INDEX IDX_INVOICES1 INACTIVE;
CREATE INDEX IDX_INVOICES2 ON INVOICES (TO_ID);
ALTER INDEX IDX_INVOICES2 INACTIVE;

CREATE INDEX PID_IDX1 ON PID (ID);
CREATE INDEX PID_IDX2 ON PID (PID);
CREATE INDEX PID_IDX3 ON PID (ID, PID);

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 14 мар 2005, 19:50

плятт. Ну домены я, конечно же, и сам догадался заменить типами. А где таблица CUSTOMERS? А DOC_LIST? Почему метаданные задом наперед выдал? Мне делать больше нечего, как делать из этого нормальный скрипт?

Из того, что ты дал, выкинул все, что не компилировалось. Запустил 1.5.1. Сервер не падает на твоем запросе.

Вопрос - FB вылетает на препаре запроса с процедурой или на исполнении? Если второе, то добавь в запрос FIRST 1 и доложи результат.

Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

Сообщение Deniska » 15 мар 2005, 11:26

Падает при подготовке , извените немного завтыкал

Код: Выделить всё

CREATE TABLE DOC_LIST (
    ID              IDN /* INTEGER NOT NULL */,
    PID             IDN /* INTEGER NOT NULL */,
    NAME            VARCHAR(20) NOT NULL,
    IS_IN           SMALLINT NOT NULL,
    FULLNAME        VARCHAR(60),
    NEED_PARENT_ID  SMALLINT NOT NULL,
    DOC_INTERVAL    SMALLINT NOT NULL,
    CREATEPART_ID   SMALLINT NOT NULL,
    IS_MNY          SMALLINT NOT NULL,
    IS_LOCAL        SMALLINT NOT NULL
);

ALTER TABLE DOC_LIST ADD PRIMARY KEY (ID);

CREATE TABLE CUSTOMER (
    ID        IDN /* INTEGER NOT NULL */,
    PID       IDN /* INTEGER NOT NULL */,
    NAME      VARCHAR(20) NOT NULL,
    FIRM      SMALLINT,
    TYPE_ID   SMALLINT NOT NULL,
    FULLNAME  VARCHAR(60),
    ADRES     VARCHAR(50),
    PHONE     VARCHAR(50),
    D_NSV     VARCHAR(16),
    D_NPID    VARCHAR(16),
    OKPO      VARCHAR(20),
    RS        VARCHAR(20),
    BANK      VARCHAR(64),
    ADRES_UR  VARCHAR(50),
    MFO       VARCHAR(8),
    DIRECTOR  VARCHAR(64),
    EMAIL     VARCHAR(100)
);

ALTER TABLE CUSTOMER ADD PRIMARY KEY (ID);

CREATE INDEX IDX_CUSTOMER ON CUSTOMER (PID);
ALTER INDEX IDX_CUSTOMER INACTIVE;



kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 мар 2005, 14:01

Дим, скажи спасибо мне и Хвастунову, что он сделал вывод типа домена в комментарии рядом с доменом по моей просьбе :) а то так над чужими скриптами вообще погибнуть можно...

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 15 мар 2005, 21:14

GET_ROOT тоже потерялась? :evil:

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 15 мар 2005, 21:23

У меня стабильно падает 1.5.0 на обоих запросах, но 1.5.1 и 1.5.2 живут нормально.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 15 мар 2005, 21:34

Все, поймал проблему. Что-то с переполнением внутреннего буфера в сервере. Буду лечить, фикс войдет либо в 2.0, либо в 1.5.3 (коли таковой будет).

К слову, вне IBExpert'а (или любой другой тулзы, которая без спроса показывает план), запрос должен выполниться нормально.

Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

Сообщение Deniska » 16 мар 2005, 12:10

Спасиба за помощь , вопрос решился после установки версии 1.5.2 :)

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 16 мар 2005, 12:39

потому что там чуть другой план сгенерился и влез в буфер :)

нарвешься ли ты снова на эту граблю, чуть изменив свои процедуры - вот это хороший вопрос...

Ответить