Sql server 在varchar类型的列上创建非聚集索引好吗?

Sql server 在varchar类型的列上创建非聚集索引好吗?,sql-server,Sql Server,我有一个表,其中我在INT类型的一列中创建了聚集索引。我想创建一个非聚集索引来提高查询的性能。但是,我没有任何类型为int的列 因此,我考虑在varchartype列上创建一个非聚集索引 在Varchar类型的列上创建索引是否合适?它是否有助于提高查询的性能?我知道在varchar类型列上创建索引不是一件好事,但我只是想知道它是否会提高查询性能。在varchar列或列集上创建索引没有任何问题 关于VARCHAR/INT的性能,就像RDBMS中的所有内容一样,它取决于您正在做什么。您可能会想到这样

我有一个表,其中我在
INT
类型的一列中创建了聚集索引。我想创建一个非聚集索引来提高查询的性能。但是,我没有任何类型为
int
的列

因此,我考虑在
varchar
type列上创建一个非聚集索引


Varchar
类型的列上创建索引是否合适?它是否有助于提高查询的性能?我知道在
varchar
类型列上创建索引不是一件好事,但我只是想知道它是否会提高查询性能。

在varchar列或列集上创建索引没有任何问题

关于VARCHAR/INT的性能,就像RDBMS中的所有内容一样,它取决于您正在做什么。您可能会想到这样一个事实:在SQL Server中,在VARCHAR键上对表进行集群的效率略低于在单调递增的数字键上进行集群的效率,并且可能会引入碎片

或者,您可能正在思考您所听到的关于在VARCHAR列上编写联接的内容—这是真的,它的效率比在数值类型上的联接要低一点,但它的效率只是稍低一点,没有什么会导致您永远不会在VARCHAR列上进行联接


这并不意味着不应该在VARCHAR列上创建索引。VARCHAR列上所需的索引将提高查询性能,通常可以提高几个数量级。如果您需要VARCHAR上的索引,请创建它。试图找到一个整数列来创建索引是没有意义的-引擎永远不会使用它。

“我知道在varchar类型的列上创建索引不是一件好事”您在哪里看到的?很好?这取决于你的疑问。如果你不打算使用索引,那是不行的。如果你想知道索引是否能改善情况,你需要进行测试。检查更改前和更改后的查询计划(删除中间的统计信息,以便进行比较)。我建议注意以下几点:。只要列的长度小于900字节,并且在频繁执行的查询的
WHERE
ORDER BY
子句中使用,我看不出非聚集索引有什么不好的原因。一个大的
varchar
列肯定会导致一个相当糟糕的聚集索引(因为它的大小很大,长度也不尽相同)——但这些问题不适用于非聚集索引。