Performance 避免通过其他选择进行全表扫描
为什么第一个查询使用完整表扫描,而第二个查询使用索引Performance 避免通过其他选择进行全表扫描,performance,oracle,full-table-scan,Performance,Oracle,Full Table Scan,为什么第一个查询使用完整表扫描,而第二个查询使用索引 SELECT * FROM emp WHERE job = 'PRESIDENT'; 及 第二个查询只选择列“job”。选择索引时,此列的值已为已知。查询不需要任何其他内容,所以不需要从表中读取任何附加数据 对于第一个查询,它更难。通常Oracle应该访问索引。本栏中有多少不同的职位?如果基数(即选择性)较低,则全表扫描可能比索引扫描快。在这种情况下,我们可以假设表中只有一位总裁,但Oracle已经根据统计数据和估计对执行计划进行了
SELECT *
FROM emp
WHERE job = 'PRESIDENT';
及
第二个查询只选择列“job”。选择索引时,此列的值已为已知。查询不需要任何其他内容,所以不需要从表中读取任何附加数据
对于第一个查询,它更难。通常Oracle应该访问索引。本栏中有多少不同的职位?如果基数(即选择性)较低,则全表扫描可能比索引扫描快。在这种情况下,我们可以假设表中只有一位总裁,但Oracle已经根据统计数据和估计对执行计划进行了评估。对于其他工作,例如“职员”,我认为,完整的表格扫描是获取数据的最快速度。第二个查询只选择“job”列。选择索引时,此列的值已为已知。查询不需要任何其他内容,所以不需要从表中读取任何附加数据
对于第一个查询,它更难。通常Oracle应该访问索引。本栏中有多少不同的职位?如果基数(即选择性)较低,则全表扫描可能比索引扫描快。在这种情况下,我们可以假设表中只有一位总裁,但Oracle已经根据统计数据和估计对执行计划进行了评估。对于其他工作,例如“职员”,我认为,完整的表格扫描是获取数据的最快速度。第二个查询只选择“job”列。选择索引时,此列的值已为已知。查询不需要任何其他内容,所以不需要从表中读取任何附加数据
对于第一个查询,它更难。通常Oracle应该访问索引。本栏中有多少不同的职位?如果基数(即选择性)较低,则全表扫描可能比索引扫描快。在这种情况下,我们可以假设表中只有一位总裁,但Oracle已经根据统计数据和估计对执行计划进行了评估。对于其他工作,例如“职员”,我认为,完整的表格扫描是获取数据的最快速度。第二个查询只选择“job”列。选择索引时,此列的值已为已知。查询不需要任何其他内容,所以不需要从表中读取任何附加数据
对于第一个查询,它更难。通常Oracle应该访问索引。本栏中有多少不同的职位?如果基数(即选择性)较低,则全表扫描可能比索引扫描快。在这种情况下,我们可以假设表中只有一位总裁,但Oracle已经根据统计数据和估计对执行计划进行了评估。对于其他工作,例如“办事员”,我认为全表扫描是获取数据的最快方法。非常简单,因为优化人员计算出第一次查询的全表扫描成本低于基于索引的访问方法的成本 这似乎是一种不太可能的情况,因为你本能地认为只有一行符合“总统”的条件,但是,如果您假设50%的行符合该条件,那么使用多块读取的完整表的读取速度将快于读取索引然后以可能更小的读取速度读取表 在第二个查询的情况下,优化人员知道,为了给出正确的答案,不需要访问表,因此除非表非常窄,否则使用索引范围扫描或快速完全索引扫描返回结果会更快
这里的教训可能是,您应该只返回所需的列。另一个教训是,默认情况下,大多数抽象层(如ActiveRecord)的速度都会比需要的慢,因为它们总是返回每一列。非常简单,因为优化人员计算出第一个查询的完全扫描成本低于基于索引的访问方法的成本 这似乎是一种不太可能的情况,因为你本能地认为只有一行符合“总统”的条件,但是,如果您假设50%的行符合该条件,那么使用多块读取的完整表的读取速度将快于读取索引然后以可能更小的读取速度读取表 在第二个查询的情况下,优化人员知道,为了给出正确的答案,不需要访问表,因此除非表非常窄,否则使用索引范围扫描或快速完全索引扫描返回结果会更快
这里的教训可能是,您应该只返回所需的列。另一个教训是,默认情况下,大多数抽象层(如ActiveRecord)的速度都会比需要的慢,因为它们总是返回每一列。非常简单,因为优化人员计算出第一个查询的完全扫描成本低于基于索引的访问方法的成本 这似乎是一种不太可能的情况,因为你本能地认为只有一行符合“总统”的条件,但是,如果您假设50%的行符合该条件,那么使用多块读取的完整表的读取速度将快于读取索引然后以可能更小的读取速度读取表 在第二个查询的情况下,优化人员知道,为了给出正确的答案,不需要访问表,因此除非表非常窄,否则使用索引范围扫描或快速完全索引扫描返回结果会更快 这里的教训可能是,您应该只返回列
SELECT job
FROM emp
WHERE job = 'PRESIDENT';