我们假设有一个包含一百万行的表。 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;