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

Sql server SQL Server在nvarchar列上创建聚集索引,强制排序,sql-server,Sql Server,我想要一个有两列的小表格[Id][bigint]和[Name][nvarchar](63)。该列用于标记,它将包含所有存在的标记。 我想强制按名称列按字母顺序排序,以便更快地找到给定的标记 必要的要点是: Id是我的主键,我使用它,例如外键 名称也是唯一的 我想按名字的字母顺序排序 我需要SQL命令来创建约束,因为我使用脚本来创建表 我知道您可以使用聚集索引对表进行排序,但我知道表不一定是按该顺序排序的 我的查询如下所示,但我不知道如何在Name上创建聚集索引,但仍然将Id作为主键: IF NO

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

必要的要点是:

  • Id是我的主键,我使用它,例如外键
  • 名称也是唯一的
  • 我想按名字的字母顺序排序
  • 我需要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
    
    编辑:


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

    您可以指定主键是
    非聚集的
    当将其声明为约束时,您可以将唯一键声明为
    聚集的
    索引

    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
    DESC
    ,也可以设置索引排序顺序。默认值通常为升序。

    在将主键声明为约束时,可以指定主键为
    非聚集的
    ,然后可以将唯一键声明为
    聚集的
    索引

    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
    DESC
    ,也可以设置索引排序顺序。默认值通常是升序。

    你应该而不是做你想做的事

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

    桌子没有自然的秩序。您必须按排序才能获得订单。是的,数据通常按主键顺序显示,但这只是查询优化器可能使用或可能不使用的一种方便

    只需在
    Name
    上放置一个非聚集唯一索引,并在
    选择中按其排序即可


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

    你应该不要做你想做的事

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

    桌子没有自然的秩序。您必须按
    排序才能获得订单。是的,数据通常按主键顺序显示,但这只是查询优化器可能使用或可能不使用的一种方便

    只需在
    Name
    上放置一个非聚集唯一索引,并在
    选择中按其排序即可


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

    如果没有明确的ORDER BY,就没有ordered table。时期想想并行执行吧。表没有顺序,从来没有,也不重要。重要的是你要查询什么。没有明确的ORDER BY,就没有ordered table。时期想想并行执行吧。表没有顺序,从来没有,也不重要。重要的是您查询的内容。我总是使用bigint作为Id,因为int对于其他表来说非常重要,并且我来自同一个基本实体(对于nhibernate很重要)。如果用户输入一些字母,比如让我们说“su”,我希望它立即显示“summer”或“sun”之类的建议。你真的认为非集群更好吗?为什么你会从这个表中得出结论。我坚持我的答案,不管你接受与否。我在索引方面没有那么丰富的经验,所以我最好还是听从你的建议,选择非聚集的。谢谢,我总是使用bigint作为Id,因为int对于其他表来说非常重要,而且我是从同一个基本实体派生的(对于nhibernate很重要)。如果用户输入一些字母,比如让我们说“su”,我希望它立即显示“summer”或“sun”之类的建议。你真的认为非集群更好吗?为什么你会从这个表中得出结论。我坚持我的答案,不管你接受与否。我在索引方面没有那么丰富的经验,所以我最好还是听从你的建议,选择非聚集的。谢谢我认为最好阅读dba stack exchange关于何时使用非聚集主键的以下答案我认为最好阅读dba stack exchange关于何时使用非聚集主键的以下答案