【问题标题】:How to index a SQL table on a column in another table如何在另一个表中的列上为 SQL 表建立索引
【发布时间】:2021-05-17 19:16:59
【问题描述】:

我有以下架构 - 假设有 2 个国家,A 和 B。 国家 A 有 1000 个团队,而国家 B 有 100,000,000 - 如果我想根据团队所在的国家/地区快速查询结果,我将如何构建我的索引?

如果有帮助,团队不能更改国家/地区。

【问题讨论】:

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

标签: sql sql-server indexing


【解决方案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-normaliseResult表添加Countryid,但现在不需要,因为国家表会很小

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多