【发布时间】:2014-08-21 21:47:00
【问题描述】:
我对这个查询有疑问:
选择 * FROM customer_table 分区 (p25062014) WHERE (customer_table.username NOT IN ('user1','user2','user3') 或 customer_table.username 为 NULL ) AND (customer_table.ip NOT IN ('ip1','ip2','ip3') OR customer_table.ip 为空 ) AND ( customer_table."ACCOUNT DEVICE ID" NOT IN ('deviceId1','deviceId2','deviceId3') 或 customer_table。“帐户设备 ID”为 NULL )即使我已在此表上为这些字段创建索引,我的表上仍有“表访问已满”:
在 customer_table 上创建索引 customer_table_USERNAME (用户名) 在 customer_table 上创建索引 customer_table_DEVICE_ID (“帐户设备 ID”) 在 customer_table 上创建索引 customer_table_IP (知识产权) 计划 SELECT STATEMENT ALL_ROWSCost:2 字节:965 基数:1 2 分区范围单成本:2 字节:965 基数:1 分区 #:1 访问的分区 #21 1 TABLE ACCESS FULL TABLE customer_table 成本:2 字节:965 基数:1 分区 #:2 访问的分区 #21我该如何解决? 谢谢。
【问题讨论】:
-
如果您的表只有一行(“Cardinality = 1”),那么对于我能想到的几乎所有查询,全表扫描是访问数据的最有效方法。
-
嗨,Gordon,这个表现在几乎是空的,但很快它将包含每个分区大约 200 万条记录。
-
需要修复吗?您面临什么实际问题? Null 值没有被索引,
not in通常不能有效地使用索引,因此可能适合进行全表(或分区)扫描 - 即使您确实有不止一行。你的统计数据是最新的吗? Oracle 会根据统计信息和解析查询时认为表所处的状态来选择计划;不是你的预期增长,它对此一无所知。 -
@Fabio 。 . .当您向表中添加更多数据并确保更新了统计信息时,Oracle 将选择更好的执行计划。
-
我如何确定 Oracle 会更新统计信息?我也可以更改查询以获得更好的性能,但我无法想象不同的查询
标签: sql oracle sql-execution-plan