【发布时间】:2016-12-04 02:38:57
【问题描述】:
我得到了这个包含 7,000 条记录的表
desc ARADMIN.V_PKGXMLCODE
Name Null Type
--------------------- -------- -------------
REQUEST_ID NOT NULL VARCHAR2(15)
AVAILABILITY VARCHAR2(69)
XML_CODE CLOB
PACKAGENAME_UNIQUE VARCHAR2(50)
CATALOG NUMBER(15)
CHILD VARCHAR2(255)
CLASSIFICATION_SYSTEM NUMBER(15)
E_MAIL VARCHAR2(69)
查询
SELECT COUNT(*) FROM ARADMIN.V_PKGXMLCODE WHERE (CATALOG <> 0 AND CATALOG <> 2) AND (NOT (CHILD IS NULL));
不到一秒。
查询
SELECT COUNT(*) FROM ARADMIN.V_PKGXMLCODE WHERE (CATALOG IS NULL OR (CATALOG <> 0 AND CATALOG <> 2)) AND (NOT (CHILD IS NULL));
需要 23 秒。
解释计划但声称它应该很快......
我能做什么?
【问题讨论】:
-
第一个查询是否也进行全表扫描,或者它可以使用 field4 上的索引?如果有,表是否被重复删除(未截断)并使用直接路径插入重新填充(即使用
/*+ append */提示)? -
第一次查询的计划怎么样?
-
IS NULL条件将忽略索引,因为您无法索引 NULL 值。好吧,您当然可以通过在索引时使用常量值和 NULLABLE 列来欺骗优化器。但是,要在您的问题范围内回答,您的第二个查询将进行 FULL TABLE SCAN 除非您像我之前所说的那样欺骗优化器。您的第一个查询可以利用索引并避免 FTS。 1.也请发布第一次查询的解释计划。 2. 统计数据是最新的吗? -
在我提供的评论和答案中(现已删除,因为它们都是错误的),我提出了两种可能性:显示结果需要很长时间 - 亚历克斯普尔正确指出这不能成为问题,因为 OP 选择 COUNT(*),而不是完整的行集。我认为问题可能出在网络上——但亚历克斯再次正确地指出,这会减慢两个查询,而不仅仅是一个。想在这里记录一下,因为我删除了我的评论和答案。
-
如果这是一个视图而不是一个表,那么几乎不可能回答你的问题。这完全取决于视图的作用。如果它是一个 TABLE,我会说 Oracle 不可能需要 27 秒来完成 7,000 行的全表扫描并执行一些布尔运算,除非你可能在 Raspberry Pi 上运行它。哪怕一秒钟似乎也很多。我能想出的唯一原因是下面 Alex 指出的高水印问题。
标签: sql oracle performance oracle11g