使用过滤谓词的多列索引或单列索引

时间:2019-01-28 16:41:18

标签: database oracle indexing

我们假设有一个包含一百万行的表。 A列有100,000个唯一值,这些值相当平均地分布(按A列的值,每组大约10行)。这些匹配的A列值组中的每一行中B列的值都不同。

如果我们基于A和B的组合从该表中进行选择,那么最好在A上使用一个列索引,并允许数据库过滤基于该索引返回的结果,或者使用A和B上的多列索引可以直接到达正确的行?我一直都听说过,如果您选择的行数少于5%,则应使用索引,否则,不是,但这也许不适用于在索引中添加第二列?

我将以下代码运行到以下结果,但需要其他输入/思想。从我实际调整的角度来看,从单列索引到多列索引时,解释计划的成本是相同的。

我确信在使用多列索引时,有一些数字是有意义的。任何想法/经验法则将不胜感激!

create table Z_INDEXING_TEST (
    PRIMARY_ID      NUMBER(10,0),
    SECONDARY_ID    VARCHAR(10)
);

DECLARE
    primaryLooper NUMBER(10,0) := 100000;
    secondaryLooper NUMBER(10,0) := 10;
BEGIN
    FOR i in 1..primaryLooper
    LOOP
        FOR j in 1..secondaryLooper
        LOOP
            INSERT INTO Z_INDEXING_TEST (primary_id, secondary_id) VALUES (i, 'AAAAAAAA'||to_char(j));
        END LOOP;
    END LOOP;
END;
/

SELECT * FROM Z_INDEXING_TEST WHERE PRIMARY_ID = 50000 AND SECONDARY_ID = 'AAAAAAAA7';
CREATE INDEX Z_SINGLE_INDEX_TEST ON Z_INDEXING_TEST(PRIMARY_ID);
SELECT * FROM Z_INDEXING_TEST WHERE PRIMARY_ID = 50000 AND SECONDARY_ID = 'AAAAAAAA7';
CREATE INDEX Z_MULTI_INDEX_TEST ON Z_INDEXING_TEST(PRIMARY_ID, SECONDARY_ID);
SELECT * FROM Z_INDEXING_TEST WHERE PRIMARY_ID = 40000 AND SECONDARY_ID = 'AAAAAAAA7';

--RESULTS
--  NO INDEX = 0.026
--  SINGLE INDEX = 0.024
-- Shocking that the different is so minimal between this and no index?
-- I guess the combination of accessing the index and table is costly?
--  MULTI INDEX = 0.015

DROP TABLE Z_INDEXING_TEST;

0 个答案:

没有答案