2014-10-29 3 views
-2

Один из нашей таблицы имеет ~ 500000 пунктов и из-за того, что запросы, как это (с соединениями) работает очень медленно:Oracle SQL производительность низкая из-за большого количества данных

SELECT something 
FROM TABLE_WITH_A_LOT_OF_DATA t 
LEFT JOIN table1 t1 ON t1.id=t.t1_id 
LEFT JOIN table2 t2 ON t2.id=t1.t2_id 
WHERE <some complicated clause with subqueries and so on>; 

Более того, бизнес-логику нашего приложение очень сложное, а предложения WHERE сложны. Так что вопрос: what are the ways to increase performance of sql queries which search for data through tables with a lot of data? Мы не специалисты db, и мы читаем, что мы можем использовать разделы и/или материализованные представления. Есть ли другие варианты? Какой из них лучше?

+2

В целом не лучшее решение. Все это зависит от конкретного случая. Мы не можем ничего принять, чтобы отказаться от решения для вашего сценария. Если вам нужен конкре ответьте, тогда вы должны предоставить точный SQL-запрос, Plan, Sample result set, Time values, Optimizer mode и т. д. – SriniV

+0

Оцените распределение данных для каждого столбца в ваших таблицах, который появляется в предложении 'where'. Выберите столбцы, которые часто используются и содержат разные значения, а затем создавайте индексы в этих столбцах. Это первое, что вам нужно сделать. Например: у вас есть столбец даты с датами событий. Даты распределяются равномерно в течение нескольких лет, и каждый раз, когда вы выбираете строки за один день. В этом случае индекс в этом поле может улучшить вашу производительность. Но, в любом случае, очень сложно давать какие-либо советы без подробной информации о вашей системе. – Dmitry

ответ

1

Существует не один хороший ответ на такой вопрос. Если бы была одна волшебная тайна для хорошей производительности базы данных, то все, вероятно, использовали бы ее. Кроме того, стоит отметить, что указанная вами таблица не особенно велика, я работал над базами данных с таблицами на несколько порядков больше, которые все еще находятся в пределах масштабов, которые могут обрабатываться хорошо спроектированной базой данных. (Смысл этого заключается в том, что вы не должны делать вывод о том, что слишком много данных для получения хорошей производительности из реляционной базы данных).

Самый очевидный способ взглянуть вниз - есть ли у вас индексы, которые вам нужны. Прежде всего подумайте о том, предназначены ли медленные запросы для возврата небольшого количества записей. Если вы нацеливаете небольшую часть общей таблицы, то создание индексов на столбцах, которые вы часто фильтруете, может быть очень эффективным. Подумайте об этом, например, используя индексы в книге, если вам нужно искать всю книгу для каждого слова, которое вы ищете (например, полное сканирование таблицы), тогда оно будет медленным. С другой стороны, если вы планируете вернуть значительную часть таблицы, например. > ~ 15%, тогда индексы не могут быть хорошим решением (в какой-то момент становится более эффективным просто смотреть на каждую запись, а не постоянно и обратно на индекс все время.

Кроме того, не ходите сумасшедшие с индексами, добавление их добавляет некоторые накладные расходы для вставки/обновления.

Это всего лишь одно соображение, но, вероятно, это самый легкий потенциальный выигрыш, если он подходит для вашего сценария. Это, очевидно, очень широкий вопрос, поэтому я не будет пытаться охватить все факторы, которые могли бы улучшить производительность.

Смежные вопросы