#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
, но пока это не требуется, так как таблица стран будет небольшой