Каковы различные типы индексов, каковы преимущества каждого?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
31
задан APC 22 March 2012 в 09:41
поделиться

9 ответов

  • Уникальный - Гарантии уникальные значения для столбца (или набор столбцов) включенный в индексное
  • Покрытие - Включают все столбцы, которые используются в конкретном запросе (или набор запросов), позволяя базе данных использовать только индекс и не на самом деле иметь для рассмотрения данных таблицы для получения результатов
  • Кластеризованный - Это - путь, которым фактические данные заказаны на диске, что означает, использует ли запрос кластерный индекс для поиска значений, это не должно делать дополнительный шаг поиска фактической строки таблицы ни для каких данных, не включенных в индекс.
31
ответ дан 27 November 2019 в 22:11
поделиться

OdeToCode имеет хорошую статью, касающуюся основных различий

, Как он говорит в статье:

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

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

7
ответ дан 27 November 2019 в 22:11
поделиться

PostgreSQL позволяет частичные индексы, где только строки, которые соответствуют предикату, индексируются. Например, Вы могли бы хотеть индексировать клиентскую таблицу только для тех записей, которые активны. Это могло бы посмотреть что-то как:

create index i on customers (id, name, whatever) where is_active is true;

, Если Ваш индекс много столбцов, и у Вас есть многие неактивные клиенты, это может быть большой победой с точки зрения пространства (индекс будет сохранен на меньшем количестве дисковых страниц), и таким образом производительность. Для удара индекса, необходимо, как минимум, указать предикат:

select name from customers where is_active is true;
5
ответ дан 27 November 2019 в 22:11
поделиться

Я добавлю несколько индексных типов

БИТОВЫЙ МАССИВ - когда у Вас будет очень небольшое число различных возможных значений, очень быстро и не занимает много места

РАЗДЕЛЕННЫЙ - позволяет индексу быть разделенным на основе некоторого свойства, обычно выгодного на очень больших объектах базы данных по причинам производительности или устройству хранения данных.

индексы ФУНКЦИИ/ВЫРАЖЕНИЯ - раньше предварительно вычисляли некоторое значение на основе таблицы и хранили его в индексе, очень простым примером мог бы быть индекс на основе ниже () или функция подстроки.

6
ответ дан 27 November 2019 в 22:11
поделиться

Я предлагаю, чтобы Вы искали блоги Jason Massie ( http://statisticsio.com/ ) и Brent Ozar ( http://www.brentozar.com/ ) для связанной информации. У них есть некоторое сообщение о реальном сценарии, который имеет дело с индексами.

2
ответ дан 27 November 2019 в 22:11
поделиться

Расхожее мнение предлагает, чтобы индексный выбор был основан на кардинальности. Они скажут,

Для низкая кардинальность столбец как ПОЛ, использовать битовый массив. Для высокая кардинальность как LAST_NAME, используйте B-дерево.

Дело обстоит не так с Oracle, где индексный выбор должен вместо этого быть основан на типе приложения (OLTP по сравнению с OLAP). DML на таблицах с растровыми индексами может вызвать серьезную конкуренцию за блокировку. С другой стороны, CBO Oracle может легко объединить несколько растровых индексов вместе и побитово отобразить индексы, может использоваться для поиска, аннулирует. Как правило:

Для система OLTP с частым DML и стандартными запросами, используйте B-дерево. Для система OLAP с нечастым DML и специальными запросами, используйте битовый массив.

я не уверен, относится ли это к другим базам данных, комментарии приветствуются. Следующие статьи затрагивают тему далее:

3
ответ дан 27 November 2019 в 22:11
поделиться

Различные системы баз данных имеют различные названия того же типа индекса, так быть осторожными с этим. Например, то, что SQL Server и Sybase называют "кластерным индексом", называют в Oracle "организованной индексом таблицей".

2
ответ дан 27 November 2019 в 22:11
поделиться

SQL Server 2008 имеет фильтрованные индексы , подобный PostgreSQL частичные индексы . Оба позволяют включать в индекс только строки, соответствующие указанным критериям.

синтаксис идентичен PostgreSQL:

create index i on Customers(name) where is_alive = cast(1 as bit);
0
ответ дан 27 November 2019 в 22:11
поделиться

Oracle имеет различные комбинации B-дерева, битового массива, разделенного и неразделенного, обратного байта, растрового соединения и доменных индексов.

Вот ссылка на 11gR1 документация относительно предмета: http://download.oracle.com/docs/cd/B28359_01/server.111/b28274/data_acc.htm#PFGRF004

2
ответ дан 27 November 2019 в 22:11
поделиться
Другие вопросы по тегам:

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