使用索引

时间:2015-06-15 23:37:06

标签: sql-server database performance

我有一张名为Products的表。

此表包含超过300万条目。每天大约有5000个新条目。这只发生在2分钟的夜晚。

但是这个表每天晚上查询可能超过2 000次。

SELECT Price 
FROM Products 
WHERE Code = @code 
  AND Company = @company 
  AND CreatedDate = @createdDate

表格结构:

Code          nvarchar(50)
Company       nvarchar(10)
CreatedDate   datetime

我可以看到此查询需要大约一秒钟才能从Products表返回结果。

表中没有productId列,因为它不需要。因此表中没有主键。

我想以某种方式改进此查询以更快地返回结果。

我之前从未使用过索引。在这个表上使用索引的最佳方法是什么?

如果我提供主键,您认为它会加快查询结果吗?请记住,我仍然需要通过提供3个参数来查询表格

WHERE Code = @code 
  AND Company = @company 
  AND CreatedDate = @createdDate. 

这是强制性的。

正如我所提到的那样,桌子每天在2分钟内获得新的参赛作品。这将如何影响索引?

如果我使用索引,哪个列最适合使用以及我是否应该使用聚簇索引或非聚簇索引?

1 个答案:

答案 0 :(得分:11)

要做的最佳事情取决于该表的其他字段以及针对该表运行的其他查询。

如果没有更多细节,那么(代码,公司,创建日期)上包含"价格"的非聚集索引专栏肯定会提高绩效。

CREATE NONCLUSTERED INDEX IX_code_company_createddate
ON Products(code, company, createddate)
INCLUDE (price);

那是因为如果你有这个索引,那么SQL在运行查询时根本不会访问实际的表,因为它可以找到给定"代码,公司,创建日期和#34;在索引中,它将能够非常快地执行,因为索引允许在使用定义键的字段时准确地进行快速访问,并且它还具有"价格"每行的价值。

关于插入,对于添加的每一行,SQL Server也必须将它们添加到索引中,因此插入的性能将受到影响。您认为您应该期望SELECT性能的增益超过对插入的影响,但您应该测试它。

此外,您将使用更多空间,因为索引将存储除原始表使用的空间之外的每一行的所有字段。

正如其他人在评论中指出的那样,在您的表格中添加PK(即使这意味着添加一个您实际上需要的ProductId列)也可能是一个好主意。