Как индексировать таблицу SQL по столбцу в другой таблице

#sql #sql-server #indexing

Вопрос:

У меня есть схема ниже — Давайте представим, что есть 2 страны, A и B. В стране A 1000 команд, в то время как в стране B 100 000 000 — Если я хочу быстро запросить результаты, основываясь на том, в какой стране находится команда, как бы я построил свой индекс?

Команды не могут менять страну, если это поможет.

введите описание изображения здесь

Комментарии:

1. Я думаю, что объединение этих таблиц в индексированном представлении-это то, что вам нужно.

2. Сначала создайте свой запрос. Тогда беспокойтесь о производительности. Мы можем только предположить, что вы выполнили свою домашнюю работу и тщательно выбрали кластеризованный индекс, а также добавили индексы для поддержки ваших внешних ключей. Число в 100 миллионов больше похоже на тролля, чем на реальность, но серьезно искаженные данные часто требуют другого подхода к созданию эффективных запросов.

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

4. Одна мысль — попробуйте два отдельных запроса. Сначала найдите команду в стране А, это должен быть простой запрос. Оптимизируйте второй запрос, потому что вы уже знаете, что он находится в стране B

5. Я не знаю, что это значит: «Если я хочу быстро запросить результаты, основываясь на том, в какой стране находится команда». Означает ли это, что у вас есть два запроса-по сути-и один возвращает все команды в A, а другой-все команды в B?

Ответ №1:

Индексирование таблицы зависит от знания реальной схемы.

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

Предполагая Countryid , Teamid , Resultid являются автоматическим приращением.

 CREATE TABLE Country
(
    id          INT IDENTITY(1, 1) PRIMARY KEY, 
    CountryName VARCHAR(100) NOT NULL
);

CREATE TABLE Team
(
    id        INT IDENTITY(1, 1) PRIMARY KEY, 
    TeamName  VARCHAR(100) NOT NULL, 
    CountryID INT NOT NULL
);

ALTER TABLE dbo.Team WITH CHECK
    ADD CONSTRAINT FK_Team_CountryID 
        FOREIGN KEY(CountryID) REFERENCES dbo.Country(id);

ALTER TABLE dbo.Team WITH CHECK 
    CHECK CONSTRAINT FK_Team_CountryID;

--Just verify that newly created FK is trusted or not.
SELECT 
    name, 
    is_disabled, 
    is_not_trusted
FROM
    sys.foreign_keys
WHERE 
    name = 'FK_Team_CountryID';

CREATE TABLE Result
(
    id     INT IDENTITY(1, 1) PRIMARY KEY, 
    TeamId INT NOT NULL, 
    Result INT NOT NULL
);

-- I have no idea how you are storing Result,so ignore it

ALTER TABLE dbo.Result WITH CHECK
    ADD CONSTRAINT FK_Result_TeamId 
        FOREIGN KEY(TeamId) REFERENCES dbo.Team(id);

ALTER TABLE dbo.Result WITH CHECK 
    CHECK CONSTRAINT FK_Result_TeamId;
 

Возможно, после просмотра плана запроса реального запроса я De-normalise Result добавлю таблицу Countryid , но пока это не требуется, так как таблица стран будет небольшой