【问题标题】:Index varchar on MS SQL Server 2005MS SQL Server 2005 上的索引 varchar
【发布时间】:2010-09-17 09:58:27
【问题描述】:

我需要在 MS SQL Server 2005 中为我的表上的 varchar 字段编制索引,但我不清楚该怎么做。如果我尝试在该字段上添加非聚集索引,它会显示“表 'mytable' 中的列 'xxxx' 的类型不能用作索引中的键列”

我的表有一个自动递增的 int ID,它被设置为表的主键。如果我将此属性设置为索引,然后将我的 varchar 列添加为“包含列”,则索引将通过。但我不确定这就是我想要的——我希望能够仅根据 varchar 字段搜索表,而我对索引的理解是,必须提供所有索引元素才能真正看到查询中的加速,但我不想包含 int ID(因为在给定查询时我不知道它是什么)。

我是否尝试不正确地执行此操作? ID + my varchar 作为包含的列会完成我正在寻找的内容吗?

【问题讨论】:

    标签: sql sql-server-2005


    【解决方案1】:

    你的varchar(max) 是吗?我认为这些不允许在索引中使用。

    否则,发布您的CREATE TABLE 语句,通常将varchar 添加到索引没有问题。

    【讨论】:

      【解决方案2】:

      我假设您的列是 VARCHAR(MAX) 列,正如错误所说,它是索引的无效数据类型。建议:创建一个计算列,它是 VARCHAR(MAX) 列的哈希值(例如,使用 HashBytes 函数),然后仅在计算列上创建索引。然后,在 SQL DML 的搜索条件(例如 WHERE 子句)中,您将同时使用 VARCHAR(MAX) 搜索值本身加上 VARCHAR(MAX) 搜索值的哈希值你的桌子。将搜索值的散列封装在“帮助”存储过程中可能是个好主意。

      【讨论】:

        【解决方案3】:

        不,ID + varchar 列不起作用。这对于您在 ID 上进行查找并且只选择 ID 或/和 varchar 列的查询非常有用 - 然后您将拥有一个覆盖索引,并且只能通过查看索引来检索所有内容。

        我猜你的 ID 列上有一个聚集索引,因为它是主键。然后你需要在 varchar 列上创建一个非聚集索引——这应该是可能的。非聚集索引也会自动包含 ID。

        还请记住,索引仅适用于 WHERE VarcharColumn = 'xyz' 和 WHERE VarcharColumn LIKE 'xyz%' 之类的查询。

        对于 LIKE '%xyz%' 和 '%xyz' 查询没有帮助。

        【讨论】:

          【解决方案4】:

          默认情况下将列设置为主键会创建一个聚集索引,因此您不必创建另一个 INT+VARCHAR 索引。

          您正在寻找的只是您的 VARCHAR 上的索引 - 没有 +INT,因为您的主键被隐式包含 - 毕竟 SQL Server 在执行索引查找时应该能够找到实际行。但是有一个限制,我相信索引列的总大小应该小于 900 字节(至少在 SQL Server 2000 中是这样)。你的 VARCHAR 有多长?

          【讨论】:

            【解决方案5】:

            您无需在主键中包含 varchar 字段即可对其进行索引。要创建索引,只需在 Management Studio 中修改表,单击“管理索引和键”按钮,然后单击“添加”以添加新索引。然后选择 VARCHAR 字段。应该没有问题。

            【讨论】:

              猜你喜欢
              • 2011-04-21
              • 2011-07-16
              • 1970-01-01
              • 2010-09-15
              • 2011-02-07
              • 1970-01-01
              • 2011-05-10
              • 2011-05-25
              • 2011-08-18
              相关资源
              最近更新 更多