如果我有一个包含100,000,000条记录的表,并且我对单个值进行选择查询,那么根据是否有10条或10,000条匹配的记录,我是否希望查询性能有很大差异?
作为一个例子 -
SELECT * FROM OrderLines ol
WHERE ol.Account = '12151'
将返回10行
SELECT * FROM OrderLines ol
WHERE ol.Account = '9551'
将返回10,000行。
我是否希望这两个查询同等一样?无论是否有指数,这种结果会如何变化?
答案 0 :(得分:0)
简短回答,需要更长时间。是否需要更长的时间取决于您的定义。看到查询是对单个表的简单查询,只要您的索引以OrderLines.Account
开头,它就会很快。但是,除非确实需要所有列,否则应避免使用SELECT *
。它减少了查询解析器可用的选项,并且可能需要进行额外的读取以获取一些数据。
使用不返回SELECT *
让我们说你有一个查询
SELECT Value1 FROM dbo.Table1 WHERE Value2 = 123;
和Value2
上的索引,可能的查询计划是对该索引执行索引查找。然后会发生什么取决于索引是否为覆盖索引(包括Value1
)。
如果是,那么它将在索引搜索期间读取10或10,000条记录中的每条记录,并获得所需的所有信息。
如果不是,那么它将读取每条记录,然后还需要执行另一次读取以获得Value1
。
在任何一种情况下,10,000美元都需要更长的时间,但如果索引没有覆盖则更多。请注意,当查询单个表时,聚簇索引始终是覆盖索引,因为叶节点包含所有列。