Sql 不同值的表索引

Sql 不同值的表索引,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,在我的存储过程中,我需要其中一列的“唯一”值。我不确定是否应该,如果应该,我应该在表上应用什么类型的索引以获得更好的性能。不是很具体,当我检索多个列的不同值时,同样的情况也会发生。 该列为字符串(NVARCHAR)类型 e、 g 从表1中选择不同的列1 或 从表1中选择不同的列1、列2、列3 这些特定列上的索引可以稍微提高性能,但这仅仅是因为它需要SQL Server扫描更少的数据(仅这些特定列,其他什么都不需要)。除此之外,将始终进行扫描。如果需要表中的不同值,可以选择创建索引视图 CREAT

在我的存储过程中,我需要其中一列的“唯一”值。我不确定是否应该,如果应该,我应该在表上应用什么类型的索引以获得更好的性能。不是很具体,当我检索多个列的不同值时,同样的情况也会发生。 该列为字符串(NVARCHAR)类型

e、 g

从表1中选择不同的列1

从表1中选择不同的列1、列2、列3


这些特定列上的索引可以稍微提高性能,但这仅仅是因为它需要SQL Server扫描更少的数据(仅这些特定列,其他什么都不需要)。除此之外,将始终进行扫描。如果需要表中的不同值,可以选择创建索引视图

CREATE VIEW Test
WITH SCHEMABINDING
AS
SELECT Column1, COUNT_BIG(*) AS UselessColumn
FROM Table1
GROUP BY Column1;
GO
CREATE UNIQUE CLUSTERED INDEX PK_Test ON Test (Column1);
GO
然后你可以这样查询它:

SELECT *
FROM Test WITH (NOEXPAND);

NOEXPAND
是SQL Server不在视图中展开查询并将其视为表所需的提示。注意:这仅适用于SQL Server的非企业版。

我最近遇到了同样的问题,并发现可以使用Columnstore索引来解决:

    CREATE NONCLUSTERED COLUMNSTORE INDEX [CI_TABLE1_Column1] ON [TABLE1]
    ([Column1])
    WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0)

我认为索引对这些查询没有帮助,因为每个记录都需要扫描,以确保给定的列或列集是不同的。明白了。谢谢。不添加索引是有道理的,因为在插入或更新过程中这可能会增加开销,而且只会节省一点。谢谢你的建议。这帮我做到了。。。你知道为什么这比同一列上的聚集索引快得多吗?我的推理是,COLUMNSTORE索引只保存指定列中的数据,而不保存指向主键的指针,因此可能只保存单个数据值和实例数,因此每个值都有一个计数(如果只有一列)。它起作用了,但如果有人有不同的解释,我想听听。