|
|
|
оптимизация процедуры
|
|||
|---|---|---|---|
|
#18+
Добрый день всем, подскажите пожалуйста есть процедурка(упрощенна для наглядности): Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. но 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" подскажите как поправить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 11:34:12 |
|
||
|
оптимизация процедуры
|
|||
|---|---|---|---|
|
#18+
Ну наверное в первом случае Код: sql 1. никто не знает что там будет в p_fcompare а во втором Код: sql 1. эквивалентно Код: sql 1. что ясно с самого начала ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 11:43:03 |
|
||
|
оптимизация процедуры
|
|||
|---|---|---|---|
|
#18+
>m7m в том то и дело что тут может быть и '%testdata' и 'testdata%' и всяко разно, нельзя ли перестраивать план перед выполнением процедуры/запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 11:48:44 |
|
||
|
оптимизация процедуры
|
|||
|---|---|---|---|
|
#18+
zloyGamerв том то и дело что тут может быть и '%testdata' и 'testdata%' и всяко разно, нельзя ли перестраивать план перед выполнением процедуры/запроса?нельзя: план генерится сразу. Сделайте if-else с предварит. анализом на отсутствие '%' в начале p_fcompare (если "%" нет, то идём по ветке с where t.fcompare starting with :p_fcompare, иначе по like). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2014, 12:27:49 |
|
||
|
оптимизация процедуры
|
|||
|---|---|---|---|
|
#18+
спасибо, но этот вариант не очень нравится.., можно ли как то в самом запросе что то сделать? может типа 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 ; дело в том что сам запрос на вставку не маленький ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2014, 09:07:48 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38538727&tid=1563936]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
424ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 185ms |
| total: | 670ms |

| 0 / 0 |
