Подвыборы в Oracle Query - PullRequest
       13

Подвыборы в Oracle Query

1 голос
/ 11 ноября 2009

Может кто-нибудь сказать мне, если это имеет значение для Oracle 10g, использую ли я:

SELECT col1 FROM myTable WHERE col2 = 'someval' AND col3 = "someotherval"

или

SELECT col1 FROM
    SELECT col1, col2, col3 FROM (
        SELECT * FROM myTable
    ) WHERE col2 = 'someval'
) WHERE col3 = "someotherval"

Согласно плану объяснения, стоимость вышеуказанного одинакова, но я не знаю, когда речь идет об измерении производительности.

Справочная информация: в моем приложении у меня есть несколько базовых запросов, которые мне нужно изменить по произвольным критериям во время выполнения, чтобы предоставить наборы данных для разных клиентов. Условия WHERE и извлеченные столбцы являются специфическими для файла конфигурации клиента, и для некоторых конфигураций может потребоваться поиск в col2, в то время как для других - в col5 и так далее. Кроме того, пользователи могут добавлять дополнительные критерии и столбцы поверх конфигурации клиента. Я думал об использовании набора декораторов для достижения этой цели, поэтому, если вышеописанное одинаково с точки зрения производительности, я мог бы четко разделить все три части запроса.

Это Oracle 10g. В таблице несколько сотен тысяч строк (на самом деле это View).

Спасибо за любые предложения.

Ответы [ 3 ]

6 голосов
/ 11 ноября 2009

В общем случае Oracle на основе затрат оптимизатора объединит запросы, содержащие представления (или встроенные представления в вашем случае, что по сути то же самое), как часть фазы преобразования запросов оптимизации.

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

http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i37745

также см .:

http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i37745 http://www.oracle.com/pls/db102/to_URL?remark=ranked&urlname=http:%2F%2Fdownload.oracle.com%2Fdocs%2Fcd%2FB19306_01%2Fserver.102%2Fb14200%2Fsql_elements006.htm%23SQLRF50908 http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams142.htm#REFRN10141 http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/sql_elements006.htm#SQLRF50706

Короче говоря, у вас не должно быть проблем здесь.

3 голосов
/ 11 ноября 2009

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

Помните:

«Преждевременная оптимизация - корень всего зла». - Дональд Кнут

1 голос
/ 11 ноября 2009

I может хорошо работать, т. Е. Второй запрос может оказывать такое же влияние на производительность / ресурсы, что и первый, в текущей реализации Oracle .

Тем не менее, Я бы не стал полагаться на подобные вещи , особенно когда речь идет просто о упрощении логики построения запросов. Фактически, в зависимости от конкретных бизнес-правил и базовой модели данных, может быть несколько альтернатив шаблону декоратора (или даже альтернативные способы его реализации), которые вы планируете использовать.

...