Sql 如何使用这种索引?
我试图使用一种索引类型,但不起作用。也许你能帮我认识到我做错了什么 这是我的表的定义:Sql 如何使用这种索引?,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我试图使用一种索引类型,但不起作用。也许你能帮我认识到我做错了什么 这是我的表的定义: CREATE TABLE "TIR"."INT07NCMP"( "INT07_CORRELATIVO" NUMBER(10) NOT NULL ENABLE, "INT07_CENTRO" VARCHAR2(4 BYTE) NOT NULL ENABLE, "INT07_CODCOMPONENTE" VARCHAR2(18 BYTE) NOT NULL ENABLE, "I
CREATE TABLE "TIR"."INT07NCMP"(
"INT07_CORRELATIVO" NUMBER(10) NOT NULL ENABLE,
"INT07_CENTRO" VARCHAR2(4 BYTE) NOT NULL ENABLE,
"INT07_CODCOMPONENTE" VARCHAR2(18 BYTE) NOT NULL ENABLE,
"INT07_ALMCOMPONENTE" VARCHAR2(4 BYTE) NOT NULL ENABLE,
"INT07_CANCOMPONENTE" NUMBER(13,3),
"INT07_UNICOMPONENTE" VARCHAR2(3 BYTE),
"INT07_CODPORTADOR" VARCHAR2(18 BYTE) NOT NULL ENABLE,
"INT07_ALMPORTADOR" VARCHAR2(4 BYTE) NOT NULL ENABLE,
"INT07_CANPORTADOR" NUMBER(13,3),
"INT07_UNIPORTADOR" VARCHAR2(3 BYTE),
"INT07_ALMDESTINO" VARCHAR2(4 BYTE) NOT NULL ENABLE,
"INT07_FECINICIO" VARCHAR2(10 BYTE) NOT NULL ENABLE,
"INT07_HORINICIO" VARCHAR2(8 BYTE) NOT NULL ENABLE,
"INT07_FECTERMINO" VARCHAR2(10 BYTE) NOT NULL ENABLE,
"INT07_HORTERMINO" VARCHAR2(8 BYTE) NOT NULL ENABLE,
"INT07_ESTPOCH" VARCHAR2(1 BYTE),
"INT07_TMPPOCH" TIMESTAMP (6),
"INT07_ESTSAP" VARCHAR2(1 BYTE),
"INT07_TMPSAP" TIMESTAMP (6),
"INT07_TIMESTAMP" TIMESTAMP (6) NOT NULL ENABLE,
CONSTRAINT "INT07NCMP_PK" PRIMARY KEY ("INT07_CORRELATIVO"),
CONSTRAINT "INT07NCMP_UK1" UNIQUE (
"INT07_CENTRO", "INT07_CODCOMPONENTE", "INT07_ALMCOMPONENTE", "INT07_CODPORTADOR", "INT07_ALMPORTADOR",
"INT07_FECINICIO", "INT07_HORINICIO", "INT07_FECTERMINO", "INT07_HORTERMINO"
)
);
这是我创建的索引:
CREATE INDEX "TIR"."INT07NCMP_IDX1" ON "TIR"."INT07NCMP" ("INT07_CENTRO", "INT07_ESTPOCH");
CREATE INDEX "TIR"."INT07NCMP_IDX2" ON "TIR"."INT07NCMP" ("INT07_CENTRO", "INT07_ESTSAP");
CREATE INDEX "TIR"."INT07NCMP_IDX3" ON "TIR"."INT07NCMP" ("INT07_CENTRO", "INT07_CORRELATIVO", "INT07_FECINICIO", "INT07_HORINICIO", "INT07_FECTERMINO", "INT07_HORTERMINO");
使用“解释计划”时,我对索引1和2很在行,但对索引3则不行。例如,我正在尝试以下查询:
SELECT * FROM INT07NCMP
WHERE INT07_CENTRO = '7100'
AND INT07_CORRELATIVO > 0
答案如下:
Plan hash value: 2810525850
----------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 9770 | 1450K| 1 (0)| 00:00:01 |
|* 1 | TABLE ACCESS BY INDEX ROWID| INT07NCMP | 9770 | 1450K| 1 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | INT07NCMP_IDX1 | 39 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("INT07_CORRELATIVO">0)
2 - access("INT07_CENTRO"='7100')
Note
-----
- dynamic sampling used for this statement (level=2)
如您所见,只使用了IDX1,我希望使用IDX3,因为我使用“INT07_CENTRO”和“INT07_CORRELATIVO”进行过滤,就像索引定义的顺序一样。如果我尝试放置更多过滤器(IDX3的所有列),它也不起作用
有什么提示吗
如果你有好的统计数据,谢谢。用户表和用户索引中的行数 因此,在这些情况下,最好的方法就是简单地相信db正在做出正确的决策。它考虑了很多方面,例如统计数据、物理组织等。因此,按照数据规则创建索引并创建查询,然后信任数据库
在极少数情况下,您可能必须强制执行查询。你可以使用提示。但在这种情况下,除非它产生了巨大的差异,我对此表示怀疑——只需在第一个索引的末尾添加correlatorivo就可以了。因为保存不会来自对该数据的范围扫描,但oracle不必转到数据库表来获取该数据,并且假设您有良好的统计数据,索引扫描就足够了。用户表和用户索引中的行数 因此,在这些情况下,最好的方法就是简单地相信db正在做出正确的决策。它考虑了很多方面,例如统计数据、物理组织等。因此,按照数据规则创建索引并创建查询,然后信任数据库
在极少数情况下,您可能必须强制执行查询。你可以使用提示。但在这种情况下,除非它产生了巨大的差异,我对此表示怀疑——只需在第一个索引的末尾添加correlatorivo就可以了。因为保存不会来自对该表的范围扫描,但oracle不必转到数据库表来获取该数据,索引扫描就足够了您收集了该表的统计信息吗?例如,
begindbms_STATS.GATHER_TABLE_STATS('TIR','INT07NCMP');结束编码>,然后重新检查查询计划。INT07\u CORRELATIVO>0的行占多大比例?如果是大多数,那么索引就不是很有选择性,乐观主义者可能会选择一个较小的,或者没有索引,因为INT07NCMP_IDX3没有帮助。你收集了这个表上的统计数据吗?例如,begindbms_STATS.GATHER_TABLE_STATS('TIR','INT07NCMP');结束编码>,然后重新检查查询计划。INT07\u CORRELATIVO>0的行占多大比例?如果是大多数索引,则索引不是很有选择性,而优化者可能会选择较小的索引,或者不选择索引,因为INT07NCMP_IDX3没有帮助。在这种情况下,可以安全地假设表没有良好的统计数据,因为此语句使用了-动态采样(级别=2)
表示表中根本没有收集统计数据。OP应该检查自动统计作业是否每晚都在运行。在这种情况下,可以安全地假设表没有良好的统计数据,因为-用于此语句的动态采样(级别=2)
意味着表上根本没有收集统计数据。OP应该检查自动统计作业是否每晚都在运行。