То, чтобы заставлять первичный ключ в нескольких столбцах генерировать индексы для всех них?

Расширение происходит до назначения (в начале), поскольку в документации указано :

Расширение выполняется в командной строке после того, как оно разбито на слова.

blockquote>

Таким образом, поведение должно быть предсказуемым (и определенным). В local a=$a при расширении $a он все еще является глобальным. Выполнение команды (присваивание / объявление) происходит позже (когда $a уже заменено ее значением).

Однако я не уверен, что это не смутило бы наличие по существу двух разных переменных (зависящих от области видимости) с одним и тем же именем (т. Е. Кажущимся одним и тем же). Поэтому я предпочел бы поставить под сомнение целесообразность такого подхода к методам кодирования / удобочитаемости / простоте навигации.

9
задан juan 10 February 2009 в 12:04
поделиться

8 ответов

Нет, индексы не будут созданы для отдельных полей.

Если у Вас есть составной ключевой 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 для исправления)

12
ответ дан 4 December 2019 в 10:34
поделиться

При создании первичного ключа на столбцах (A, B, C) затем, Oracle по умолчанию создаст уникальный индекс на (A, B. C). Можно сказать Oracle использовать другое (не обязательно уникальный) существующий индекс как это:

alter table mytable add constraint mytable_pk 
primary key (a, b, c)
using index mytable_index;
4
ответ дан 4 December 2019 в 10:34
поделиться

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

2
ответ дан 4 December 2019 в 10:34
поделиться

Первичный ключ является только одним (уникальным) индексом, возможно содержащим несколько столбцов

0
ответ дан 4 December 2019 в 10:34
поделиться

Первичный ключ подразумевает создание 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
2
ответ дан 4 December 2019 в 10:34
поделиться

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

Составные первичные ключи и индексы создадут индексы следующим образом. Скажите, что у меня есть столбцы A, B, C и я создавание первичного ключа на (A, B, C). Это приведет к индексам

  • (A, B, C)
  • (A, B)
  • (A)

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

P.S. Я знаю MySQL exibits, это оставило большую часть поведения, и я думаю, что SQL Server также оставляют больше всего

0
ответ дан 4 December 2019 в 10:34
поделиться

Для B будет использоваться избранный индекс, если столбец a будет иметь низкую кардинальность только (например, только 2 значений). В целом Вы, возможно, предположили этот ответ, если Вы предположили, что столбцы не индексировали отдельно, но индексированная конкатенация столбцов (это не абсолютно верно, но это работает на первое приближение). Таким образом, это не a, b индекс, это больше похоже || b индекс.

0
ответ дан 4 December 2019 в 10:34
поделиться

В Oracle это неточное утверждение. Он создает только 1 индекс для (A, B, C). Не создает индексы (A, B) и (A).

0
ответ дан 4 December 2019 в 10:34
поделиться
Другие вопросы по тегам:

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