我有一个名为Products
的表。
此表包含超过 300 万个条目。每天大约有5000个新条目。这只发生在夜间的2分钟内。
但是这个表每天晚上都会被查询超过20 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 分钟内获得新条目。这将如何影响索引?
如果我使用索引,哪一列最好使用,我应该使用聚集索引还是非聚集索引?
最好的办法取决于表具有哪些其他字段以及针对该表运行的其他查询。
如果没有更多详细信息,包含"价格"列的非聚集索引(代码、公司、创建日期)肯定会提高性能。
CREATE NONCLUSTERED INDEX IX_code_company_createddate
ON Products(code, company, createddate)
INCLUDE (price);
这是因为如果你有该索引,那么 SQL 在运行查询时根本不会访问实际的表,因为它可以在索引中找到具有给定"代码、公司、创建日期"的所有行,并且它将能够非常快速地做到这一点,因为索引允许在使用定义键的字段时精确地快速访问, 它还将具有每行的"价格"值。
关于插入,对于添加的每一行,SQL Server 也必须将它们添加到索引中,因此插入的性能将受到影响。我认为,SELECT性能的收益应该超过对刀片的影响,但您应该对此进行测试。
此外,您将使用更多空间,因为除了原始表使用的空间外,索引还将存储每行的所有这些字段。
正如其他人在评论中指出的那样,将PK添加到表中(即使这意味着添加您实际上不需要的ProductId列)也可能是一个好主意。