Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Есть-ли возможность ускорить запрос? / 17 сообщений из 17, страница 1 из 1
03.11.2016, 18:48
    #39341115
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
Добрый вечер!
FB 2.55

Есть запрос вида:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select t1.field1,
(select  t3.res 
from Table3 t3, Table2 t2
 where t2.id=t3.fk
 and t2.fk=t1.id) res

   from Table1 t1 where  ..... 



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

Начал перебирать варианты, поскольку запрос в скобках (выборка из Table2 и Table3) по-прежнему исполнялся быстро (возвращал 14 записей за 20ms).
Попробовал вынести этот запрос (в скобках который) под WITH в конструкцию WITH ........ SELECT ....,
попробовал этот-же запрос соединить JOIN'ом с основным запросом.
В обоих случаях общий запрос выполнялся, выдавал те-же записи, но увы, скорость практически не менялась, оба они исполнялись за те-же полторы секунды.
Пришлось пойти на радикальные меры. Создал процедуру в ней сначала выполняется запрос из Table1 и Table2, результат заливается во временную таблицу и уже она JOIN'ится с Table1.
Общее время получения результата чуть более 20ms. Т.е. задача решена, снова всё летает,
но осталась заноза, может быть можно решить задачу ускорения запроса без использования временной таблицы?
...
Рейтинг: 0 / 0
03.11.2016, 20:52
    #39341179
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
zeon11но осталась заноза, может быть можно решить задачу ускорения запроса без использования временной таблицы?
Планы запросов и ddl таблиц есть?
...
Рейтинг: 0 / 0
03.11.2016, 20:53
    #39341180
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
wadmanzeon11но осталась заноза, может быть можно решить задачу ускорения запроса без использования временной таблицы?
Планы запросов и ddl таблиц есть?
Чую себя гопником.
...
Рейтинг: 0 / 0
03.11.2016, 21:03
    #39341190
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
wadmanwadmanпропущено...
Планы запросов и ddl таблиц есть?
Чую себя гопником.
- Есть смысл жизни?
- Нет!
- А если найду?
...
Рейтинг: 0 / 0
04.11.2016, 02:45
    #39341305
stanilar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
Неудобно что скрипт неполный. Вообще говоря, проблема не в запросе в скобках, а в том как его понял оптимизатор.
...
Рейтинг: 0 / 0
04.11.2016, 13:54
    #39341437
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
Вот собственно запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
select s.*,
         (select p.val from caseexperting_caseexpert p
         inner join caseexperting c on (p.xcaseexperting=c.xcaseexperting)
         where s.xcaseexpert=p.xcaseexpert and c.xcaserecord=:XCASERECORD) res
     from get_child('caseexpert', 0) g inner join caseexpert s on (g.x=s.xcaseexpert)
          where s.use=1
          order by s.visorder



Процедура GET_CHILD выводит иерархию дерева.
таблица CASEEXPERT "деревянная", в ней хранится шаблон-опросник, на основе которого оценивается качество лечения пациента. Здесь проблем нет, всё отрабатывается очень быстро.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE CASEEXPERT (
    XCASEEXPERT  DX /* DX = INTEGER NOT NULL */,
    NAME         STRING90 /* STRING90 = VARCHAR(90) */,
    XPARENT      DX /* DX = INTEGER NOT NULL */,
    CHILDCOUNT   DINTLONGCOUNT /* DINTLONGCOUNT = INTEGER DEFAULT 0 CHECK(VALUE >=0) */,
    USE          BOOLEAN DEFAULT 1 /* BOOLEAN = SMALLINT DEFAULT 0 CHECK(VALUE BETWEEN 0 AND 1) */,
    VAL          DCENT /* DCENT = INTEGER DEFAULT 100 NOT NULL CHECK(value between 0 and 100) */,
    KOD          STRING4 /* STRING4 = VARCHAR(4) */,
    DEF          BOOLEAN /* BOOLEAN = SMALLINT DEFAULT 0 CHECK(VALUE BETWEEN 0 AND 1) */,
    VISORDER     DINTSHORT /* DINTSHORT = SMALLINT */
);


ALTER TABLE CASEEXPERT ADD CONSTRAINT PK_CASEEXPERT PRIMARY KEY (XCASEEXPERT);

ALTER TABLE CASEEXPERT ADD CONSTRAINT FK_CASEEXPERT_1 FOREIGN KEY (XPARENT) REFERENCES CASEEXPERT (XCASEEXPERT);




Таблица CASEEXPERTING - заголовок ответов медицинского эксперта по конкретной истории болезни (CASERECORD)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE CASEEXPERTING (
    XCASEEXPERTING  DX /* DX = INTEGER NOT NULL */,
    XCASERECORD     DX /* DX = INTEGER NOT NULL */,
    UKLMARK         DINTCOUNT DEFAULT 0 /* DINTCOUNT = INTEGER DEFAULT 0 NOT NULL */,
    EXPERT          STRING40 /* STRING40 = VARCHAR(40) */,
    MEMO            DBLOB /* DBLOB = BLOB SUB_TYPE 0 SEGMENT SIZE 80 */,
    DATEMO          DTS /* DTS = TIMESTAMP DEFAULT 'NOW' */
);

ALTER TABLE CASEEXPERTING ADD CONSTRAINT PK_CASEEXPERTING PRIMARY KEY (XCASEEXPERTING);

ALTER TABLE CASEEXPERTING ADD CONSTRAINT FK_CASEEXPERTING_1 FOREIGN KEY (XCASERECORD) REFERENCES CASERECORD (XCASERECORD);




в CASEEXPERTING_CASEEXPERT детальная расшифровка ответов эксперта

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE CASEEXPERTING_CASEEXPERT (
    XCASEEXPERTING  DX /* DX = INTEGER NOT NULL */,
    XCASEEXPERT     DX /* DX = INTEGER NOT NULL */,
    VAL             DCENT /* DCENT = INTEGER DEFAULT 100 NOT NULL CHECK(value between 0 and 100) */
);

ALTER TABLE CASEEXPERTING_CASEEXPERT ADD CONSTRAINT PK_CASEEXPERTING_CASEEXPERT PRIMARY KEY (XCASEEXPERT, XCASEEXPERTING);

ALTER TABLE CASEEXPERTING_CASEEXPERT ADD CONSTRAINT FK_CASEEXPERTING_CASEEXPERT_1 FOREIGN KEY (XCASEEXPERTING) REFERENCES CASEEXPERTING (XCASEEXPERTING);
ALTER TABLE CASEEXPERTING_CASEEXPERT ADD CONSTRAINT FK_CASEEXPERTING_CASEEXPERT_2 FOREIGN KEY (XCASEEXPERT) REFERENCES CASEEXPERT (XCASEEXPERT);




Вот план из IBExpert'a:
План
PLAN JOIN (P INDEX (FK_CASEEXPERTING_CASEEXPERT_2), C INDEX (PK_CASEEXPERTING))
PLAN SORT (JOIN (S INDEX (RDB$PRIMARY61), GET_CHILD NATURAL)(S INDEX (SHOP_XPARENT))(S INDEX (RDB$PRIMARY35))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (XPKSERVICE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_KBK))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_FINANCE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_EATER))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_STATUS))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (PK_STATUS))SORT ((S NATURAL))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (RDB$PRIMARY44))(GET_CHILD NATURAL)(S INDEX (WARE_XPARENT))(S INDEX (PK_FILES))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_CASEEXPERT))(GET_CHILD NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (RDB$PRIMARY117))(GET_CHILD NATURAL)(S INDEX (OMS_PERIOD_XPARENT))(S INDEX (PK_STENCIL))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_DIRECTORY))(GET_CHILD NATURAL)(S INDEX (UNQ1_DIRECTORY_NAME))(S INDEX (PK_CASEEXPERT)))

Адаптированный план
PLAN JOIN (P INDEX (FK_CASEEXPERTING_CASEEXPERT_2), C INDEX (PK_CASEEXPERTING))
PLAN SORT (JOIN (S INDEX (INTEG_108), GET_CHILD NATURAL)(S INDEX (SHOP_XPARENT))(S INDEX (INTEG_68))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (XPKSERVICE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_KBK))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_FINANCE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_EATER))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_STATUS))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (PK_STATUS))SORT ((S NATURAL))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (INTEG_134))(GET_CHILD NATURAL)(S INDEX (WARE_XPARENT))(S INDEX (PK_FILES))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_CASEEXPERT))(GET_CHILD NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (INTEG_212))(GET_CHILD NATURAL)(S INDEX (OMS_PERIOD_XPARENT))(S INDEX (PK_STENCIL))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_DIRECTORY))(GET_CHILD NATURAL)(S INDEX (UNQ1_DIRECTORY_NAME))(S INDEX (PK_CASEEXPERT)))

------ Performance info ------
Prepare time = 0ms
Execute time = 4s 968ms
Avg fetch time = 146.12 ms
Current memory = 18 268 368
Max memory = 18 860 944
Memory buffers = 2 048
Reads from disk to cache = 120 355
Writes from cache to disk = 0
Fetches from cache = 5 833 926
...
Рейтинг: 0 / 0
04.11.2016, 14:00
    #39341439
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
zeon11
Код: sql
1.
2.
     from get_child('caseexpert', 0) g inner join caseexpert s on (g.x=s.xcaseexpert)
          where s.use=1

Попробуй заменить это на

Код: sql
1.
2.
3.
     from get_child('caseexpert', 0) g left join caseexpert s on (g.x=s.xcaseexpert)
    where s.use =1  
      and s.xcaseexpert is not null
...
Рейтинг: 0 / 0
04.11.2016, 14:45
    #39341456
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
hvlad,

Код: sql
1.
2.
3.
4.
5.
6.
7.
select s.*,
         (select p.val from caseexperting_caseexpert p
         inner join caseexperting c on (p.xcaseexperting=c.xcaseexperting)
         where s.xcaseexpert=p.xcaseexpert and c.xcaserecord=:XCASERECORD) res
  from get_child('caseexpert', 0) g left join caseexpert s on (g.x=s.xcaseexpert)
    where s.use =1  
      and s.xcaseexpert is not null




План
PLAN JOIN (P INDEX (FK_CASEEXPERTING_CASEEXPERT_2), C INDEX (PK_CASEEXPERTING))
PLAN JOIN (S INDEX (RDB$PRIMARY61), GET_CHILD NATURAL)(S INDEX (SHOP_XPARENT))(S INDEX (RDB$PRIMARY35))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (XPKSERVICE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_KBK))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_FINANCE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_EATER))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_STATUS))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (PK_STATUS))SORT ((S NATURAL))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (RDB$PRIMARY44))(GET_CHILD NATURAL)(S INDEX (WARE_XPARENT))(S INDEX (PK_FILES))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_CASEEXPERT))(GET_CHILD NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (RDB$PRIMARY117))(GET_CHILD NATURAL)(S INDEX (OMS_PERIOD_XPARENT))(S INDEX (PK_STENCIL))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_DIRECTORY))(GET_CHILD NATURAL)(S INDEX (UNQ1_DIRECTORY_NAME))(S INDEX (PK_CASEEXPERT))

Адаптированный план
PLAN JOIN (P INDEX (FK_CASEEXPERTING_CASEEXPERT_2), C INDEX (PK_CASEEXPERTING))
PLAN JOIN (S INDEX (INTEG_108), GET_CHILD NATURAL)(S INDEX (SHOP_XPARENT))(S INDEX (INTEG_68))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (XPKSERVICE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_KBK))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_FINANCE))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_EATER))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_STATUS))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (PK_STATUS))SORT ((S NATURAL))(GET_CHILD NATURAL)SORT ((S NATURAL))(S INDEX (INTEG_134))(GET_CHILD NATURAL)(S INDEX (WARE_XPARENT))(S INDEX (PK_FILES))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_CASEEXPERT))(GET_CHILD NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (INTEG_212))(GET_CHILD NATURAL)(S INDEX (OMS_PERIOD_XPARENT))(S INDEX (PK_STENCIL))(GET_CHILD NATURAL)(S NATURAL)(S INDEX (PK_DIRECTORY))(GET_CHILD NATURAL)(S INDEX (UNQ1_DIRECTORY_NAME))(S INDEX (PK_CASEEXPERT))

------ Performance info ------
Prepare time = 0ms
Execute time = 4s 797ms
Avg fetch time = 154.74 ms
Current memory = 18 649 224
Max memory = 24 646 116
Memory buffers = 2 048
Reads from disk to cache = 120 448
Writes from cache to disk = 0
Fetches from cache = 5 833 954



Похоже, ничего не изменилось.
...
Рейтинг: 0 / 0
04.11.2016, 15:59
    #39341480
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
zeon11,

похоже, придётся смотреть в get_child

Еще полезно посмотреть на потабличную статистику
...
Рейтинг: 0 / 0
04.11.2016, 16:40
    #39341500
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
Get_child никогда не подводил.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
create or alter procedure GET_CHILD (
    TABLENAME varchar(31),
    X_ integer)
returns (
    X integer,
    NAME varchar(512))
as
declare variable CC integer;
begin
  x=:x_;

  if (:tablename='caseexpert') then
   begin
     select s.name, s.childcount from caseexpert s where s.xcaseexpert=:x_ into :name, :cc;
     suspend;
     if (:cc>0) then
        for select s.xcaseexpert, s.name from caseexpert s where s.xparent=:x_ order by s.xcaseexpert into :x, :name
          do for select g.x, g.name from get_child(:tablename, :x) g into :x, :name do suspend;
   end


end



А как по-табличную статистику получить?
...
Рейтинг: 0 / 0
04.11.2016, 16:42
    #39341501
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
zeon11А как по-табличную статистику получить?Ну ты же в IBE запросы выполняешь...
...
Рейтинг: 0 / 0
04.11.2016, 16:44
    #39341503
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
zeon11Get_child никогда не подводил.Или это не тот get_child, или планы не от того запроса
...
Рейтинг: 0 / 0
04.11.2016, 18:03
    #39341542
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
hvlad,

get_child у меня был универсальной процедурой, работающей со многими таблицами-деревьями, поэтому и план был такой монструозный, выше я представил скрипт из которого выкинул обработки для других таблиц. Сейчас сделал другую процедуру:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create or alter procedure GET_CHILD_NN (
    X_ integer)
returns (
    X integer,
    NAME varchar(512))
as
declare variable CC integer;
begin
  x=:x_;

     select s.name, s.childcount from caseexpert s where s.xcaseexpert=:x_ into :name, :cc;
     suspend;
     if (:cc>0) then
        for select s.xcaseexpert, s.name from caseexpert s where s.xparent=:x_ order by s.xcaseexpert into :x, :name
          do for select g.x, g.name from GET_CHILD_nn(:x) g into :x, :name do suspend;

end




В IBE нажал кнопку Copy Analisis to Clipboard. Эта база старая, тут ещё меньше 1 млн. записей.

Query
------------------------------------------------
select s.*,
(select p.val from caseexperting_caseexpert p
inner join caseexperting c on (p.xcaseexperting=c.xcaseexperting)
where s.xcaseexpert=p.xcaseexpert and c.xcaserecord=:XCASERECORD) res
from get_child_nn(0) g left join caseexpert s on (g.x=s.xcaseexpert)
where s.use =1

Plan
------------------------------------------------
PLAN JOIN (P INDEX (FK_CASEEXPERTING_CASEEXPERT_2), C INDEX (PK_CASEEXPERTING))
PLAN JOIN (S INDEX (PK_CASEEXPERT), GET_CHILD_NN NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (PK_CASEEXPERT))

Query Time
------------------------------------------------
Prepare : 16.00 ms
Execute : 4 859.00 ms
Avg fetch time: 186.88 ms

Memory
------------------------------------------------
Current: 19 020 632
Max : 24 646 116
Buffers: 2 048

Operations
------------------------------------------------
Read : 120 448
Writes : 0
Fetches: 5 833 954
Marks : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
| Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts | Backouts | Purges | Expunges |
| | Total | reads | reads | | | | | | |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|CASEEXPERT | 0 | 233 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|CASEEXPERTING | 0 | 833097 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|CASEEXPERTING_CASEEXPERT | 0 | 833097 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+

...
Рейтинг: 0 / 0
04.11.2016, 18:29
    #39341554
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
Гм, насколько я догадываюсь, подзапрос в основном select'е не может вернуть более одной записи,
поэтому его можно внести в тело основного запроса, например вот так
Код: sql
1.
2.
3.
4.
5.
6.
7.
select s.*, p.val as res
  from get_child('caseexpert', 0) g 
         inner join caseexpert s on g.x = s.xcaseexpert
         inner join caseexperting_caseexpert p on s.xcaseexpert = p.xcaseexpert
         inner join caseexperting c on p.xcaseexperting = c.xcaseexperting
 where s.use = 1
   and c.xcaserecord = :XCASERECORD



Ещё интересно посмотреть на план и статистику вот такого запроса
Код: sql
1.
2.
3.
4.
5.
6.
select s.*, p.val as res
  from caseexpert s on g.x = s.xcaseexpert
         inner join caseexperting_caseexpert p on s.xcaseexpert = p.xcaseexpert
         inner join caseexperting c on p.xcaseexperting = c.xcaseexperting
 where s.use = 1
   and c.xcaserecord = :XCASERECORD
...
Рейтинг: 0 / 0
04.11.2016, 19:23
    #39341572
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
hvlad,

Мне нужно именно вывести на клиента полностью шаблон со всеми вариантами и прикрутить колонку в которой врач-эксперт в свое время поставил значение. на рисунке это колонка RES.
Значения там 100 (имеется ввиду 100 %), поскольку конкретная карта заполняется автоматом на основании поля DEF, типа всех лечим хорошо, по всем параметрам на 100%, но эксперт может оценить каждый из 14 параметров конкретного пациента и в 0%, 25%, 50%, 75%.
Тут запрос может быть только с левым джойном.

если Join'ить три таблицы и процедуру, то получим не тот результат - выведутся всего 14 строчек с установленными параметрами.

В принципе, как уже писал выше задачу скорости решил через заливку во временную таблицу.
...
Рейтинг: 0 / 0
05.11.2016, 01:48
    #39341707
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
Попробуй ещё вот такое, если не надоело


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT S.*,
       (SELECT P.VAL
          FROM CASEEXPERTING_CASEEXPERT P RIGHT JOIN CASEEXPERTING C ON P.XCASEEXPERTING = C.XCASEEXPERTING
         WHERE S.XCASEEXPERT = P.XCASEEXPERT
           AND C.XCASERECORD = :XCASERECORD
           AND P.XCASEEXPERT IS NOT NULL
       ) RES
  FROM GET_CHILD_NN(0) G LEFT JOIN CASEEXPERT S ON G.X = S.XCASEEXPERT
 WHERE S.USE = 1
   AND S.XCASEEXPERT IS NOT NULL
ORDER BY S.VISORDER
...
Рейтинг: 0 / 0
05.11.2016, 04:54
    #39341714
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Есть-ли возможность ускорить запрос?
hvladПопробуй ещё вот такое, если не надоело


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT S.*,
       (SELECT P.VAL
          FROM CASEEXPERTING_CASEEXPERT P RIGHT JOIN CASEEXPERTING C ON P.XCASEEXPERTING = C.XCASEEXPERTING
         WHERE S.XCASEEXPERT = P.XCASEEXPERT
           AND C.XCASERECORD = :XCASERECORD
           AND P.XCASEEXPERT IS NOT NULL
       ) RES
  FROM GET_CHILD_NN(0) G LEFT JOIN CASEEXPERT S ON G.X = S.XCASEEXPERT
 WHERE S.USE = 1
   AND S.XCASEEXPERT IS NOT NULL
ORDER BY S.VISORDER



ОПА! Волшебник! Снимаю шляпу!
109ms к 'холодному' серверу!
Query
------------------------------------------------
SELECT S.*,
(SELECT P.VAL
FROM CASEEXPERTING_CASEEXPERT P RIGHT JOIN CASEEXPERTING C ON P.XCASEEXPERTING = C.XCASEEXPERTING
WHERE S.XCASEEXPERT = P.XCASEEXPERT
AND C.XCASERECORD = :XCASERECORD
AND P.XCASEEXPERT IS NOT NULL
) RES
FROM GET_CHILD_NN(0) G LEFT JOIN CASEEXPERT S ON G.X = S.XCASEEXPERT
WHERE S.USE = 1
AND S.XCASEEXPERT IS NOT NULL
ORDER BY S.VISORDER

Plan
------------------------------------------------
PLAN JOIN (C INDEX (FK_CASEEXPERTING_1), P INDEX (PK_CASEEXPERTING_CASEEXPERT))
PLAN SORT (JOIN (S INDEX (PK_CASEEXPERT), GET_CHILD_NN NATURAL)(S ORDER PK_CASEEXPERT INDEX (FK_CASEEXPERT_1))(S INDEX (PK_CASEEXPERT)))

Query Time
------------------------------------------------
Prepare : 0.00 ms
Execute : 109.00 ms
Avg fetch time: 4.19 ms

Memory
------------------------------------------------
Current: 17 803 988
Max : 18 860 908
Buffers: 2 048

Operations
------------------------------------------------
Read : 22
Writes : 0
Fetches: 1 576
Marks : 0


Enchanced Info:
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
| Table Name | Records | Indexed | Non-Indexed | Updates | Deletes | Inserts | Backouts | Purges | Expunges |
| | Total | reads | reads | | | | | | |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+
|CASEEXPERT | 0 | 233 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|CASEEXPERTING | 0 | 78 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|CASEEXPERTING_CASEEXPERT | 0 | 14 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+-------------------------------+-----------+-----------+-------------+---------+---------+---------+----------+----------+----------+


запрос к 'разогретому' серверу 16ms!
запрос к 'горячему' серверу 0ms!

hvlad, !!!!!!!!!!!!
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Есть-ли возможность ускорить запрос? / 17 сообщений из 17, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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