Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Очень медленно выполняется запрос.   Найти похожие ветки 

 
3APA3A ©   (2004-09-11 12:35) [0]

Есть две таблицы
 CREATE TABLE T1(NAME VARCHAR(64), SURNAME VARCHAR(64), ID INT);
 CREATE TABLE T2(INFO VARCHAR(64), T1_ID INT);

 То есть - в первой таблице хранятся сущности, а во второй - дополнительная информация к ним...
 
 Делаю поиск
 SELECT * FROM T1 WHERE UPPER(NAME) like UPPER("%lalala%") OR UPPER(SURNAME) like UPPER("%lalala%") OR ID IN (SELECT T1_ID FROM T2 WHERE UPPER(INFO) like UPPER("%lalala%"));

 В таблице T1 ~ 3500 записей
 В таблице T2 ~ 6500 записей.
 Под FB 1.5.1 CS этот запрос выполняется от 1 минуты до 2-х.
 Абсолютно аналогичные таблицы создаю для Paradox - запрос длится доли секунды.  
 Индексов нигде нет.
 Почему такая разница во времени выполнения?


 
3APA3A ©   (2004-09-11 12:43) [1]

Такое чувство, что подзапрос "(SELECT T1_ID FROM T2 WHERE UPPER(INFO) like UPPER("%lalala%"))" выполняется для каждой итерации внешнего запроса. А по сути задачи - этого не надо делать. Может как-то можно "развернуть" этот запрос, что-бы подзапрос выполнялся  1 раз?


 
-SeM-   (2004-09-11 13:16) [2]


> Индексов нигде нет.

Как вообще? Срочно создай primary key на поле ID таблицы T1 и foreign key на поле T1_ID для таблицы Т2.

А запрос таков:
SELECT T1.* FROM T1
INNER JOIN T2 ON (T1.ID = T2.T1_ID)
WHERE (((UPPER(T1.NAME) LIKE UPPER("%lalala%")) or (UPPER(T1.SURNAME) LIKE UPPER("%lalala%")) or (UPPER(T2.INFO) LIKE UPPER("%lalala%"))))


 
-SeM-   (2004-09-11 13:32) [3]

А еще добавь в конец ORDER BY T2.T1_ID, чтобы задействовать индекс T2


 
3APA3A ©   (2004-09-11 14:40) [4]

Да индексы-то я создам конечно, просто их не было в процессе тестирования...

 Спасибо. Запрос работает моментально, ищет то что надо, только некоторые записи дублирует. Но с этим я уже сам разберусь...
 tnx...


 
3APA3A ©   (2004-09-11 23:26) [5]

Да, такой вопрос - можно мне "на пальцах" объяснить, что делает JOIN.


 
sniknik ©   (2004-09-11 23:54) [6]

связь таблиц по условию, условие T1.ID = T2.T1_ID, запись из второй таблицы с поля T1_ID ставится в соответствие с записью из первой по полю ID.
неявно для построения такой связи строится временный индекс если его нет. (поэтому желательно чтобы он был ;) если собираешся это использовать)

а вообще выполни запрос только со связью без остального условия все ясно и станет.
вот так
SELECT * FROM T1 INNER JOIN T2 ON (T1.ID = T2.T1_ID)
и смотри в гриде результат. как из какой таблици поля расположились.


 
3APA3A ©   (2004-09-12 20:32) [7]

to sniknik
  Да. Спасибо. Разобрался.  Еще мануальчики кое-какие почитал...

to All  
  По поводу индексов.  Сидел сейчас, ждал свою ХП 13 минут. Сделал индекс по 1 полю - 18 секунд. Результат, конечно, впечатляет, но хотелось бы узнать к каким полям надо создавать индексы.  Я пока руководствуюсь следующим - есть поле в условии после WHERE ... - создаю по нему индекс. Может Вы еще что полезное посоветуете?


 
sniknik ©   (2004-09-12 20:45) [8]

> Может Вы еще что полезное посоветуете?
много их не делай если скорость записи в таблицу критична.

потом по твоему запросу
вот это
UPPER(T1.NAME) LIKE UPPER("%lalala%")
индексов не использует (т.что бессмысленно делать), да и UPPER для константной строки лишний (это вообше а не по индексам, трудно разве написать "%LALALA%"?), это не дельфи который все приведет к нужному виду.
только 2 индекса будут актуальны по T1.ID и T2.T1_ID

кстати а вот такое условие индекс использует (догадайся почему? ;о))
T1.NAME LIKE "LALALA%"


 
3APA3A ©   (2004-09-12 22:52) [9]

Да нет, это "lalala" на самом деле вовсе не "lalala", оно из приложения передается => надо UPPER()

 Видимо, из-за отсутствия "%" в начале строки.
 Тогда такой вопрос
  UPPER(T1.NAME) LIKE "LALALA%" - использует индексы?
  Мне кажется - нет...

 Да и вообще - где про это почитать можно (конкретно, про то, где и когда IB/FB/Yaffil использует индексы, желательно с тонкостями для каждой СУБД), а то собирать информацию такими кусочками даже не интересно...



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.049 c
3-1094737576
ZedeS
2004-09-09 17:46
2004.10.10
Отображение в Gridе


1-1096013979
Kerim
2004-09-24 12:19
2004.10.10
Наследование формы в разных пакетах


1-1096286189
Mar_Gel
2004-09-27 15:56
2004.10.10
Подскажите, как поменять иконку в программе во время выполнения?


3-1095050633
Jann
2004-09-13 08:43
2004.10.10
работа БД работающими под SQL Server


1-1095779730
M-Alex
2004-09-21 19:15
2004.10.10
Timer