| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Firebird, Interbase > Несовпадающие записи |
| Автор: Zipper 27.4.2007, 11:39 |
| Есть таблица A и таблица Б. Структура таблиц одинаковая. Надо выбрать из таблицы Б записи которых нет в таблице А. Операций MINUS у нас нет? |
| Автор: Akella 27.4.2007, 16:45 |
| http://forum.vingrad.ru/forum/topic-146682.html |
| Автор: chief39 27.4.2007, 18:25 | ||
|
| Автор: Zipper 28.4.2007, 05:14 | ||||
А при использовании такого запроса на большой базе (2 млн. записей), у меня он не работал. Как только ограничивал выборку до 200-500 тыс. записей все ок! В FireBird (версия 1.5.3) есть какието ограничения на этот счет? |
| Автор: Akella 28.4.2007, 07:56 |
| думаю, что нет, просто FB "критично" относится к таким, можно сказать тяжёлым запросам, лучше этот запрос вставить в процедуру Добавлено через 41 секунду по идее процедура начинает отдавать записи ещё до того, как выполнится запрос полностью, ну или что-то в этом роде |
| Автор: Alex 30.4.2007, 09:14 | ||||||||||||
Бедный сервер да он при 2мил записях задымится от такого запроса должен был, но видимо разработчики это учли и поставили блокировку. А теперь разберемся по порядку: 1. Нам нужно выбрать все уникальные записи из таблицы B, мы вдруг начинаем просматривать таблицу А 2. Оператор in не использует индексированное чтение и заведомо работает крайне медлено Протестируем запрос на таблицах с 10000 записей (под рукой с большим не оказалось)
Результат:
Совсем немного переписав запрос:
Получим:
Добавлено через 2 минуты и 47 секунд Zipper, скажи пожалуйста, а сколько времени требовалось серверу, что бы отдать тебе результат даже для 300000 записей? Насколько я понимаю минут 6 должен был бедняга трудиться. |
| Автор: Zipper 2.5.2007, 07:30 | ||
Alex, что-то около 50 сек. Так все таки блокировка существует? Попробую твой вариант, сообщу о результатах. За ранее спасибо. Раньше работал с Oracle. Не достаточно еще разобрался с особенностями FireBird. Будем стараться. |
| Автор: Alex 2.5.2007, 10:22 | ||
Официально известно одно ограничение массив элементов для оператора in не может превышать 1500 элементов
На чем бы вы не работали запрос с оператором in тяжелая операция для сервера, да еще вы заставляете при каждой проверки условия выполнить выборку всей таблицы, а вам на самом деле нужно узнать только один элемент. |
| Автор: Zipper 3.5.2007, 05:13 | ||||
Мне надо отобрать все записи id которых не встречается в другой таблице. Я написал такой запрос
При выполнении выдается ошибка Arithmetic overflow or division by zero has ocurred. arithmetic exception, numeric overflow, or string truncation. Cannot transliterate character between character sets. c.fields типа Blob, s.tab_num типа integer В чем может быть дело? Периписал запрос следующим образом
все заработало. Наверно где-то в substring(c.fields from 9 for 6) были данные не конвертируемые в integer. |
| Автор: Zipper 3.5.2007, 11:38 | ||
| А еще одну проблему поможете решить? Есть такой update
Надо дополнить поле fields таблицы cards, если оно пустое, строчкой '00000007'+табельный_номер, который берется из поля tab_num (типа integer) таблицы "1SOTRONOS" при совпадении фамилии имени отчества. Но дело в том что встречаются полные тезки и соответственно выбираются несколько записей табельного номера, а он уникальный. как мне исклбчить такую ситуацию? Пусть выбирался бы только один из них. Второго можно поправить руками. |
| Автор: Akella 3.5.2007, 14:20 | ||||
в FB 2.0 и выше уже и in использует индексы Добавлено @ 14:23
да это так, но в этом случае вываливается исключение, а не так что сервер тихо блокирует... Добавлено @ 14:25 Zipper, это по идее уже должна была быть новая тема про UPDATE Добавлено через 13 минут и 37 секунд Alex, если можно использовать exists, то вообще зачем тогда in? Или in это старый оператор, так сказать и его лучше не использовать? |
| Автор: Alex 3.5.2007, 15:02 | ||||||||
На практике это у него не всегда получается
лично мне до сих пор слабо верится, что там тихо промолчали...
Задачи разные у людей бывают |
| Автор: Zipper 4.5.2007, 05:40 |
Вериться не вериться, а промолчал. То есть если SQL возвращает более 1500 тысячей записей в операторе IN ( select ...), то сервер такой запрос не выполнит и должен выдать исключение? |
| Автор: Alex 4.5.2007, 08:14 | ||
Лично я не уверен, что на select в in это условие распространяется В чем тестировался запрос? |
| Автор: Akella 4.5.2007, 11:53 | ||||
нет, в этом случае думаю, что всё нормально будет (хотя не уверен), а вот если так:
будет ошибка точно |
| Автор: Akella 7.5.2007, 14:51 | ||||||
| но иногда, например, как у меня не получается заменить IN на exist, почему спросите? вот почему: на форме есть до десяти TCheckBoxList`ов, пользователь отмечает в некоторых флажки в итоге получается такой запрос
всё время переменное число параметров для инструкции IN не удасться переделать на
или так создавать запрос???
Добавлено через 11 минут и 42 секунды Ну понятно, что пользователь не отметит такой кол-во флажков. Но реально была ситуация, когда нужно было отметить все 2100 флажков и снять отметки у 5-ти флажков и так в двух списках |
| Автор: Alex 7.5.2007, 15:06 |
бред полный написан... Такой запрос всегда вернет все записи из таблицы vw_apartments |
| Автор: Akella 7.5.2007, 15:20 |
| переделываю Добавлено через 3 минуты и 46 секунд к сожалению нельзя использовать что-то вроде a.id_type exist(10, 20...) |
| Автор: Alex 7.5.2007, 15:26 | ||
Очень интересно, чем это от использования in отличается???? |
| Автор: Akella 7.5.2007, 15:27 | ||||||||
разница во времени между
и
незначительная а код на много проще Добавлено через 5 минут и 38 секунд странно, что в первом случае больше времени понадобилось... неужели опять запрос неверный? |
| Автор: Akella 7.5.2007, 15:50 | ||
синтаксис разный:
как такое реализовать с пом. EXISTS? |
| Автор: Akella 7.5.2007, 16:07 | ||||
как видите в IN индексы используются
|
| Автор: Alex 8.5.2007, 07:10 | ||||||||
Вообще то, а что в нем верного ты видишь? Единственное, какое применение я вижу этому кошмару, это если при разработке БД с помощью внешних ключей не наложили ограничение, что в поле a.id_type могут храниться данные только из таблицы type и теперь при каждом запросе выборки как сумашедшие это проверяют. И потом что вообще сравниваешь? Если хочется сравнить скорости, то пиши
и
И будет показан одинаковый результат Ну и даже немного если включить логику и вспомнить sql, то и первый запрос можно ускорит одним простым движением
PS: Сереж, заканчивай, а то у меня уже волосы начинают шевелиться от твоих запросов... |
| Автор: Akella 8.5.2007, 08:05 |
| ну хорошо, как же мне перестроить "логику" построения запроса в "таких условиях" |
| Автор: Deniz 18.5.2007, 10:50 | ||||
Вроде все прочитал, но не увидел запроса с join, который выполняет заданное условие задачи.
Преложу решение с JOIN
|