Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > Нужна помощь создании индекса


Автор: Кли 25.2.2018, 21:56
Всем привет!
Столкнулся с такой задачей: Создать тестовую таблицу для проверки работы индекса. Используя цикл заполнить таблицу 5 тысячами записей. Убедиться, что записи действительно созданы. Выполнить к таблице запрос, в условии которого есть неиндексированное поле. Построить индекс для этого поля и повторить запрос, убедиться, что индекс ускоряет выполнение запроса.
С первой части я справился:
Код


CREATE TABLE TABL
   (ID NUMBER NOT NULL,
   NAME VARCHAR2(1000 CHAR));

SET SERVEROUTPUT ON
DECLARE
N NUMBER := 1;
BEGIN
LOOP
INSERT INTO TABL VALUES (N,DBMS_RANDOM.STRING('p',TRUNC(DBMS_RANDOM.VALUE(1,1000))));
N:=N+1;
EXIT WHEN (N>5000);
END LOOP;
END;
/

SELECT TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF') FROM DUAL;
SELECT COUNT(*) FROM TABL WHERE NAME LIKE '%WO%';
SELECT TO_CHAR(SYSTIMESTAMP,'HH24:MI:SS.FF') FROM DUAL;

Помогите со второй частью а именно: Построить индекс для этого поля. И как вообще индекс работает?

Автор: Akina 25.2.2018, 23:24
В задании было явно указано, какой тип поля использовать?
Ну а насчёт индекса - в показанной структуре попробуйте что-то типа
Код


SELECT COUNT(*) FROM tabl WHERE name like 'A%';
CREATE INDEX idx ON tabl(name);
SELECT COUNT(*) FROM tabl WHERE name like 'A%';

с замером времени и просмотром плана.

Автор: Кли 27.2.2018, 12:39
Cпасибо большое

Автор: Akina 27.2.2018, 14:01
Заодно попробуйте, если поле именно текстовое, префиксный индекс:

Код

SELECT COUNT(*) FROM tabl WHERE name like 'ABC%';
CREATE INDEX idx2 ON tabl(name(2));
SELECT COUNT(*) FROM tabl WHERE name like 'ABC%';

и то же, но с префиксами длины, скажем, 3 и 4 (ну то есть чуть меньше, равно и чуть больше, чем статическая часть условия отбора). И сравнить со скоростью обработки по индексу по всему полю...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)