Индекс из нескольких столбцов или индекс из одного столбца с использованием предиката фильтра - PullRequest
0 голосов
/ 28 января 2019

Предположим, есть таблица с 1 миллионом строк.Существует 100 000 уникальных значений столбца A, которые распределены достаточно равномерно (около 10 строк на группу по значению столбца A).Каждая строка в одной из этих групп совпадающих значений столбца 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...