Я работаю с новой и старой базой данных на сервере Oracle 9.2.0.3.0.
Запросы к таблицам в новой базе данных примерно в 300 раз медленнее, чем идентичные запросы к таблицам в старой базе данных.
Эти базы данных очень похожи, но есть некоторые различия:
Таблица, которую я тестирую в старой, имеет один столбец CHAR (проиндексированный) и 12 столбцов NUMBER.
Таблица, которую я тестирую в новой, имеет один столбец NUMBER (проиндексированный) вместо столбца CHAR, 13 столбцов NUMBER и 10 новых столбцов VARCHAR2, размер которых ограничен 40-100.
Обе таблицы индексируются одинаково (кроме типа столбца затем ...)
Обе таблицы содержат около 1900000 записей.
Мой запрос получает один и тот же план выполнения в обоих случаях (индекс используется, полное сканирование не выполняется)
Базы данных находятся в отдельных табличных пространствах, но на одном диске.
Старое табличное пространство используется примерно на 70%, а новое - на 94%, в остальном настроено идентично (насколько я вижу).
Фрагментация в табличном пространстве не плохая, но хуже в старой (да!)
Поскольку в новой таблице больше столбцов, она использует в три раза больше блоков, чем в старой таблице.
Есть идеи, как поступить?
Обновление 1: После выполнения запроса 10 раз на новой базе данных он уменьшился примерно в 80 раз. Улучшение! Тем не менее, еще не решена.
Обновление 2: Запросы действительно немного отличаются из-за изменения типа столбца. Сначала старый (быстрый), а затем новый (в 80-300 раз медленнее).
SELECT fhin, SUM(cost)
FROM olddb.oldtable
WHERE month in ('1004 ') AND fhin IN ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '22', '23', '24', '25', '26', '27', '28', '29', '30', '40', '99')
GROUP BY fhin
SELECT fhin, SUM(cost)
FROM newdb.newtable
WHERE month IN (201004) AND fhin IN ('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '22', '23', '24', '25', '26', '27', '28', '29', '30', '40', '99')
GROUP BY fhin;
Пожалуйста, не спрашивайте, почему запрос выглядит так, как будто он не мой; -)
Обновление 3: Объяснение статистики по старому запросу:
execution schema (my translation to English)
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (GROUP BY)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'OLDTABLE'
3 2 INDEX (RANGE SCAN) OF 'OLDTABLE' (NON-UNIQUE)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
182 consistent gets
101 physical reads
0 redo size
903 bytes sent via SQL*Net to client
398 bytes received via SQL*Net from client
3 SQL*Net round trips to/from client
1 sorts (memory)
0 sorts (disk)
28 rows processed
объяснить статистику для нового запроса:
execution schema (my translation)
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=36 Card=30 Bytes=360)
1 0 SORT (GROUP BY) (Cost=36 Card=30 Bytes=360)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'NEWTABLE' (Cost=11 Card=13857 Bytes=166284)
3 2 INDEX (RANGE SCAN) OF 'NEWTABLE' (NON-UNIQUE) (Cost=1 Card=22502)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
11019 consistent gets
11018 physical reads
0 redo size
906 bytes sent via SQL*Net to client
398 bytes received via SQL*Net from client
3 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
28 rows processed
Полагаю, они не были такими похожими. Есть идеи?
Обновление 4: Спасибо за отличную помощь! Проблема все еще не решена, но мой клиент недоступен в течение следующих двух недель. Тогда я попробую все и вернусь сюда с дальнейшими обновлениями!
Обновление 5: Я снова на сайте! Я провел анализ фактора кластеризации, предложенный А. Мушем, и обнаружил, что:
Table Clustering Factor Rows Blocks
Old 12633 1930000 12645
New 938379 1890000 39677
Я думаю, проблема в том, что у нас плохой кластерный фактор в новой базе данных. Любые идеи или ссылки о том, как это исправить?
Обновление 6: Благодаря подсказке Адама я нашел эту статью об индексах B-дерева Oracle и коэффициенте кластеризации http://richardfoote.files.wordpress.com/2007/12/index-internals-rebuilding-the-truth.pdf и следовал инструкциям по оптимизации коэффициента кластеризации, переупорядочив таблицу по индексированный столбец. Проблема решена!