Производительность при группировке

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Dmitry74
Сообщения: 70
Зарегистрирован: 31 июл 2006, 15:55

Производительность при группировке

Сообщение Dmitry74 » 31 июл 2006, 16:20

Выполняется запрос на FireBird 1.5

Код: Выделить всё

Select 
    Field1,
    Field2,
    Field3 
from
    Table1
group by
    Field1,
    Field2,
    Field3
Выполняется в таблице с 2 500 000 записей
выполняется 270 секунд и выбирает 115000 записей

аналогичный запрос с таким же количеством записей выполняется
за 37 секунд на SQL server

аналогичный запрос с таким же количеством записей выполняется
за 74,79 секунд на MYSQL

аналогичный запрос с таким же количеством записей выполняется
за 158 секунд на FoxPro8

Объясните в чём причина такой медленной работы FireBird 1.5
по сравнению с другими СУБД?

Существует ли какой способ улучшения производительности?

Добавление индексов по этим полям как не странно только увеличило время запроса! :shock: :(

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Производительность при группировке

Сообщение WildSery » 31 июл 2006, 16:38

Dmitry74 писал(а):...Добавление индексов по этим полям как не странно только увеличило время запроса! :shock: :(
Как раз закономерно увеличило. Индекс эффективен при выборе 20-30% данных и менее, а когда выбирается всё они только накладные расходы добавляют.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 16:42

Прочитай вот это: http://forum.ibase.ru/phpBB2/viewtopic.php?t=2389. Ждем ответа.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Производительность при группировке

Сообщение dimitr » 31 июл 2006, 16:44

Dmitry74 писал(а):Существует ли какой способ улучшения производительности?
убрать индекс и увеличить SortMemUpperLimit в конфиге

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 16:48

Хорошо бы еще увидеть селективность этого индекса. И собственно что это за индекс - один на три поля или по одному на каждое поле.
2 dimitr. Или это не повлияет на группировку?

Dmitry74
Сообщения: 70
Зарегистрирован: 31 июл 2006, 15:55

Re: Производительность при группировке

Сообщение Dmitry74 » 31 июл 2006, 16:56

dimitr писал(а):
Dmitry74 писал(а):Существует ли какой способ улучшения производительности?
убрать индекс и увеличить SortMemUpperLimit в конфиге
SortMemUpperLimit что за параметр и какое значение должен принять?

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 17:02

Файл firebird.conf. Находится в папке Firebird'а.
# The maximum amount of memory to be allocated by the in-memory
# sorting module.
#
# For Classic servers, this setting is defaulted to 8 MB.
# Although it can be increased, the value applies to each client
# connection/server instance and thus consumes a lot of memory.
#
# Type: integer
#
#SortMemUpperLimit = 67108864
Копируешь строку параметра, снимаешь шарп с имени (#) и прописываешь необходимое значение. В данном случае попробуй 134217728 (128 Мб), 192 и 256 Мб.

Dmitry74
Сообщения: 70
Зарегистрирован: 31 июл 2006, 15:55

Сообщение Dmitry74 » 31 июл 2006, 17:02

CyberMax писал(а):Хорошо бы еще увидеть селективность этого индекса. И собственно что это за индекс - один на три поля или по одному на каждое поле.
2 dimitr. Или это не повлияет на группировку?
Наличие индекса только увеличивает время выполнения запроса

И не важно состовной это индекс или на каждое поле свой

Вы можете сами провести такой эксперемент

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 17:08

Dmitry74 писал(а):Наличие индекса только увеличивает время выполнения запроса
И не важно состовной это индекс или на каждое поле свой
Вы можете сами провести такой эксперемент
Это конкретно в вашем случае?

Dmitry74
Сообщения: 70
Зарегистрирован: 31 июл 2006, 15:55

Сообщение Dmitry74 » 31 июл 2006, 17:12

CyberMax писал(а):Файл firebird.conf. Находится в папке Firebird'а.
# The maximum amount of memory to be allocated by the in-memory
# sorting module.
#
# For Classic servers, this setting is defaulted to 8 MB.
# Although it can be increased, the value applies to each client
# connection/server instance and thus consumes a lot of memory.
#
# Type: integer
#
#SortMemUpperLimit = 67108864
Копируешь строку параметра, снимаешь шарп с имени (#) и прописываешь необходимое значение. В данном случае попробуй 134217728 (128 Мб), 192 и 256 Мб.
А если я не использую сервер а локально использую только GDS32.dll
то где мне этот параметр поправить?

Dmitry74
Сообщения: 70
Зарегистрирован: 31 июл 2006, 15:55

Сообщение Dmitry74 » 31 июл 2006, 17:17

CyberMax писал(а):
Dmitry74 писал(а):Наличие индекса только увеличивает время выполнения запроса
И не важно состовной это индекс или на каждое поле свой
Вы можете сами провести такой эксперемент
Это конкретно в вашем случае?
нет это конкретно в FireBird

Я сделал такиже таблицы в других СУБД

и провёл эксперемент. Запрос в FireBird оказался в самом конце рейтинга

Чем меня очень расстроил ведь у нас сиситема использует именно такой тип запросов (с группировкой)

Вот я и думаю что такая класная СУБД не может быть самой тормозной
видать дело в настройках

(запрос выполняется в IB Expert )

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 17:20

Dmitry74 писал(а):А если я не использую сервер а локально использую только GDS32.dll то где мне этот параметр поправить?
У вас что, embedded firebird?
P.S. Не надо полностью квотить посты. Достаточно конкрентную фразу, к которой относится вопрос.

Dmitry74
Сообщения: 70
Зарегистрирован: 31 июл 2006, 15:55

Сообщение Dmitry74 » 31 июл 2006, 17:27

CyberMax писал(а):У вас что, embedded firebird?
у меня сделано два варианта
первый локальный вариант
второй серверный с установленным сервером

и оба работают медленно

с железом не как не связанно все субд стоят на одной машине
Последний раз редактировалось Dmitry74 31 июл 2006, 17:31, всего редактировалось 1 раз.

Dmitry74
Сообщения: 70
Зарегистрирован: 31 июл 2006, 15:55

Сообщение Dmitry74 » 31 июл 2006, 17:30

CyberMax писал(а):
Копируешь строку параметра, снимаешь шарп с имени (#) и прописываешь необходимое значение. В данном случае попробуй 134217728 (128 Мб), 192 и 256 Мб.
Провёл такой эксперемент время выполнения запроса увеличилось в 3 раза

Похоже это не совсем то

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 17:34

Полный текст запроса, план и статистику его выполнения. И вдогонку статистику по базе (gstat -h database.fdb).

Dmitry74
Сообщения: 70
Зарегистрирован: 31 июл 2006, 15:55

Сообщение Dmitry74 » 31 июл 2006, 17:35

не верится что Firebird самый тормозной среди свободно распостраняемых СУБД

Что ещё можно сделать с базой или сервером чтоб он ворочился быстрей

Dmitry74
Сообщения: 70
Зарегистрирован: 31 июл 2006, 15:55

Сообщение Dmitry74 » 31 июл 2006, 17:38

CyberMax писал(а):Полный текст запроса, план и статистику его выполнения. И вдогонку статистику по базе (gstat -h database.fdb).
подскажи как это сделать а то я новичок в FireBirde
( я то вообще с Oracle развожу)

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 17:45

IB Expert. Загоняешь в "SQL редактор" запрос и запускаешь его на выполнение. Итог из инф. окна кидаешь сюда. Сам запрос тоже.

Dmitry74
Сообщения: 70
Зарегистрирован: 31 июл 2006, 15:55

Сообщение Dmitry74 » 31 июл 2006, 17:49

CyberMax писал(а):IB Expert. Загоняешь в "SQL редактор" запрос и запускаешь его на выполнение. Итог из инф. окна кидаешь сюда. Сам запрос тоже.

Код: Выделить всё

SELECT
    ("MONTH") PERIOD,
    "PRODUCER",
    "MNN",
    SUM(CAST("VOLUME" / "RATE_USD" AS DECIMAL(15,0))) VOLUME_USD,
    "YEAR" AYEAR
FROM
    stat_data MAIN
where
    0=0
    and "YEAR"=2005
    and"MONTH" in (1,2,3,4,5,6,7,8,9,10,11,12)
GROUP BY
    "MONTH",
    "PRODUCER",
    "MNN",
    "YEAR"
Statement Plan
--------------
PLAN SORT ((MAIN NATURAL))

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 31 июл 2006, 17:53

Остальное? И проверь правильность запроса. Я его отформатил, но там что-то с полями не то...
Последний раз редактировалось CyberMax 31 июл 2006, 18:01, всего редактировалось 1 раз.

Ответить