我有一个大约50,000行的SQL Server表。该表在一天内被某个上游进程更新一次。
从应用程序中触发了以下查询:
SELECT * FROM Table1 where Field1 = "somevalue"
" Field1"列包含重复值。我正在尝试提高上述查询的性能。我无法修改应用程序端的代码。所以限制列而不是" SELECT *
"不可能。我打算索引表格。我应该在" Field1"上定义一个 NON-CLUSTERED 索引。专栏为了提高性能?或者其他一些索引会有帮助吗?还有其他方法可以改善数据库方面的性能吗?
答案 0 :(得分:2)
是的,Field1
上的非聚集索引应该符合您的目的......
例如,
CREATE NONCLUSTERED INDEX Idx_Table1_Field1 ON Table1 (Field1)
答案 1 :(得分:1)
您可以做的最好的事情是运行Brent Ozar的 SP_BlitzIndex ,以更好地了解整个数据库索引设置(包括此表)。
http://www.brentozar.com/blitzindex/
如果你的表已经有一个聚簇索引(它应该 - apply one following these principles),你应该首先查看执行计划,看看它是什么。
此外,如果表格每天更新一次,大概是在非工作时间,您可以轻松地压缩表格,并且假设它主要具有重复数据,您将节省超过50%的IO和空间在查询上并产生小的CPU开销。表压缩对数据本身没有影响,仅对其保留的空间有影响。此功能仅在 SQL Server Enterprise 中可用。
最后但并非最不重要的,是你的data types properly set,也就是说,当你的列很容易成为日期时,你是从日期时间开始拉出来的,还是当列很容易为int时你是否从bigint中拉出来。
询问关于如何制作索引的问题确实不是Stack的正确问题,即
CREATE NONCLUSTERED INDEX Idx_Table1_Field1 ON Table1 (Field1)
因为它已经在MSDN上,甚至可以通过 SSMS通过创建索引下拉列表右键单击给定表格图标下的索引突发部分来创建,您应该问的问题是如何正确处理与索引相关的环境中的性能改进。最后,分析您的最终查询结果是否真的需要选择* - 这是对数据显示的常见疏忽,当开发人员仅计划显示5列时,从数据集中选择具有30列的表,如果数据集仅填充5列,则IO增益为600%。