Индексация является часто эффективной мерой для оптимизации запросов, однако вам необходимо выполнить дальнейшие шаги.Поиск по тексту, как правило, медленнее, поэтому настоятельно рекомендуется изменить таблицу class
, чтобы она имела числовое значение primary key
и избегала хранения таких текстов, как SHIRAZ, в вашем винном столе, а скорее числовое *От 1003 * до class
table
и сохраните текст SHIRAZ ровно один раз для его записи class
, на который будет ссылаться из wine
table
через числовое значение.Также вы должны сделать то же самое для grade
.Если у вас еще нет grade
table
, создайте его с числовым значением primary key
и полем для хранения значений, например A.
Наконец, ваш запрос вычисляет умножение Декарта, которое,Как мы знаем из теории множеств, совпадает ли каждая координата в топологии задачи.Кроме того, как мы знаем из реляционной алгебры, ваше предложение where
будет работать для всех точек вашего трехмерного (виноградник, класс, вино) проблемного пространства.Насколько я знаю, если вы реорганизуете свой запрос для использования объединений, он должен стать намного быстрее, потому что есть некоторые оптимизации для объединений, чтобы избежать вычисления всех точек в вашей топологии.
Давайте проведем рефакторинг вашего текущего запроса:
Select vintage, wine_no, wname, pctalc, grade, price, wine.vid, vname, wine.cid, cname
from wine
join class
on wine.cid = class.cid and wine.cid = 'SHIRAZ' and wine.grade = 'A'
join vineyard
on wine.vid = vineyard.vid;
Давайте проведем рефакторинг этого запроса, чтобы он был совместим с вашей схемой после предложенных мною структурных изменений:
Select vintage, wine_no, wname, pctalc, grade, price, wine.vid, vname, wine.cid, cname
from wine
join class
on wine.class_id = class.id and class.cid = 'SHIRAZ'
join grade
on wine.grade_id = grade.id and grade.value = 'A'
join vineyard
on wine.vid = vineyard.vid;
Кроме того, поскольку можно с уверенностью предположить, что существует всего несколько классови на виноградниках мы можем изменить порядок ввода таблиц в запрос:
Select vintage, wine_no, wname, pctalc, grade, price, wine.vid, vname, wine.cid, cname
from grade
join wine
on wine.grade_id = grade.id and grade.value = 'A'
join class
on wine.class_id = class.id and class.cid = 'SHIRAZ'
join vineyard
on wine.vid = vineyard.vid;
Если есть еще какие-то шаги, нужно предпринять дальнейшие шаги, дайте мне знать, если необходимы дальнейшие шаги.