|
|
|
Как ускорить запрос с between'ом
|
|||
|---|---|---|---|
|
#18+
Добрый день. Есть у меня две процедуры, возвращающие наборы данных. ALTER PROCEDURE GETUPL ( ME INTEGER) RETURNS ( PR INTEGER, S NUMERIC(15,2)) AS begin for select pr, sum(s) as s from upl where me=:me group by pr union select pr, CAST (0 AS numeric(15,2)) as s from sppr where pr not in (select pr from upl where me=:me) into :pr, :s do suspend; end и ALTER PROCEDURE GETUPLBYINT ( ME1 INTEGER, ME2 INTEGER) RETURNS ( PR INTEGER, S NUMERIC(15,2)) AS begin for select pr, sum(s) as s from upl where me between :me1 and :me2 group by pr union select pr, CAST (0 AS numeric(15,2)) as s from sppr where pr not in (select pr from upl where me between :me1 and :me2) into :pr, :s do suspend; end Где - sppr - таблица-список всех аббанентов. Ключевое поле - pr. Upl - оплата, произведенная абанентом pr в месяце me. Первая процедура возвращает оплату за определенный месяц (параметр me), для тех, у кого ее нет возвращает нули. Вторая - то же самое, только за период с me1 до me2. Первая процедура работает бовольно быстро, а вторая во много раз медленнее (причем не зависимо от расстояния между me1 и me2). Имею индексы по Sppr.pr, upl.pr, upl.me, upl.(pr,me). Как можно ускорить этот процес? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 07:04:20 |
|
||
|
Как ускорить запрос с between'ом
|
|||
|---|---|---|---|
|
#18+
http://ibase.ru/devinfo/dontdoit.htm пункт 15. IN-это и есть тормаза процедуры попробуй поменять чтобы это избежать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 08:34:52 |
|
||
|
Как ускорить запрос с between'ом
|
|||
|---|---|---|---|
|
#18+
Попробуй так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Производительность не оценивал, но IN(SELECT...) это точно тормоз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 11:11:32 |
|
||
|
Как ускорить запрос с between'ом
|
|||
|---|---|---|---|
|
#18+
С IN - все понятно. Основный тормоза от него, но вот, кстати, интересно UNION как-то влтяет на производительность. Я бы, например, в таком случае: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Написал бы так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.06.2004, 11:41:10 |
|
||
|
Как ускорить запрос с between'ом
|
|||
|---|---|---|---|
|
#18+
Спасибо всем, кто откликнулся. Как не странно (хотя, наверное ничего странного в этом нет) производительность данного (и других ему подобных) запросов многократно возрасла заменой IB 6.0.1 на FB 1.5. Видимо он более корректно работает с индексами. 2 Dremuchij Forester Спасибо за вариант, только я толком не понял, что он там возвращает (видимо не то, что я хотел). А хоте я так просуммировать все S с группировкой по PR из UPL и дополнить ее теми номерами ( PR ), которых нет в UPL . 2 doroshka Спасибо. Без union'а действительно полегче. Так "оригинальный" запром выполняется в среднем за 70 мс, а твой - за 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2004, 06:22:21 |
|
||
|
Как ускорить запрос с between'ом
|
|||
|---|---|---|---|
|
#18+
MValСпасибо. Без union'а действительно полегче. Так "оригинальный" запром выполняется в среднем за 70 мс, а твой - за 10. Я бы на твоем месте изначально заменил UNION на UNION ALL и получил бы те же самые 10 мс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2004, 13:25:02 |
|
||
|
Как ускорить запрос с between'ом
|
|||
|---|---|---|---|
|
#18+
dimitr...заменил UNION на UNION ALL и получил бы те же самые 10 мс. Спасибо, это и интересно было узнать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2004, 10:18:55 |
|
||
|
Как ускорить запрос с between'ом
|
|||
|---|---|---|---|
|
#18+
Ага, накосячил. Надо в обеих процедурах ... for SELECT pr FROM /* не upl , а*/ sppr INTO :PR do ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.06.2004, 10:55:57 |
|
||
|
Как ускорить запрос с between'ом
|
|||
|---|---|---|---|
|
#18+
2remuchij Forester А вот теперь заработал как надо. Что касается скорости выполнения то вариант doroshka (то же с union all) на FB 1.5 работает в полтара раза быстрее. Зато на IB 6 или на FB 1.0 твой вариант значительно быстрее (примерно раз в 100). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.06.2004, 09:13:46 |
|
||
|
Как ускорить запрос с between'ом
|
|||
|---|---|---|---|
|
#18+
NOT IN замечательно меняется на NOT EXISTS, при этом значительно возрастает скорость, а еще лучше в данном случае на JOIN. UNION меняем на UNION ALL, правда нужно посмотреть на повторяемость результирующих записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.06.2004, 19:36:36 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32553814&tid=1578393]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
170ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 190ms |
| total: | 436ms |

| 0 / 0 |
