如果我有一个的查询,如:

Select EmployeeId 
From Employee 
Where EmployeeTypeId IN (1,2,3)

和我有一个索引 EmployeeTypeId 领域,并SQL服务器仍然使用该指数?

有帮助吗?

解决方案

是啊,这是正确的。如果你的员工表有10,000个记录,只有5记录有employeetypeID中(第1、2、3),那么它将最可能使用的指数取的记录。但是,如果它发现这9 000名记录有employeeIDType中(第1、2、3),然后它最有可能只是做一个表格的扫描以获得相应的EmployeeIDs,因为它的速度更快,只是为贯穿整个表过去的每个分支的索引树,看看记录。

SQL服务器做了很多东西尝试和优化如何查询的运行。然而,有时,它没有得到正确的答案。如果你知道就SQL服务器是不使用指数,通过在执行计划中的查询分析仪,你可以告诉查询机使用特定指数与以下改变你的查询。

Select EmployeeId From Employee WITH (Index(Index_EmployeeTypeId )) Where EmployeeTypeId IN (1,2,3)

假设索引你上EmployeeTypeId场名为Index_EmployeeTypeId.

其他提示

通常,除非条款涵盖了太多的表格,然后会做一个表格的扫描。最好的方法,以找出在具体情况下,将运行在查询分析,并检查了执行计划。

除非技术已改善的方式我不能想象的延迟,"在"查询显示会产生这一结果是有效的或者荷兰的三个结果套,每一个值在"在"之列。该条款成为一个平等条件下对每个名单,将使用一个指数,如果适当的。在这种情况下的独特标识和一个足够大的表然后我希望优化使用索引。

如果该项目列表中都将非独然而,我想在例如一个"TypeId"是一个外国的关键,那么我更感兴趣的分布。我想知道,如果优化器会检查的统计数据为每个值的列表?说检查的第一个价值,并认为它是在20%的行(大不够表物质)。它可能会表进行扫描。但是,将同查询计划被用于其他两个,即使他们是独特的?

它可能没有实际意义的东西就像一个雇员表可能是足够小,它会留下缓存在的记忆,你可能不会注意到之间的差异,并建立索引,检索无论如何。

最后,虽然我讲道,要注意的查询在该在条款:它往往是一个快速的方式得到的东西的工作和(至少对我来说)可能是一个良好的方式来表达自己的要求,但它几乎总是更好地重申作为一个加入。你的优化可能足够聪明点,但随后又不可能。如果你不目前的性能检查产生的数据量,这样做的-在这些天的基于成本的优化的,你不能被某些查询的计划直到你有一个全负荷和有代表性的统计数据。如果你不能,那么准备惊喜的生产...

因此,有的潜力",在"条款的运行一个表格的扫描,但优化会 试图找出最好的方式来处理呢?

是否有指数是用来没有这么多不同类型的查询尽可能多的类型和分布的数据表中(s),如何最新表统计数据和实际数据类型之列。

其他的海报是正确的,一个指数将使用一个表格的扫描,如果:

  • 查询不会的访问超过一定百分比的行索引(说-10%的但应该变化之间的DBMS)。
  • 或者,如果有很多行,但相对较少的中唯一值柱,它还可以更快地做一个表格的扫描。

其他变量,可能不那么显而易见的是确保数据类型的值相比,是相同的。在PostgreSQL,我不认为索引将使用如果你要筛选在一个浮起,但你的专栏是由int.还有一些运营商不支持索引用(同样,在PostgreSQL,干净。操作人员是如此)。

如指出的是,虽然,总检查查询分析当中的怀疑和DBMS的文档是你的朋友。

@Mike:谢谢你的详细分析。有肯定一些有趣的观点,你让那里。例如我贴是有些微不足道,但的基础的问题都来自使用它能够.

用它能够,你可以写入条款这样的:

int[] employeeIds = new int[]{1, 5, 23463, 32523};
NHibernateSession.CreateCriteria(typeof(Employee))
.Add(Restrictions.InG("EmployeeId",employeeIds))

然后它能够产生查询其看起来像

select * from employee where employeeid in (1, 5, 23463, 32523)

所以当你和其他人已经指出,它看起来像有时候,一个指数将被用于或表格的扫描将会发生,但你真的不能确定,直到运行时间。

Select EmployeeId From Employee USE(INDEX(EmployeeTypeId))

这种查询将使用搜索该索引。这对我的作品。请不要试一试..

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top