Страница 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
по сравнению с другими СУБД?
Существует ли какой способ улучшения производительности?
Добавление индексов по этим полям как не странно только увеличило время запроса!

Re: Производительность при группировке
Добавлено: 31 июл 2006, 16:38
WildSery
Dmitry74 писал(а):...Добавление индексов по этим полям как не странно только увеличило время запроса!

Как раз закономерно увеличило. Индекс эффективен при выборе 20-30% данных и менее, а когда выбирается
всё они только накладные расходы добавляют.
Добавлено: 31 июл 2006, 16:42
CyberMax
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
Остальное? И проверь правильность запроса. Я его отформатил, но там что-то с полями не то...