Страница 1 из 5

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

Добавлено: 31 июл 2006, 16:20
Dmitry74
Выполняется запрос на 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: :(

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

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

Добавлено: 31 июл 2006, 16:42
CyberMax
Прочитай вот это: http://forum.ibase.ru/phpBB2/viewtopic.php?t=2389. Ждем ответа.

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

Добавлено: 31 июл 2006, 16:44
dimitr
Dmitry74 писал(а):Существует ли какой способ улучшения производительности?
убрать индекс и увеличить SortMemUpperLimit в конфиге

Добавлено: 31 июл 2006, 16:48
CyberMax
Хорошо бы еще увидеть селективность этого индекса. И собственно что это за индекс - один на три поля или по одному на каждое поле.
2 dimitr. Или это не повлияет на группировку?

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

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

Добавлено: 31 июл 2006, 17:02
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 Мб.

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

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

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

Добавлено: 31 июл 2006, 17:08
CyberMax
Dmitry74 писал(а):Наличие индекса только увеличивает время выполнения запроса
И не важно состовной это индекс или на каждое поле свой
Вы можете сами провести такой эксперемент
Это конкретно в вашем случае?

Добавлено: 31 июл 2006, 17:12
Dmitry74
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
то где мне этот параметр поправить?

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

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

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

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

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

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

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

Добавлено: 31 июл 2006, 17:27
Dmitry74
CyberMax писал(а):У вас что, embedded firebird?
у меня сделано два варианта
первый локальный вариант
второй серверный с установленным сервером

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

с железом не как не связанно все субд стоят на одной машине

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

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

Добавлено: 31 июл 2006, 17:34
CyberMax
Полный текст запроса, план и статистику его выполнения. И вдогонку статистику по базе (gstat -h database.fdb).

Добавлено: 31 июл 2006, 17:35
Dmitry74
не верится что Firebird самый тормозной среди свободно распостраняемых СУБД

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

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

Добавлено: 31 июл 2006, 17:45
CyberMax
IB Expert. Загоняешь в "SQL редактор" запрос и запускаешь его на выполнение. Итог из инф. окна кидаешь сюда. Сам запрос тоже.

Добавлено: 31 июл 2006, 17:49
Dmitry74
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))

Добавлено: 31 июл 2006, 17:53
CyberMax
Остальное? И проверь правильность запроса. Я его отформатил, но там что-то с полями не то...