如何在另一个表的列上索引SQL表

如何在另一个表的列上索引SQL表,sql,sql-server,indexing,Sql,Sql Server,Indexing,我有下面的模式-让我们假设有两个国家,A和B。 国家A有1000个团队,而国家B有100000000个——如果我想根据团队所在的国家快速查询结果,我将如何构建索引 如果这有帮助的话,球队就不能改变国家 索引表取决于了解实际模式 对于这个简单的表模式,我将只在表之间创建Trusted FK,至少这是我的第一次尝试 假设Countryid,Teamid,Resultid是自动递增的 CREATE TABLE Country (id INT IDENTITY(1, 1) PRIMAR

我有下面的模式-让我们假设有两个国家,A和B。 国家A有1000个团队,而国家B有100000000个——如果我想根据团队所在的国家快速查询结果,我将如何构建索引

如果这有帮助的话,球队就不能改变国家


索引表取决于了解实际模式

对于这个简单的表模式,我将只在表之间创建
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 hv 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;

可能是在看到真实查询的查询计划后,我将
结果
表进行去规范化,以添加
Countryid
,但现在不需要,因为country表很小

我认为在索引视图中连接这些表是您需要的。首先构造您的查询。然后担心性能。我们只能假设您已经完成了家庭作业,并且深思熟虑地选择了聚集索引以及添加的索引来支持外键。1亿的数字看起来更像是一个巨魔,而不是现实——但严重扭曲的数据通常需要不同的方法来构建高效的查询。请添加要优化的特定查询。像这样的情况可以从过滤/部分索引中受益匪浅,但是如果不查看特定的查询,就很难回答。首先搜索a国的团队,这必须是一个简单的查询。优化第二个查询,因为您已经知道它在国家/地区,但不知道这意味着什么:“如果我想根据团队所在的国家/地区快速查询结果”。这是否意味着您有两个查询——本质上——一个返回A中的所有团队,另一个返回B中的所有团队?