Как установить правильный индекс для соединения SQL с предложением where - PullRequest
0 голосов
/ 04 апреля 2019

Я некоторое время искал в Google, но не нашел ответа, который решает мою "проблему".

У меня есть 3 примера таблиц со следующей структурой.

Заказчик:

  • CustomerId
  • 1010 * FirstName *
  • LastName
  • Пол
  • IsDeleted

Счет:

  • InvoiceID
  • CustomerId
  • Сумма
  • Должность
  • IsValid

InvoicePos:

  • InvoicePosId
  • InvoiceID
  • PosName
  • IsPaid

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

SELECT T1.FirstName,
       T1.LastName,
       T2.Amount,
       T3.PosName
FROM Customer AS T1
     JOIN Invoice AS T2 ON T1.CustomerId = T2.CustomerId
     JOIN InvoicePos AS T3 ON T2.InvoiceId = T3.InvoiceId
WHERE T1.FirstName = 'A'
  AND T1.LastName = 'B'
  AND T2.Positions = 3
  AND T3.IsPaid = 1;

Для таблицы Customer у меня есть индекс для FirstName, LastName, CustomerId

Для InvoicePos у меня есть индекс для IsPaid, InvoiceId, InvoicePosId

Но какой индекс мне использовать для Таблицы Invoice?

Ответы [ 5 ]

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

Для этого запроса:

SELECT T1.FirstName, T1.LastName, T2.Amount, T3.PosName
FROM Customer T1 JOIN
     Invoice T2
     ON T1.CustomerId = T2.CustomerId JOIN
     InvoicePos T3
     ON T2.InvoiceId = T3.InvoiceId
WHERE T1.FirstName = 'A' AND
      T1.LastName = 'B' AND
      T2.Positions = 3 AND
      T3.IsPaid = 1;

Я бы порекомендовал следующие индексы:

  • Customer(FirstName, LastName, CustomerId)
  • Invoice(CustomerId, InvoiceId, Positions, Amount)
  • InvoicePost(InvoiceId, IsPaid, PosName).

Во-первых, это покрывающие индексы для вашего запроса.Итак, нужны только индексы.Если у вас есть дополнительные столбцы в SELECT, вы можете удалить только SELECT столбцы из индексов.

Идея состоит в том, чтобы начать с наиболее селективных условий WHERE.Я предполагаю, что ограничения имени являются самыми строгими.Следовательно, индексация начинается с Customer и использует условия WHERE.Затем добавляются дополнительные столбцы из предложений ON и SELECT.

Для остальных таблиц столбцы JOIN - это первые ключи в индексе, за которыми следуют столбцы WHERE и SELECT..

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

Моя основная проблема - понять, в каком порядке разрешен запрос.

Есть некоторые индексы для столбцов AI (CostumerId, InvoiceId, InvoicePosId).

Индекс в таблице 1(Имя, Фамилия, CostumerId) имеет смысл, потому что он фильтрует имена и затем соединяется с Invoicetable.

Но второй Индекс - это, что мне не ясно.

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

Только для этого точного запроса было бы идеально поместить некоторый индекс в Таблицу 2 / Invoice с CustomerId, Positions.

Хотя обычно следующие индексы имели бы смысл:

Customer:
  unique index on CustomerId
  index on LastName, FirstName
Invoice:
  unique index on InvoiceId
  index on CustomerId
InvoicePos:
  unique index on InvoicePosId
  unique index on InvoiceId, InvoiceId
  index on IsPaid, InvoiceId  (for your scenario)
0 голосов
/ 04 апреля 2019

используйте эти индексы:

Create Index IX__Customer_001 on Customer (CustomerId,FirstName,LastName)
Create Index IX__Invoice_001 on Invoice (CustomerId,InvoiceId,Positions) include (Amount)
Create Index IX__InvoicePos_001 on InvoicePos (InvoiceId,IsPaid) include (PosName)

Вы должны использовать поля, которые использовались только в качестве столбцов выбора, в поле «Включить предложение» и указывать предикаты в ключевых столбцах

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

Вы также можете запустить оптимизатор запросов для вашего запроса, и SQL предоставит вам лучшие индексы для применения, а также покажет% увеличения производительности.

...