Форум: "Базы";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];
ВнизОптимизация запроса Найти похожие ветки
← →
DieHard (2002-04-30 12:19) [0]Есть запрос типа
SELECT * FROM tab1
WHERE
c1 IN(SELECT tab2.c2 FROM tab2 WHERE tab2.c3 LIKE "ABC%")
Выборка на больших базах занимает значительное время
Нет ли способов оптимизации данного запроса?
Похоже вложенный SELECT выполняется для каждой записи.
Пробовал
SELECT * FROM tab1
LEFT JOIN tab2 ON (tab1.c1=tab2.c2)
WHERE
UPPER(c3) LIKE "ABC%"
- работает еще медленнее
← →
Alexandr (2002-04-30 12:23) [1]еще медлее потомучто у тебя откуда-то взялся upper а значит Like идет не по индексу в втором случае.
← →
kaif (2002-04-30 12:32) [2]Вообще запросы типа ...WHERE IN (SELECT... самые медленные и при построении структуры базы (самой задачи) перспективу таких запросов лучше не допускать.
Если уже ничего изменить нельзы - советую создавать временную таблицу и уничтожать после выборки данных.
CREATE TABLE TMP451423612 (...);
INSERT INTO TABLE TMP451423612 SELECT tab2.c2 FROM tab2 WHERE tab2.c3 LIKE "ABC%";
SELECT * FROM tab1, TMP451423612 WHERE tab1.c1 = TMP451423612.c2;
/*...здесь нужно вытянуть все это на клиент*/
DROP TABLE TMP451423612;
Тогда каждый запрос сработает 1 раз.
← →
Johnmen (2002-04-30 12:33) [3]Просто убери LEFT в JOIN"е - и будет быстрее...
Тем более, что он не нужен по идеологии....
← →
kaif (2002-04-30 13:03) [4]Вообще-то, у меня такое ощущение, что если с LEFT JOIN задача решается, то проще классический INNER JOIN:
SELECT * FROM tab1,tab2
WHERE tab1.c1=tab2.c2 and UPPER(c3) LIKE "ABC%"
Может, индексов (c1 и c2) в таблицах нет?
Все это, как правило, очень быстро должно работать...
← →
Johnmen (2002-04-30 13:07) [5]>kaif © (30.04.02 13:03)
В том-то и дело, что с левыми/правыми джоинами она решается неверно, а с внутренними - верно...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.005 c