Предположим, есть таблица с 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;