|
1
4
创建索引将比单个查询昂贵得多。如果没有索引,查询只需要扫描表。构建索引还必须扫描表,然后构建并编写索引。 |
|
|
2
2
如果我记得正确,Oracle不会为空值编制索引;因此,如果索引中的所有字段都为空,则该行将没有索引项。例如,如果你有一张桌子
带索引
数据
id_index中应该有四个条目,但field1_index和field2_index中只有两个条目。您可以通过查询DBA Ind_Statistics视图(在收集表统计信息之后)来验证这一点:
并查看不同的键和num_行列。 这一切的好处在于,如果您有一个查询在特定列中查找空值,那么很可能最终会进行完整的表扫描。我相信聚集索引实际上可以索引空值的条目,但我没有使用它们,所以我不确定。 我希望这有帮助。 |
|
|
3
1
你能用空值在一个分区中结束的方式对表进行分区吗?如果我没有弄错(抱歉,现在不能测试它),空值将转到范围分区表中的maxvalue分区。我认为Oracle可以很好地消除分区,因此只扫描包含空值的分区。您只需要选择一个合适的数字作为前一个分区的高值,以消除大部分或所有不需要的行。 示例(假设“我的列”是一个数字,而您希望查找空值):
然后,如果您“从测试表中选择*,其中我的列为空”,执行计划应该只显示正在扫描的分区“空”(完全扫描,但它将主要包含您想要的)。 如果可以将值从空更新为非空,请记住启用行移动,反之亦然。 |
|
|
4
1
如果您有企业版,并且您有一个多CPU系统,那么您应该考虑使用并行查询。这是从全表扫描中获得结果的最快方法,尽管它确实有管理开销,而且它确实需要多个CPU的可用性(显然)。 |