| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Другие СУБД > Конструкция id IN (select id from..... - тормозит |
| Автор: mixb 13.4.2006, 10:26 | ||||||||||
| Возникла проблема в Paradox (работаю через BDE в TRxQuery Delphi5) : - конструкция
очень долго (несколько минут) выполняется, причем вот такая конструкция:
работает очень быстро В table1 - 3000 записей в table2 - 5000 записей Подозреваю что BDE каждый раз перевыполняет
Если вместо IN поставить "=" выполняется очень быстро Может запрос (select id from table2 where x = 1) возвращаеть 0 записей но работает вся конструкция очень долго. Использовать такой код:
на самом деле мне надо
Остается вариант выборки id из table2 ручками а затем подстановка в IN (id1,id2,...idn) Что тут делать? |
| Автор: ТоляМБА 14.4.2006, 13:46 | ||||
| Оговорки: У меня нет Paradox, поэтому не знаю, катят ли там JOIN’ы – если не катят – дальше можешь не читать. Если катят – переделай синтаксис, если надо – я передал просто суть. Делал на MS SQL Server 2000. Почему попробовал с джоинами - потому что на курсах говорили что джоины работают БЫСТРЕЕ (что тебе собственно и надо), чем подзапросы. И ещё – я проверял на маленькой тестовой таблице, какая будет скорость на большой – не знаю, но попробуй, напиши результат. Ворки: Table10 – Field1 (разные буквы), idn(цифры от 1 до 10) Table11 – Field2 (разные буквы, но в некоторых позициях писал ‘ff’), idn(цифры от 1 до 10) Запрос на выборку:
Запрос на удаление:
После запроса на удаление в Table10 остались только записи с идешниками совпадающими с идешниками Table11, в которых значения Field2<>’ff’. |
| Автор: bas 14.4.2006, 14:12 |
| В первом случае идет работа со списком который формируеться динамически (если есть индекс то он будет быстрее формироваться). Во втором случае список сформирован. |
| Автор: Sqlninja 15.5.2006, 11:46 |
| Убедись в том, что есть индекс для table2 по ID. |
| Автор: mixb 16.8.2006, 10:11 |
| Проблему решил через использование вспомогательной таблицы для подзапросов - в цикле while not query.EOF в строку записываю IDшники через запятую и потом в квадратные скобки и в SQL. 2Sqlninja, - индексы первым делом проверил - все которые используются - в наличии. Может дело в каких то настройках BDE? 2ТоляМБА, на SQL Server'e проблем с вложенными подзапросами мною не наблюдалось - и описываемая мной конструкция работала б. Кстати при JOIN - случайно не удалятся записи из Table11? 2bas - список формируется динамически но есть подозрения что подзапрос выполняется не один раз а при проверке каждой записи. Такое может быть? |