Оптимизация запросов (ORDER BY) - PullRequest
2 голосов
/ 10 ноября 2010

У меня есть SQL-запрос, подобный приведенному ниже:

SELECT NAME,
       MY_FUNCTION(NAME) -- carries out some string manipulation
  FROM TITLES
  ORDER BY NAME; -- has an index.

Таблица TITLES содержит приблизительно 12 000 записей. В настоящий момент выполнение запроса занимает более 5 минут, но если я удалю предложение ORDER BY, то он выполняется в течение нескольких секунд.

Есть ли у кого-нибудь предложения о том, как ускорить этот запрос.

Ответы [ 4 ]

1 голос
/ 10 ноября 2010

В комментариях к вопросу вы говорите, что "2 строки без ORDER BY" требуют 2 секунды. Это имеет смысл: без ORDER BY вы просто получите первые N встреченных строк, как только они встретятся. С ORDER BY первые N строк возвращаются только после результаты были отсортированы в правильном порядке.

Если запрос используется в ситуации, когда важно быстро получить первые N строк (например, онлайн-отчет с разбиением на страницы), вы можете попробовать добавить подсказку FIRST_ROWS или FIRST_ROWS_ n к запросу, попытаться убедить его использовать индекс. См. Выбор цели оптимизатора

1 голос
/ 10 ноября 2010

Если MY_FUNCTION является детерминированным (то есть всегда возвращает один и тот же результат для одного и того же входного значения), тогда вы можете создать индекс для (NAME, MY_FUNCTION (NAME)), и это может помочь (или не может!)

0 голосов
/ 10 ноября 2010

Используйте оператор EXPLAIN, чтобы увидеть, в чем проблема

EXPLAIN SELECT NAME, MY_FUNCTION(NAME) FROM TITLES ORDER BY NAME;
0 голосов
/ 10 ноября 2010

Звучит странно.Что такое name тип столбца?

Вы проверили наличие дефектов оборудования?Возможно (просто может быть) ваш запрос с предложением order by использует ваш индекс, и ваш индекс расположен на дефектном диске (он может находиться на другом диске из таблицы, если они расположены в разных табличных пространствах).

...