SQL Server在nvarchar列上创建聚簇索引,强制排序

时间:2018-03-14 18:12:10

标签: sql-server

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

必要的要点是:

  1. 我是我的主键,我使用它,例如对于外键。
  2. 名称也是独一无二的。
  3. 我想按字母顺序按名称排序。
  4. 我需要SQL命令来创建约束,因为我使用脚本来创建表。
  5. 我知道您可以使用聚簇索引对表进行排序,但我知道该表不一定按此顺序排列。

    我的查询看起来像这样,但我不了解如何在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
    

    修改

    我决定遵循paparazzo的建议。因此,如果您遇到同样的问题,请务必阅读他的答案。

2 个答案:

答案 0 :(得分:2)

你应该做你想做的事。

让Id标识成为集群PK。它(在正常使用下)不会碎片化。

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

只需在Name上放置一个非群集的唯一索引,然后在select中按其排序。

你真的需要bigint吗?这是一张庞大的表格。

答案 1 :(得分:1)

您可以在将主键声明为约束时指定主键为shell_exec("node notams.js");,然后可以将唯一键声明为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) ); ASC设置索引排序顺序。默认值通常是升序。