Кластерный индекс против составного индекса.Какой из них лучше? - PullRequest
0 голосов
/ 23 апреля 2019

Я использую Microsoft SQL Server 2017. У меня есть таблица с именем ProductMapping. Ниже приведена структура таблицы:

CREATE TABLE [dbo].[Accommodation_ProductMapping](
    [ProductMappingId] [uniqueidentifier] NOT NULL,
    [AccommodationId] [uniqueidentifier] NULL,
    [SupplierId] [uniqueidentifier] NULL,
    [SupplierId] [varchar](50) NULL,
    [SupplierName] [varchar](50) NULL,
    [SupplierProductReference] [nvarchar](255) NULL,
    [ProductName] [nvarchar](500) NULL,
    [CountryName] [nvarchar](255) NULL,
    [CountryCode] [nvarchar](50) NULL,
    [CityName] [nvarchar](255) NULL,
    [CityCode] [nvarchar](100) NULL
)

Эта таблица содержит 15 миллиардов данных. Я создал некластерные и составные индексы для этой таблицы. Ниже приведены подробности: -

CREATE NONCLUSTERED INDEX [IDX_CityCode] ON [dbo].[ProductMapping]
(
    [CityCode] ASC
)

CREATE NONCLUSTERED INDEX [IDX_CountryCode] ON [dbo].[ProductMapping]
(
    [CountryCode] ASC,
)

CREATE NONCLUSTERED INDEX [IDX_CountryCityCode] ON [dbo].[ProductMapping]
(
    [CountryCode] ASC,
    [CityCode] ASC
)

CREATE NONCLUSTERED INDEX [IDX_ProductCountryCityCode] ON [dbo].[ProductMapping]
(
    [ProductName] ASC,
    [CountryCode] ASC,
    [CityCode] ASC
)

CREATE NONCLUSTERED INDEX [IDX_AccommodationCountryCityCode] ON [dbo].[ProductMapping]
(
    [AccommodationId] ASC,
    [CountryCode] ASC,
    [CityCode] ASC
)

Я могу получить данные без каких-либо проблем.

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

Также я создал составной индекс "IDX_CountryCityCode" для кода страны и города, поэтому мне нужен индивидуальный некластерный индекс для "CityCode" и "CountryCode" (например, IDX_CityCode и IDX_CountryCode).

Заранее спасибо.

EDITED

Я просто хочу узнать, удаляю ли я все вышеперечисленные индексы (то есть [IDX_CityCode], [IDX_CountryCode], [IDX_CountryCityCode], [IDX_ProductCountryCityCode] & [IDX_AccommodationCountryCityCode]) и помещаю их все ниже в один составной индекс. Это сработает или лучше всего подойдет?

CREATE NONCLUSTERED INDEX [IDX_CityCountryAccommodationProduct] ON [dbo].[ProductMapping]
(
    [CityCode] ASC,
    [CountryCode] ASC,
    [AccommodationId] ASC,
    [ProductName] ASC
)

1 Ответ

0 голосов
/ 23 апреля 2019

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

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

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

Ваш составной индекс можно использовать, например, в следующих предложениях where:

where CityCode = @CityCode
where CityCode = @CityCode and CountryCode = @CountryCode
where CityCode = @CityCode and CountryCode = @CountryCode and AccommodationId = @AccommodationId
where CityCode = @CityCode and CountryCode = @CountryCode and AccommodationId = @AccommodationId and ProductName = @ProductName

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

Этот индекс нельзя использовать, если отсутствует @CityId. Таким образом, этот индекс не подходит для:

where CountryCode = @CountryCode
where CountryCode = @CountryCode and AccommodationId = @AccommodationId
whereCountryCode = @CountryCode and AccommodationId = @AccommodationId and ProductName = @ProductName

С четырьмя индексами можно использовать один . Оптимизатор пытается использовать «лучший» индекс, когда можно использовать более одного. Иногда оптимизатор не выбираетсамый лучший.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...