Рекомендации по индексированию столбцов nvarchar - PullRequest
1 голос
/ 30 октября 2019

Я новичок в построении индексов и у меня вопрос о передовой практике.

По своей сути у меня есть следующие 3 таблицы:

Таблица A

~ 100 000 строк

Для данного элемента, напримерproduct, некоторая информация о том, что это

  ArticleId [int] (PK)
  ... some static info columns

Таблица B

~ 100 000 * K строк, где K будет увеличиваться при обновлении таблицы Bкаждые несколько месяцевСодержит переменные, которые не являются фиксированными, но могут изменять каждую итерацию.

  UploadId [int] -- one for each K iterations
  ArticleId [int] (FK on table A)
  GroupingA [nvarchar](255)
  GroupingB [nvarchar](255)

Таблица C

~ 50 миллионов строк, данные о продажах

  ArticleId [int] (FK on table A)
  Date [date]
  Sales [int]

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

Одним из основных запросов является объединение B & C и агрегирование данных до уровней GroupingA & GroupingB следующим образом:

SELECT 
    C.[Date],
    B.[GroupingA], B.[GroupingB],
    SUM(C.Sales) AS Sales
FROM 
    C
INNER JOIN
    B ON C.[ArticleId] = B.[ArticleId]
WHERE
    B.Upload.Id = 1 -- example
GROUP BY
    C.[Date], B.[GroupingA], B.[GroupingB]

Для таблицы CI сделаноUNIQUE CLUSTERED INDEX ... on (Date, ArticleId). Для таблицы BI планировал сделать одну за UNIQUE CLUSTERED INDEX ... on (UploadId, ArticleId).

Является ли хорошей идеей поместить кластерный или некластеризованный индекс в B.[GroupingA], B.[GroupingB], даже если они являются символами? Они будут интенсивно использоваться в группировках, поэтому я беспокоюсь, что не проиндексировать их, это может быть очень медленным. Должен ли я сдавать их в поиски с их составленными identity() идентификаторами? Любые идеи или ссылки будут отличными:)

Кроме того, в будущем у нас может появиться больше группировок, например, GroupingC, ... и т. Д. Заранее спасибо!

Моя версия SQL Server:

Microsoft SQL Server 2017 (RTM) - 14.0.1000.169 (X64) Aug 22 2017 17:04:49   
Copyright (C) 2017 Microsoft Corporation Express Edition (64-bit) 
          on Windows 10 Pro 10.0 <X64> (Build 17134: ) (Hypervisor) 

1 Ответ

1 голос
/ 30 октября 2019

Это немного длинно для комментария.

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

Вы можете индексировать B(upload_id, article_id) и c(article_id, date, sales).

. Вы можете сформулировать запрос следующим образом:

select C.[Date], B.[GroupingA], B.[GroupingB]
       sum(C.Sales) as Sales
from (select c.articleid, sum(c.sales) as sales
      from c
      group by c.articleid
     ) c join b
     b
     on C.ArticleId = B.ArticleId
where B.Upload_Id = 1 -- example
group by C.[Date], B.[GroupingA], B.[GroupingB];

Однако два уровня агрегирования не помогут, если только внутренний значительно не уменьшит объем данных и не сможет использовать индекс для c(articleid, sales).

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