【问题标题】:SQL Server create clustered index on nvarchar column, enforce sortingSQL Server 在 nvarchar 列上创建聚集索引,强制排序
【发布时间】:2018-03-14 18:12:10
【问题描述】:

我想要一张有两列 [Id] [bigint][Name] [nvarchar](63) 的小桌子。该列用于标签,它将包含所有存在的标签。 我想强制按名称列按字母顺序排序,以便更快地找到给定的标签。

必要的点是:

  1. Id 是我的主键,我使用它,例如用于外键。
  2. 名称也是独一无二的。
  3. 我想按名称的字母顺序排序。
  4. 我需要 SQL 命令来创建约束,因为我使用脚本来创建表。

我知道您可以使用聚簇索引对表进行排序,但我知道表不一定按此顺序。

我的查询看起来像这样,但我不明白如何在 Name 上创建聚集索引,但仍将 Id 作为主键:

IF NOT EXISTS (SELECT * FROM sys.objects 
               WHERE object_id = OBJECT_ID(N'[dbo].[Tags]') 
                 AND type in (N'U'))
BEGIN
    CREATE TABLE [dbo].[Tags] 
    (
        [Id] [bigint] IDENTITY(1,1) PRIMARY KEY NOT NULL,
        [Name]  [nvarchar](63) NOT NULL,

        CONSTRAINT AK_TagName UNIQUE(Name)
    )
END

编辑:

我决定听从狗仔队的建议。因此,如果您有同样的问题,请确保您也阅读了他的答案。

【问题讨论】:

  • 没有明确的 ORDER BY 就没有有序表之类的东西。时期。想想并行执行吧。
  • 表格没有顺序,从来没有,也没关系。重要的是您要查询什么。

标签: sql-server


【解决方案1】:

你应该做你想做的事。

让 Id 身份为集群 PK。它(在正常使用下)不会碎裂。

表格没有自然顺序。您必须sort by 才能获得订单。是的,数据通常以 PK 顺序呈现,但这只是查询优化器可能使用或不使用的便利。

只需在Name 上放置一个非聚集唯一索引,然后在select 中对其进行排序。

你真的需要 bigint 吗?那是一张巨大的桌子。

【讨论】:

  • 我总是使用 bigint 作为 Id,因为 int 对其他表很重要,而且我从同一个基础实体派生(对 nhibernate 很重要)。如果用户输入一些字母,比如让我们说“su”,我希望它立即显示“summer”或“sun”等建议。你真的认为非集群更好吗?
  • 你到底为什么要从这个表中派生。我坚持我的答案,不管你接受与否。
  • 好吧,我在索引方面不是很有经验,所以我最好听从您的建议并采取非集群。谢谢
【解决方案2】:

您可以在将其声明为约束时指定主键为NONCLUSTERED,然后您可以将唯一键声明为CLUSTERED 索引。

CREATE TABLE [dbo].[Tags] (
    [Id]    [bigint] IDENTITY(1,1) NOT NULL,
    [Name]  [nvarchar](63) NOT NULL,
    CONSTRAINT PK_Tag PRIMARY KEY NONCLUSTERED (Id ASC),
    CONSTRAINT AK_TagName UNIQUE CLUSTERED (Name ASC)
);

在列名之后(在键/索引声明中)指定ASCDESC 设置索引排序顺序。默认值通常是升序。

【讨论】:

猜你喜欢
  • 2015-06-13
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 2016-04-26
  • 2019-01-30
  • 2018-05-22
  • 2019-09-12
  • 1970-01-01
相关资源
最近更新 更多