Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-88466
Демон
2002-05-17 14:06
2002.05.27
Как отключить СИДЮК и ФЛОПАК????


1-88491
olden69
2002-05-15 16:58
2002.05.27
может кто по C++Builder подскажет? насчет типа Variant


1-88558
Fly`
2002-05-16 14:38
2002.05.27
как передавать управление с клавиатуры другому TWinControlу ?


4-88673
SPeller
2002-03-27 06:49
2002.05.27
Разрешение


1-88544
NailS
2002-05-15 12:46
2002.05.27
Exception : Privileged instruction





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский