我想提取表(聘用)的个人记录,我写查询数据库SQL访问
SELECT *
FROM employ
WHERE employ_Id=some_specific_id
现在我的问题是什么这个查询做第一,意味着这将首先转到表(聘用)并选择所有记录,然后在其上应用过滤器或者只是转到表(聘用)并查找具有WHERE子句后给定的特定ID的雇佣记录。
我想提取表(聘用)的个人记录,我写查询数据库SQL访问
SELECT *
FROM employ
WHERE employ_Id=some_specific_id
现在我的问题是什么这个查询做第一,意味着这将首先转到表(聘用)并选择所有记录,然后在其上应用过滤器或者只是转到表(聘用)并查找具有WHERE子句后给定的特定ID的雇佣记录。
1)表记录大多按主键的顺序存储(称为聚簇索引)。所以,当你使用主键作为条件时,rdbms不需要扫描表(所有记录)
2)对于其他主键。 Rdbms检查索引是否在表上创建,如果可以用于你的where条件。所以,它可以避免全表扫描。
3)如果非上述情况是可能的,则执行全表扫描。
“*表记录大多按主键的顺序存储*” - 这是不正确的。在Oracle中,“索引组织表”(相当于聚集索引)是**不是默认值。 –
这就是为什么我主要使用单词。 –
在Oracle中,IOT是个例外,所以行不按主键的顺序“存储”。 –
执行查询时,它将查看所有行,看它们是否与您的条件匹配。这就是为什么您拥有的数据越多,查询时间就越长。
如果你的条件是一个索引,因为我认为是你的查询的情况下,假设empId是该表的主键,那么搜索将只会在该排序的索引,这将是更快,因为不是所有行将需要检查。
1->首先,控件将检查user_tab数据字典中的表。
2->然后,如果该列存在对where条件的检查,则检查表中的列可用性。
3>条件可能会或可能不会成立,控制将转到选择列
想象一张具有10亿记录的表格。什么是聪明的做法?然后阅读有关索引。 –
检查执行计划,你会知道 –
如果他问,他可能不知道该怎么做。也许给他一些关于如何做的建议? – SandPiper