Sql 索引具有重复记录的表

Sql 索引具有重复记录的表,sql,sql-server,Sql,Sql Server,我有一个大约50000行的SQL Server表。该表通过某个上游进程每天更新一次 已从应用程序触发以下查询: SELECT * FROM Table1 where Field1 = "somevalue" “Field1”列包含重复的值。我正在努力提高上述查询的性能。我无法在应用程序端修改代码。因此,不可能限制列而不是“SELECT*”。我打算给这张表编索引。我是否应该在“Field1”列上定义一个非聚集索引以提高性能?或者其他类型的索引会有所帮助?有没有其他方法可以从数据库方面提高性能?是

我有一个大约50000行的SQL Server表。该表通过某个上游进程每天更新一次

已从应用程序触发以下查询:

SELECT * FROM Table1 where Field1 = "somevalue"

“Field1”列包含重复的值。我正在努力提高上述查询的性能。我无法在应用程序端修改代码。因此,不可能限制列而不是“
SELECT*
”。我打算给这张表编索引。我是否应该在“Field1”列上定义一个非聚集索引以提高性能?或者其他类型的索引会有所帮助?有没有其他方法可以从数据库方面提高性能?

是的,
Field1
上的非聚集索引应该可以满足您的需要

比如说,

CREATE NONCLUSTERED INDEX Idx_Table1_Field1 ON Table1 (Field1) 

您可以做的最好的事情是运行Brent Ozar的SP_BlitzIndex,以更好地了解整个数据库索引设置(包括此表)

如果您的表已经有一个聚集索引(它应该-),那么您应该首先查看执行计划,看看它在提倡什么

此外,如果表仅每天更新,并且可能是在非工作时间更新,则可以轻松地压缩表,并且考虑到表中大部分都是重复数据,您将在查询上节省50%以上的IO和空间,并产生少量CPU开销。表压缩对数据本身没有影响,只对它所拥有的空间有影响。此功能仅在SQL Server Enterprise中可用

最后但并非最不重要的一点是,您是从datetime提取数据,而该列很容易成为date,还是从bigint提取数据,而该列很容易成为int

问一个关于如何制作索引的问题对Stack来说并不是一个合适的问题,也就是说

CREATE NONCLUSTERED INDEX Idx_Table1_Field1 ON Table1 (Field1)
由于它已经在MSDN上,甚至可以通过创建索引下拉菜单通过SSMS创建,右键单击给定表图标下的“索引突发”部分,您应该问的问题是,如何在与索引相关的环境中正确解决性能改进问题。最后,分析您的最终查询结果是否真的需要select*——这是数据显示的常见疏忽,当开发人员仅计划显示5列时,从数据集中选择一个包含30列的表,如果数据集仅填充5列,这将是600%的IO增益


还请注意

是,如果没有索引,您可以继续为Field1添加索引,并包括您需要返回的列。我想
为具有重复值的列编制索引是更好的方法title@NMK他的应用程序正在执行一个
选择*
,他无法更改该操作。。。因此,索引将必须包括所有字段,实际上将变得毫无用处。在他的场景中,只在
Field1
上设置就足够了。好的,在这种情况下,只需尝试单独设置索引;-)查看整个工作负载,而不是只关注一个查询。对于这个查询,以Field1开头的复合索引不会比单列索引更有用,但可能还有其他索引会从中受益。只是一个想法。这看起来是一个很好的注释,不是一个很好的答案。最好添加创建索引的代码。我应该做一个非唯一的聚集索引还是一个非唯一的非聚集索引?如果字段是主键的可靠候选项,那么就这样做。如果字段不是主键,为什么主键也不是聚集索引。请参阅第二句中我的链接,以分析如何放置聚集索引。狭窄–独特–未更新–不断增加