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