2013-05-14 2 views
0

Может ли быть так добр, чтобы помочь мне с следующий:SQL подзапрос рода

У меня есть запрос, который приводит в двух столбцах одной прямолинейный (Columna) из таблицы, а другие генерируются из подзапроса (columnB). Если я сделаю сортировку (то есть ORDER BY) на столбце B, я получаю гораздо более медленный ответ, а затем, делая то же самое на столбце A (50 + times). Есть ли способ ускорить сортировку на columnB, чтобы приблизиться к скоростям, достигнутым при сортировке columnA?

Примечание: Двигатель Postgres

Update: Запрос похож на:

select columnA, array_to_string(array(select ... from tableB where ...), '%') as columnB 
from tableA 
where ... 
order by columnA 

Любой совет высоко ценится.

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

+0

Дополнительная информация была бы полезной, как схема таблицы и движка (sqlite, sqlserver, postgres, mysql), чтобы получить дополнительную информацию. – Freaktor

+0

Пожалуйста, разместите запрос. Я полагаю, вы работаете с ним в другом окне, трудно ли скопировать и вставить его для нас? Почему люди всегда этого забывают? – Jasmine

+0

Ну, мы можем помочь вам, не видя ваш запрос (или, по крайней мере, упрощенную версию). У вас может быть ситуация, когда подзапрос может быть заменен на 'JOIN' – Lamak

ответ

2

В запросе

select columnA, array_to_string(array(select ... from tableB where ...), '%') as columnB 
from tableA 
where ... 
order by columnA 

операции по columnB не могут воспользоваться индексом. Не только это, сортировка будет иметь дело с столбцами ширину многих конкатенированных строк.

Ваш лучший выбор - это переосмыслить, почему вам нужно это отсортировано, потому что порядок сортировки выражения array_to_string(...) является произвольным. Это произвольно, потому что вы говорите, что не сортируете в инструкции SELECT, что является аргументом для array().


Я использую array_to_string захватить ряд значений, которые мне нужно обработать позже. Вы видите альтернативу?

Оператор SELECT фиксирует любое количество значений.

Если вам нужно «обрабатывать» некоторые значения в отсортированном порядке, вам, вероятно, лучше возвращать результаты оператора SELECT ... ORDER BY без использования каких-либо функций массива. Таким образом, ваш код приложения может обрабатывать значения, просто пройдя результирующий набор. Вам не нужно анализировать значения из строки с разделителями «%».

+0

Вы правильно указываете мою следующую проблему (с помощью array_to_string). Однако я должен сначала исправить скорость, прежде чем решиться, как решить порядок сортировки. Спасибо за ответ. –

+1

Вы не можете исправить скорость, не пересматривая использование array_to_string(). –

+0

@Bo. Решение вашей проблемы скорости состоит в том, чтобы сортировать ** до **, вы генерируете строку (чтобы вы могли соответствующим образом настроить свою индексацию), и для этого вам нужно знать, что нужно сортировать. –

1

Поскольку ваш «Столбец B» является вычисленным значением, индекс не может быть использован для ускорения сортировки. ColumnA, вероятно, уже отсортирован, так что это быстро. Вы ничего не можете сделать, чтобы ускорить сортировку этих вычисленных значений, за исключением того, что они предварительно вычисляют их и помещают в таблицу. Это большая причина, по которой хранилища данных обычно не работают против живых данных, но вместо этого экспортируют ежедневные сводки.

+0

Спасибо за ваш ответ. У меня немного другая ситуация, и у меня есть обновленный оригинальный пост. Извините за неудобства. Я не занимаюсь сортировкой внутри подзапроса. –

+0

Я изменил свой ответ, чтобы отразить новую информацию. – Jasmine

+0

Я боялся, что это был ответ :). Может быть, у кого-то есть больше советов. –

2

Вы можете поместить несортированные данные в таблицу temp, а затем проиндексировать столбец b. Затем запустите простой выбор с порядком на индексированном столбце. Нет гарантий, что это будет быстрее, но это то, что нужно попробовать.