Sql 为什么包含WHERE时SELECT命令运行得更快?

Sql 为什么包含WHERE时SELECT命令运行得更快?,sql,sql-server-2012,Sql,Sql Server 2012,在SQL Server Management Studio 2012中,我运行以下查询: SELECT * FROM Contacts 此查询在大约44秒内成功执行 SELECT * FROM Contacts WHERE FirsttName = 'David" 此查询在大约0秒内成功执行。所以我想我的问题是,是什么导致这些查询时间如此不同。从我公认的天真的角度来看,我认为在这两种情况下,都需要调查所有表行,以检查FirstName是否等于“David”,并且这种情况不应该有太大的影响。实

在SQL Server Management Studio 2012中,我运行以下查询:

SELECT * FROM Contacts
此查询在大约44秒内成功执行

SELECT * FROM Contacts WHERE FirsttName = 'David"
此查询在大约0秒内成功执行。所以我想我的问题是,是什么导致这些查询时间如此不同。从我公认的天真的角度来看,我认为在这两种情况下,都需要调查所有表行,以检查FirstName是否等于“David”,并且这种情况不应该有太大的影响。实际上,我假设查询会花费更长的时间,因为需要额外的检查

另一个例子是:

SELECT * FROM Jobs
在大约25秒内成功执行

SELECT * FROM Jobs WHERE JobName = "Sales"
在大约0秒内成功执行


这不是一个危及生命的问题/阻碍/哦,天哪,为什么我不能解决这个问题。这让我感到奇怪。

这是因为where语句过滤掉了您不想选择的行。也就是说,如果你的10000行中只有一行的名字是“大卫”,那么它只会抽出那一行,而不是全部10000行。这有意义吗


此外,该表使用索引和统计信息来快速搜索您要查找的数据,因此很可能它比查看所有行更快到达那里

这是因为where语句过滤掉了您不想选择的行。也就是说,如果你的10000行中只有一行的名字是“大卫”,那么它只会抽出那一行,而不是全部10000行。这有意义吗


此外,该表使用索引和统计信息来快速搜索您要查找的数据,因此很可能它比查看所有行更快到达那里

这取决于很多因素。正如Bobek所提到的,经过时间的问题可能只是返回所有记录的时间。让我们假设您正在查看处理时间

第一个问题是:考虑到缓存效果,是否多次运行这些结果?如果运行第一个查询,表将加载到内存中,并将保留在内存中。表上的后续查询,包括第一次查询,在第二次查询时会快得多。在计时时,你必须非常小心

另一种可能性是存在索引,尽管我怀疑
FirstName
上是否会有索引。索引大大缩短了获取记录的时间。它只需转到索引以找到正确的记录,查找它们,然后返回结果。最后,由于
select*
,查询必须获取页面上的数据

至于需要更长时间的支票,这真的不是问题。处理一个页面所需的时间通常要比记录上的布尔运算多得多。许多其他因素对绩效的影响更大


在您的情况下,我的猜测是您按照问题中所述运行了查询,而性能差异是由于缓存效应造成的。

这取决于许多因素。正如Bobek所提到的,经过时间的问题可能只是返回所有记录的时间。让我们假设您正在查看处理时间

第一个问题是:考虑到缓存效果,是否多次运行这些结果?如果运行第一个查询,表将加载到内存中,并将保留在内存中。表上的后续查询,包括第一次查询,在第二次查询时会快得多。在计时时,你必须非常小心

另一种可能性是存在索引,尽管我怀疑
FirstName
上是否会有索引。索引大大缩短了获取记录的时间。它只需转到索引以找到正确的记录,查找它们,然后返回结果。最后,由于
select*
,查询必须获取页面上的数据

至于需要更长时间的支票,这真的不是问题。处理一个页面所需的时间通常要比记录上的布尔运算多得多。许多其他因素对绩效的影响更大


在您的情况下,我的猜测是您按照问题中所述运行了查询,性能差异是由于缓存效应造成的。

这些列上可能定义了一个索引。所有列都会发生这种情况。最重要的因素是找到的记录数。它们必须移动。这些列上可能定义了索引。所有列都会发生这种情况。最重要的因素是找到的记录数。他们必须被感动。现在我只是觉得自己很傻。现在我只是觉得自己很傻。