Расширение происходит до назначения (в начале), поскольку в документации указано :
Расширение выполняется в командной строке после того, как оно разбито на слова.
blockquote>Таким образом, поведение должно быть предсказуемым (и определенным). В
local a=$a
при расширении$a
он все еще является глобальным. Выполнение команды (присваивание / объявление) происходит позже (когда$a
уже заменено ее значением).Однако я не уверен, что это не смутило бы наличие по существу двух разных переменных (зависящих от области видимости) с одним и тем же именем (т. Е. Кажущимся одним и тем же). Поэтому я предпочел бы поставить под сомнение целесообразность такого подхода к методам кодирования / удобочитаемости / простоте навигации.
Нет, индексы не будут созданы для отдельных полей.
Если у Вас есть составной ключевой FieldA, FieldB, FieldC и Вы
select * from MyTable where FieldA = :a
или
select * from MyTable where FieldA = :a and FieldB = :b
Затем это будет использовать этот индекс (потому что это они - первые два поля в ключе),
Если Вы имеете
select * from MyTable where FieldB = :b and FieldC = :c
Где Вы используете части индекса, но не полного индекса, индекс будет использоваться менее эффективно через индексное сканирование пропуска, полное индексное сканирование или быстро полное индексное сканирование.
(Благодаря David Aldridge для исправления)
При создании первичного ключа на столбцах (A, B, C) затем, Oracle по умолчанию создаст уникальный индекс на (A, B. C). Можно сказать Oracle использовать другое (не обязательно уникальный) существующий индекс как это:
alter table mytable add constraint mytable_pk
primary key (a, b, c)
using index mytable_index;
Вы получите один индекс через несколько столбцов, который не является тем же как наличием индекса на каждом столбце.
Первичный ключ является только одним (уникальным) индексом, возможно содержащим несколько столбцов
Первичный ключ подразумевает создание a composite unique index
на столбцах первичного ключа.
Можно использовать специальный названный путь доступа INDEX SKIP SCAN
для использования этого индекса с предикатами, которые не включают первый индексированный столбец:
SQL> CREATE TABLE t_multiple (mul_first INTEGER NOT NULL, mul_second INTEGER NOT NULL, mul_data VARCHAR2(200))
2 /
Table created
SQL> ALTER TABLE t_multiple ADD CONSTRAINT pk_mul_first_second PRIMARY KEY (mul_first, mul_second)
2 /
Table altered
SELECT /*+ INDEX_SS (m pk_mul_first_second) */
*
FROM t_multiple m
WHERE mul_second = :test
SELECT STATEMENT, GOAL = ALL_ROWS
TABLE ACCESS BY INDEX ROWID SCOTT T_MULTIPLE
INDEX SKIP SCAN SCOTT PK_MUL_FIRST_SECOND
Вы, возможно, должны установить отдельные индексы на столбцах в зависимости от Вашей структуры первичного ключа.
Составные первичные ключи и индексы создадут индексы следующим образом. Скажите, что у меня есть столбцы A, B, C и я создавание первичного ключа на (A, B, C). Это приведет к индексам
Oracle на самом деле создает индекс на любой из группировок крайнего левого столбца. Так... Если Вы хотите индекс на просто столбце B, необходимо будет создать один для него, а также первичный ключ.
P.S. Я знаю MySQL exibits, это оставило большую часть поведения, и я думаю, что SQL Server также оставляют больше всего
Для B будет использоваться избранный индекс, если столбец a будет иметь низкую кардинальность только (например, только 2 значений). В целом Вы, возможно, предположили этот ответ, если Вы предположили, что столбцы не индексировали отдельно, но индексированная конкатенация столбцов (это не абсолютно верно, но это работает на первое приближение). Таким образом, это не a, b индекс, это больше похоже || b индекс.
В Oracle это неточное утверждение. Он создает только 1 индекс для (A, B, C). Не создает индексы (A, B) и (A).