2008-10-15 71 views
6

我需要索引MS SQL Server 2005中我的表上的varchar字段,但是我不清楚该怎么做。如果我尝试在字段上添加一个非聚集索引,它表示“mytable”表中的“列'xxxx'是一种无效的索引中的键列”MS SQL Server 2005上的索引varchar

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

我试图做错误吗?作为包含列的ID + my varchar会完成我正在寻找的内容吗?

回答

10

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

否则,请发布您的CREATE TABLE声明,通常在索引中添加varchar没有任何问题。

2

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

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

另外请记住,该索引只适用于像WHERE VarcharColumn ='xyz'和WHERE VarcharColumn LIKE'xyz%'这样的查询。

它不会帮助LIKE'%xyz%'和'%xyz'查询。

0

您不需要将主键中的varchar字段包含在索引中。要创建索引,只需在Management Studio中修改表,请单击管理索引和键按钮,然后单击添加以添加新索引。然后选择VARCHAR字段。应该没有问题。

1

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

什么你要找的是只有你的VARCHAR索引 - 无+ INT,因为你的主键隐含 - 毕竟SQL服务器应该能够执行索引查找时找到实际行。虽然有一个限制,但我相信索引列的整体大小应为< 900字节(至少在SQL Server 2000中是这样)。你的VARCHAR有多长?

4

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

+0

+1用于提及HashBytes功能 – CSharper 2011-07-12 22:42:59