在SQL Server Management Studio 2012中,我运行此查询:
SELECT * FROM Contacts
此查询在大约44秒内成功执行。
SELECT * FROM Contacts WHERE FirsttName = 'David"
此查询在大约0秒内成功执行。所以我想我的问题是发生了什么导致这些查询时间如此不同。从我公认的天真的角度来看,我认为在这两种情况下都需要调查所有表行以检查FirstName是否等于大卫'并且条件不应该具有那么大的效果。实际上,由于额外的检查,我认为查询会花费更长的时间。
另一个例子是:
SELECT * FROM Jobs
在大约25秒内成功执行。
SELECT * FROM Jobs WHERE JobName = "Sales"
在大约0秒内成功执行。
这不是生命危险/阻挡/我的天啊为什么我不能解决这个问题。只是让我惊讶的东西。
答案 0 :(得分:2)
那是因为where语句过滤掉了你不想选择的行。意思是如果10000行中只有一行拥有FirstName“David”,那么它只会拉出一行而不是整行10000.这有意义吗?
此外,该表使用索引和统计信息来快速搜索您正在查找的数据,因此很可能它会比查看所有行更快地到达那里。
答案 1 :(得分:2)
这取决于很多因素。正如Bobek所提到的,经过时间的问题可能只是返回所有记录的时间。我们假设您只关注处理时间。
第一个问题是:考虑到缓存效果,您是否多次运行这些结果?如果您运行第一个查询,表将被加载到内存中并将保留在那里。对表的后续查询(包括第一次)将在第二次快得多。在做时间时,你必须要非常小心。
另一种可能性是索引的存在,尽管我怀疑FirstName
上会有一个索引。索引大大减少了获取记录的时间。它只是转到索引来查找正确的记录,查找它们并返回结果。最后,由于select *
。
对于花费更长时间的检查,这实际上不是问题。处理页面的时间通常比记录上的布尔操作大得多。许多其他因素对绩效的影响更大。
我的猜测,就你的情况而言,你是按照问题中描述的那样运行查询,性能差异是由于缓存效应造成的。