Так как только Ваша интерактивная оболочка знает о псевдонимах, почему не только выполняет псевдоним, не раскошеливаясь до 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, что слова только разделяются на новых строках (значение по умолчанию:
\t\n'IFS=). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным
$IFS
.$IFS
. \n'; for i in `find -iname '.#*'`; do foobar "$i"; done
выразительный Bash, что слова только разделяются на новых строках (значение по умолчанию: IFS=). Необходимо быть осторожными с этим, хотя; некоторые сценарии не справляются хорошо с измененным
$IFS
.
$IFS
. Это может быть правильно, но это будет зависеть от того, сколько у вас данных. Обычно я бы создал индекс для столбцов, которые я использовал в GROUP BY, но в вашем случае оптимизатор мог решить, что после использования индекса field_two не будет возвращено достаточно данных, чтобы оправдать использование другого индекса для GROUP BY.
Нужно ли вам создать индекс для полей группировки по полям в базе данных Oracle?
Нет. В этом нет необходимости в том смысле, что запрос будет выполняться независимо от того, существуют ли индексы или нет. Индексы предоставляются для повышения производительности запросов.
Однако это может помочь; но я бы не стал добавлять индекс только для помощи одному запросу, не задумываясь о возможном влиянии нового индекса на базу данных.
... единственный релевантный индекс для этого запроса - это индекс, созданный для field_two. Другие однополевые или составные индексы, созданные для любого из других полей, не будут использоваться для вышеуказанного запроса. Это правильно?
Не всегда. Часто GROUP BY требует от Oracle выполнения сортировки (но не всегда); и вы можете исключить операцию сортировки, указав подходящий индекс для сортируемых столбцов.
Нет, это может быть неверно.
Если у вас большая таблица, 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
.