powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / оптимизация процедуры
6 сообщений из 6, страница 1 из 1
оптимизация процедуры
    #38538727
zloyGamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем,
подскажите пожалуйста
есть процедурка(упрощенна для наглядности):
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE OR ALTER PROCEDURE UPDATE_test_data (
    p_fcompare  varchar(100))
as
begin

DELETE FROM test_table2 t
WHERE t.fcompare LIKE :p_fcompare 
;

INSERT INTO test_table2
SELECT 
 Field1,
 COUNT(*) AS cnt,
 SUM(Field2) AS fsum       
FROM Test_table1 t
WHERE t.fcompare LIKE :p_fcompare 
GROUP BY
    Field1
;

end



но execute procedure UPDATE_test_data('test1%'); выполняется в течении 2-3мин, хотя отдельно:

DELETE FROM test_table2 t
WHERE t.fcompare LIKE 'test1%'
;

INSERT INTO test_table2
SELECT
Field1,
COUNT(*) AS cnt,
SUM(Field2) AS fsum
FROM Test_table1 t
WHERE t.fcompare LIKE 'test1%'
GROUP BY
Field1
PLAN SORT ((T INDEX (T_my_test_IDX1)));

выполняется не более 2сек.!

проблема в том что в процедуре почему то не используется индекс,
при попытке его задать явно получаю ошибку "index cannot be used in the specified plan"
подскажите как поправить?
...
Рейтинг: 0 / 0
оптимизация процедуры
    #38538745
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну наверное в первом случае
Код: sql
1.
WHERE t.fcompare LIKE :p_fcompare 


никто не знает что там будет в p_fcompare
а во втором
Код: sql
1.
WHERE t.fcompare LIKE 'test1%'


эквивалентно
Код: sql
1.
WHERE t.fcompare starting witch 'test1'


что ясно с самого начала
...
Рейтинг: 0 / 0
оптимизация процедуры
    #38538755
zloyGamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>m7m
в том то и дело что тут может быть и '%testdata' и 'testdata%' и всяко разно,

нельзя ли перестраивать план перед выполнением процедуры/запроса?
...
Рейтинг: 0 / 0
оптимизация процедуры
    #38538799
zloyGamerв том то и дело что тут может быть и '%testdata' и 'testdata%' и всяко разно,

нельзя ли перестраивать план перед выполнением процедуры/запроса?нельзя: план генерится сразу.
Сделайте if-else с предварит. анализом на отсутствие '%' в начале p_fcompare (если "%" нет, то идём по ветке с where t.fcompare starting with :p_fcompare, иначе по like).
...
Рейтинг: 0 / 0
оптимизация процедуры
    #38541504
zloyGamer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо, но этот вариант не очень нравится..,
можно ли как то в самом запросе что то сделать? может типа case или что то похожее

INSERT INTO test_table2
SELECT
Field1,
COUNT(*) AS cnt,
SUM(Field2) AS fsum
FROM Test_table1 t
WHERE t.fcompare LIKE :p_fcompare
GROUP BY
Field1
;

дело в том что сам запрос на вставку не маленький
...
Рейтинг: 0 / 0
оптимизация процедуры
    #38541509
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zloyGamer,

нет так как план запроса строится на этапе препарирования, когда значения параметров ещё не известны
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / оптимизация процедуры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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