|
|
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
Прошу извинить за такую "яркую" тему. Хотелось просто обратить внимание. Я, конечно, понимаю, что так быть не может. Но... Смотрите пример. Имеется таблица на 20 тыс. с лишним записей след.структуры: OKPO Char(10), - идентификационный код клиента All_Dolg Currency, - общий долг клиента Dolg Currency, - долг клиента по одной ссуде ... С одним идентификационным кодом может быть одна или несколько записей. Поле Dolg изначально заполнено числами, поле All_Dolg - пустое. Индексы стоят всевозможные. Выполняем запрос: Update таблица1 set таблица1.All_Dolg=(Select Sum(tab2) from таблица1 tab2 Where tab2.OKPO=таблица1.OKPO) Работает минут 20 На MS SQL такой запрос отрабатывает за 1-2 секунды. В чем проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2003, 22:37 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
проблема во вложенном select напиши ХП и будут те же самые 2 секунды.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2003, 07:19 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
Есть подборка статей на тему вложенных запросов и их оптимизацию http://www.krista.ru/ib/][гдето тут] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2003, 08:08 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
Одна из причин может быть например из-за >Индексы стоят всевозможные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2003, 09:46 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
2 Серега: да там план natural будет. так что и без индексов тормоза мама не горюй будут :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2003, 09:48 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
Эта бадяга называется кореллированный подзапрос, когда идет обращение к внешнему, индексы при таком запросе не помогут. Определенно лучше сделать SP и не парится. Кстати update/insert с индексами проходит дольше, чем без них. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2003, 16:47 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
И все-таки: - кроме всевозможных индексов, есть ли индекс на поле OKPO, в обеих таблицах? Активны ли они, если есть? - каким получается план запроса? - вообще-то такая структура таблицы несколько противоречит идеям о нормализации и проч.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2003, 18:13 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
Отвечаю на все вопросы сразу. 1. На сегодняшний день проблема решена следующим образом: For Select OKPO, Sum(Dolg) From таблица1 Group by OKPO into :tmp_OKPO, :tmp_Dolg do begin update таблица1 set All_Dolg=:tmp_Dolg where OKPO=:tmp_OKPO; end работает в 2-3 раза быстрее, но все равно недостаточно быстро. 2. по полям Dolg b All_Dolg индексов нет. 3. Явно задать план запроса не получается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2003, 19:11 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
Голуб Олег А по полю OKPO индекс имеется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2003, 19:16 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
Да пофиг, есть тут индексы или нет. На 20 тыс. Перебрать 20 тыс. записей без индекса не сложно. Тут дело в другом чём-то. Пускай лучше статистику из эксперта приведёт о количестве операций чтения и обновления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2003, 20:16 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
Вот гоню то. Оно не пофиг, конечно, т.к. кол-во переборов будет 20000*кол-во записей в таблице1 :-) Поэтому там НЕОБХОДИМ индекс! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2003, 20:20 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
очень интересно, только что пробовал: UPDATE TT SET TT.DOLGALL = (SELECT SUM(TT2.DOLG) FROM TT TT2 WHERE TT2.OKPO = TT.OKPO) дает план natural для основного запроса, и для внутреннего селекта, а: UPDATE TT TT1 SET TT1.DOLGALL = (SELECT SUM(TT2.DOLG) FROM TT TT2 WHERE TT2.OKPO = TT1.OKPO) дает использование индекса для внутреннего селекта! (firebird 1.5) Вероятно использование алиаса для внешней таблицы как-то подсказывает оптимизатору, что делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2003, 23:51 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
Вот-вот! Я долго размышлял над этой проблемой, и пришел к выводу, что проблема в том, что Интербейс почему-то не не хочет использовать индексы (и не дает указать их явно) в Update-запросах. А как это обойти? Или может я что-то не понимаю и не так делаю? Кстати. UPDATE TT TT1 SET TT1.DOLGALL = (SELECT SUM(TT2.DOLG) FROM TT TT2 WHERE TT2.OKPO = TT1.OKPO) на Interbase 7 все равно используется без индексов. :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2003, 11:42 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
Да, забыл сказать. По полю OKPO индекс есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2003, 11:45 |
|
||
|
Interbase в 1000 раз медленнее MS SQL ????
|
|||
|---|---|---|---|
|
#18+
А какой тут на UPDATE индекс - там же условия нету. Индекс должен использоваться в подзапросе. Если ИБ этого не умеет - выкинь его и возьми FB или YA - они это давно умеют. В крайнем случае можно написать ХП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.10.2003, 13:32 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32285647&tid=1579850]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
183ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 227ms |
| total: | 536ms |

| 0 / 0 |
