Есть ли более эффективный способ сделать этот SQL Select?

У меня есть этот SQL-запрос:

SELECT * FROM IMAGES WHERE
IMAGENAME in ('IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6')
ORDER BY CASE IMAGENAME
  WHEN 'IMG1' THEN 1
  WHEN 'IMG2' THEN 2
  WHEN 'IMG3' THEN 3
  WHEN 'IMG4' THEN 4
  WHEN 'IMG5' THEN 5
  WHEN 'IMG6' THEN 6
  ELSE 7
END

Я не могу гарантировать, что список IMAGENAME будет в алфавитном порядке, отсюда и оператор case, но я бы предпочел сортировать в БД, а не в коде, потому что я доверяю их коду сортировки больше, чем моему :)

SQL-сервер анализирует, что 78% времени выполнения тратится на сортировку. Могу ли я уменьшить это количество?

Это должен быть довольно простой SQL, поскольку мы нацелены на SQL Server и Oracle.

Любой совет по настройке был бы фантастическим.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
3
0
526
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

Не могли бы вы разделить IMG (или нечисловую) часть IMAGENAME в новый столбец при записи в базу данных, а затем отсортировать по новому столбцу, состоящему только из чисел?

Например:

SELECT * FROM IMAGES WHERE
IMAGENAME in ('IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6')
ORDER BY IMAGENO
END

где IMAGENO будет содержать 1, 2, 3, 4, 5, 6 для каждой строки в вашем примере соответственно.

Вы можете попробовать отсортировать по

CAST(SUBSTRING(IMAGENAME, 4, LEN(IMAGENAME) -3) as INTEGER)

Однако это, вероятно, не будет работать в Oracle без некоторой настройки, а также может быть не быстрее, чем у вас

Я думаю, вам может быть лучше добавить в таблицу какой-то столбец Rank и установить его, когда вы пишете в него

SELECT *
FROM IMAGES
WHERE IMAGENAME in ('IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6')
ORDER BY IMAGENAME ASC

Снимать имя изображения не нужно; вы выбираете только несколько случаев, указанных выше, и упорядочить по строке можно достаточно хорошо. Кроме того, условие else не имеет смысла, потому что оно никогда не будет использоваться, поскольку вы исключили все другие параметры в предложении where.

примечание: это основано на отправленном вами запросе, если есть другие условия или возможности, вы также должны указать их.

Запрос, который я дал, был только примером того, что я хочу сделать - изображения на самом деле имеют имена вроде «ACABOUT», и они мне нужны в порядке, отличном от алфавитного. Я должен был прояснить это. Мои извинения.

Mark Pim 19.11.2008 14:50

Если все ваши изображения названы «IMG», вы сможете подставить имя из char 4, а затем преобразовать его в число. Я не знаю функций SQL Server для этого, но в Oracle это будет:

SELECT * FROM IMAGES WHERE
IMAGENAME in ('IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6')
ORDER BY TO_NUMBER(SUBSTR(IMAGENAME,4));

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

Я подумаю о добавлении числового столбца, чтобы ускорить сортировку.

Ответ принят как подходящий

Я не уверен, доступно ли это в ваших целевых базах данных, но, надеюсь, это может сработать, по крайней мере, как вдохновение для лучшего подхода. В MySQL вы можете делать то, что хотите, с помощью функции FIELD (), например:

SELECT * FROM IMAGES WHERE
  IMAGENAME IN ('IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6')
  ORDER BY FIELD(IMAGENAME, 'IMG1', 'IMG2', 'IMG3', 'IMG4', 'IMG5', 'IMG6');

Функция FIELD () принимает первый параметр, а затем возвращает целое число в зависимости от позиции в списке параметров или ноль, если его нет в списке параметров. Это позволяет вам создать полностью настраиваемый порядок для вашего запроса.

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field

Я ожидал, что нечто подобное может быть доступно в SQL Server или Oracle.

Существует почти эквивалентный способ сделать то, что ChrisThomas123 предложил в SQL Server (но не в ORACLE), а именно:

ORDER BY CHARINDEX(IMAGENAME, 'A,B,C,D,E,F,G')

но, кажется, не быстрее.

Если у вас есть возможность добавить индекс, то (на сервере sql), если вы определяете кластерный индекс для IMAGENAME, данные будут предварительно отсортированы. Даже если бы строки не были отсортированы в правильном порядке, они, по крайней мере, были бы сгруппированы по IMAGENAME, поэтому сортировка должна быть быстрее. Если вы добавите числовой столбец, поместите на него кластерный индекс. Альтернативой добавлению столбца может быть справочная таблица. Но у вас могут не быть открыты эти параметры

Создайте новую таблицу, содержащую отношение

(ИМЯ ИЗОБРАЖЕНИЯ, ПОСЛЕДОВАТЕЛЬНОСТЬ).

Загрузите его с помощью ('IMG1', 1), ('IMG2', 2), ('IMG3', 3), ... Присоединитесь к этой таблице в своем запросе и сделайте заказ по SEQUENCENUMBER.

Он должен работать намного быстрее.

Другие вопросы по теме