Создание индексов для группы полями?

Так как только Ваша интерактивная оболочка знает о псевдонимах, почему не только выполняет псевдоним, не раскошеливаясь до xargs?

find . -iname '.#*' -print0 | while read -r -d '' i; do foobar "$i"; done

, Если Вы уверены, что Ваши имена файлов не имеют новых строк в них (ick, почему был бы они?), можно упростить это до [1 110]

find . -iname '.#*' -print | while read -r i; do foobar "$i"; done

или даже всего find -iname '.#*' | ..., так как каталог по умолчанию ., и действие по умолчанию -print.

Еще одна альтернатива:

 IFS= 

выразительный Bash, что слова только разделяются на новых строках (значение по умолчанию: IFS=). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным $IFS.

\t\n'). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным $IFS.

\n'; for i in `find -iname '.#*'`; do foobar "$i"; done

выразительный Bash, что слова только разделяются на новых строках (значение по умолчанию: IFS=). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным $IFS.

\t\n'). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным $IFS.

29
задан onejigtwojig 18 September 2009 в 14:59
поделиться

3 ответа

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

15
ответ дан 28 November 2019 в 02:04
поделиться

Нужно ли вам создать индекс для полей группировки по полям в базе данных Oracle?

Нет. В этом нет необходимости в том смысле, что запрос будет выполняться независимо от того, существуют ли индексы или нет. Индексы предоставляются для повышения производительности запросов.

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

... единственный релевантный индекс для этого запроса - это индекс, созданный для field_two. Другие однополевые или составные индексы, созданные для любого из других полей, не будут использоваться для вышеуказанного запроса. Это правильно?

Не всегда. Часто GROUP BY требует от Oracle выполнения сортировки (но не всегда); и вы можете исключить операцию сортировки, указав подходящий индекс для сортируемых столбцов.

2
ответ дан 28 November 2019 в 02:04
поделиться

Нет, это может быть неверно.

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

В последней статье в моем блоге:

, есть запрос, в котором Oracle не использует полное сканирование таблицы, а скорее объединяет два индекса для получения значений столбца:

SELECT  l.id, l.value
FROM    t_left l
WHERE   NOT EXISTS
        (
        SELECT  value
        FROM    t_right r
        WHERE   r.value = l.value
        )

План такой:

SELECT STATEMENT
 HASH JOIN ANTI
  VIEW , 20090917_anti.index$_join$_001
   HASH JOIN
    INDEX FAST FULL SCAN, 20090917_anti.PK_LEFT_ID
    INDEX FAST FULL SCAN, 20090917_anti.IX_LEFT_VALUE
  INDEX FAST FULL SCAN, 20090917_anti.IX_RIGHT_VALUE

Как видите, здесь нет СКАНИРОВАНИЕ ТАБЛИЦ на t_left .

Вместо этого Oracle берет индексы на id и value , объединяет их по rowid и получает пары (id, value) из результата соединения.

Теперь,на ваш запрос:

SELECT  *
FROM    some_table
WHERE   field_one is not null and field_two = ?
GROUP BY
        field_three, field_four, field_five

Во-первых, он не будет компилироваться, так как вы выбираете * из таблицы с предложением GROUP BY .

Вам необходимо заменить * с выражениями, основанными на столбцах группировки и агрегатах столбцов без группировки.

Скорее всего, вам будет полезен следующий индекс:

CREATE INDEX ix_sometable_23451 ON some_table (field_two, field_three, field_four, field_five, field_one)

, поскольку он будет содержать все для фильтрации на field_two , сортировка по field_three, field_four, field_five (полезно для GROUP BY ) и проверка того, что field_one имеет значение NOT NULL .

Вам необходимо заменить * выражениями, основанными на столбцах группировки и агрегатах столбцов без группировки.

Скорее всего, вам будет полезен следующий индекс:

CREATE INDEX ix_sometable_23451 ON some_table (field_two, field_three, field_four, field_five, field_one)

, поскольку он будет содержат все для фильтрации по field_two , сортировки по field_three, field_four, field_five (полезно для GROUP BY ) и проверки того, что field_one равно NOT NULL .

Вам необходимо заменить * выражениями, основанными на столбцах группировки и агрегатах столбцов без группировки.

Скорее всего, вам будет полезен следующий индекс:

CREATE INDEX ix_sometable_23451 ON some_table (field_two, field_three, field_four, field_five, field_one)

, поскольку он будет содержат все для фильтрации по field_two , сортировки по field_three, field_four, field_five (полезно для GROUP BY ) и проверки того, что field_one равно NOT NULL .

9
ответ дан 28 November 2019 в 02:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: