Я попытался запустить простой тест, чтобы увидеть, насколько справедливо соотношение скорости между oracle и Ms Sql: заполнить две таблицы 2 миллионами записей, соединить их перекрестно, отфильтровать по диапазону и вычислить сумму. Обе структуры таблицы как собраны:
create table t ( record number, name , varchar(50), num number //--random )
SQL как:
select sum(a.record) from test a cross join test b where a.num between 50001 and 80000 and b.num between 80001 and 110000
Каким-то образом тот же запрос, выполняемый на oracle, плохо работает по сравнению с Ms sql. В Oracle время около 20 секунд, но на Ms Sql результат возвращается в течение 1 секунды. Когда я увеличиваю диапазон, время на oracle ухудшается, в то время как sql все еще хорошо.
Настройка Oracle: один экземпляр 11g на машине с красной шляпой Настройка Ms sql: 2008 на win7
Попробуйте утверждение на oracles xe, выиграйте 7, результат также будет около 20. Все запросы выполняются на одной машине.
Должно ли быть написано заявление о оракуле иначе? Интересно, может ли кто-нибудь дать некоторое представление?
Спасибо
Вы уверены, что ваши индексы используются? Что EXPLAIN PLAN сообщает вам о запросе с указанными индексами? Тот факт, что индекс существует, не означает, что Oracle будет его использовать. Если статистика не строится / не обновляется, индекс, скорее всего, не используется.
Увидеть DBMS_STATS пакет, в частности GATHER_TABLE_STATS Чтобы получить больше информации.
Что-то простое, как
BEGIN
dbms_stats.gather_table_stats('<schema_owner>', 'TEST');
END;
/
Могли бы решить вашу проблему.
Обратите внимание, что '<schema_owner>'
чувствителен к регистру. Если вы не изо всех сил старались сделать это иначе, это будет верхний регистр.
Вы можете спросить Oracle через Metalink. Или, если у вас нет учетной записи Metalink, вероятно, есть возможность для потенциальных клиентов задать такой вопрос, особенно если вы, вероятно, станете крупным пользователем.
Является ли производительность для вас наиболее важным фактором при выборе СУБД и какую рабочую нагрузку вы, вероятно, будете выполнять в производственной среде? Вы можете обнаружить, что выбор оборудования имеет большее влияние на производительность, чем выбор СУБД.
Предположительно, Oracle ведет себя хорошо и остается в своей песочнице, в то время как MSSQL берет на себя вашу машину. Другими словами, MSSQL почти полностью работает без ОЗУ / кеша, в то время как Oracle приходится работать с диском. Попробуйте применить базовую оптимизацию к обоим, и я уверен, что проблема исчезнет.
Вот результат после запуска gather_table_stats и объяснения плана
SQL> BEGIN
2 dbms_stats.gather_table_stats('hr', 'TEST');
3 end;
4 /
PL/SQL procedure successfully completed.
SQL>explain plan for select count(*) from hr.test a join hr.test b
on a.noofrecord between 50001 and 60000 and b.noofrecord between 80001 and 90000;
[IMG]http://i53.tinypic.com/262taol.jpg[/IMG]
похоже, что до присоединения не было сделано никаких фильтров?