Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163

Не работает DELETE для "повторяющихся" строк

19.02.2024, 20:51. Показов 5339. Ответов 134

Студворк — интернет-сервис помощи студентам
Здравствуйте, добрые люди!
Долго колупался с ускорением заполнения базы и доколупался до хорошей для меня скорости наполнения, однако без граблей не обошлось, когда я опустил проверки на точность параметров при замене данных получил дублирование для одного набора ключей записей с разной точностью. Исходная тема (Импорт данных из файла в БД) короткая, да и проблема видна когда пытаюсь отладить макрос в самой БД.
Как видно из запроса есть 5 ключевых параметров и пара значимых полей в записи - это значение и его точность.

Чтобы было понятно, чем больше число тем ниже точность.

Итак нашел я замечательный пример и попробовал состряпать свой запрос на удаление повторяющейся записи с меньшей точностью. Для начала изобразил выборку, абы проверить правильно ли выбирает, оставил в последствии только те записи, что подлежат удалению:

SQL
1
2
3
SELECT a.* FROM Weather a,
(SELECT * FROM Weather) b
WHERE a.ID_MD = b.ID_MD AND a.DT = b.DT AND a.LAT = b.LAT AND a.LON = b.LON AND a.SOURCE = b.SOURCE AND a.QUAL > b.QUAL AND NOT ISNULL(a.ZNCH) AND NOT ISNULL(b.ZNCH)
Эта штуковина работает, однако по замыслу авторов для удаления этих записей замена SELECT a.* на DELETE a.* приводит к ошибке "Не возможно удаление записей из указанных таблиц", а справка говорит, что недостаточно прав в пяти вариациях... С чего бы? В свойствах запроса разрешения на удаление есть
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2024, 20:51
Ответы с готовыми решениями:

Клавиша delete не работает,а вот shift + delete работает
Ни ничего не могу удалить как обычно клавишей delete работает только при сочетании shift + delete W7 64 bit Добавлено через 2 часа...

1. Реализовать функции для вставки и удаления строк аналогичные процедурам Insert и Delete в Турбо-Паскале.
Реализовать функции для вставки и удаления строк аналогичные процедурам Insert и Delete в Турбо-Паскале. Помогите,пожалуйста,завтра нужно...

Не работает функция для удаления повторяющихся символов в строке
Вместо удаления остается часть, например из EEEEEEE делается не E, а EEE к примеру, как исправить? string removeSymbols(string input) {...

134
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
22.02.2024, 16:19
Студворк — интернет-сервис помощи студентам
UPDATE пустого значения - это исключение такое же как у ИНСЕРТ в заполненную ячейку - проходили
Очень странно, не должно быть такого. Может быть у Вас настройки такие
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
22.02.2024, 16:27  [ТС]
Цитата Сообщение от Swa111 Посмотреть сообщение
Очень странно
Если бы было не так, то инструкция ИНСЕРТ не имела бы место быть.
АПДЕЙТ можно выполнить только при наличии строки, ее отсутствие порождает исключение
ИНСЕРТ создает строку и если она уже есть - исключение
Это природа команд
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
22.02.2024, 16:34
про природу Update я с Вами не соглашусь, ибо сам никогда не встречал подобных исключений. Проверил в Access через VBA - исключение нет, просто выставляется свойство RecordsAffected в 0.
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
22.02.2024, 16:34  [ТС]
Цитата Сообщение от Swa111 Посмотреть сообщение
Еще хотелось бы уточнить, перед началом обновления БД Вы начинаете явно транзакцию?
Я перевожу таблицу в режим BATCHOptimistic по окончанию "мероприятий" вставки делаю BATCHUPDATE и возвращаю режим Optimistic.
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
22.02.2024, 16:37
Попробуйте в дополнение явно начать транзакцию и закоммитить ее после всех изменений, возможно в Вашем API есть подобные методы:https://learn.microsoft.com/ru... ethods-ado
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
22.02.2024, 18:04  [ТС]
Цитата Сообщение от Swa111 Посмотреть сообщение
Проверил в Access через VBA
Я работаю в Builder через ADO компоненты с движком Jet, там шаг влево вправо - расстрел через хренову тучу окошек с предупреждением о вставке цилиндра в непотребное место

Добавлено через 6 минут
Цитата Сообщение от Swa111 Посмотреть сообщение
Попробуйте в дополнение явно начать транзакцию и закоммитить ее после всех изменений
Насколько я понял смысл того, что я делаю, это полностью соответствует транзакции, действия накапливаются в "кеше" а по окончании записываются в БД или просто игнорятся-отменяются.
не готов проверять потому как примеров не видел и особенностей режима тоже не знаю

Добавлено через 26 минут
Цитата Сообщение от POJIBOX Посмотреть сообщение
и особенностей режима тоже не знаю
посмотрел вроде как не сложно можно попробовать...

Добавлено через 32 минуты
Цитата Сообщение от POJIBOX Посмотреть сообщение
Я работаю в Builder через ADO компоненты с движком Jet, там шаг влево вправо - расстрел
Вот это косяк! попробовал АПДЕЙТить пустую базу - нуль ошибок нуль записей, странно но уменя орала раньше в голос
0
Модератор
Эксперт MS Access
 Аватар для shanemac51
12511 / 5085 / 814
Регистрация: 07.08.2010
Сообщений: 14,959
Записей в блоге: 4
22.02.2024, 18:37
Цитата Сообщение от POJIBOX Посмотреть сообщение
Ну раз на слово не верите, посмотрите, не знаю что вам может сказать двоичный формат, в описании формата так и сказано, что он предназначен для машинной обработки
При том что данные пакуются нестандартной длиной битов
естественно, что двоичные данные меня да и аксесс не интересуют, но получается, что порядок действий примерно такой
- чем-то открываете двоичные данные,
- как-то преобразовываете
- запоминаете где-то выбранные записи в нужном для аксесс формате. например в текстовом или НТМ формате

но надо ли формировать колоссальную базу на 10м записей?
может разумнее учитывать требования последующей обработки, группируя по датам или регионам наблюдений?

я это имела ввиду
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
22.02.2024, 19:37  [ТС]
Цитата Сообщение от shanemac51 Посмотреть сообщение
- запоминаете где-то выбранные записи в нужном для аксесс формате. например в текстовом или НТМ формате
Какой смысл - все равно пихать в БД (или сначала в файл а потом в БД)?

Цитата Сообщение от shanemac51 Посмотреть сообщение
может разумнее учитывать требования последующей обработки, группируя по датам или регионам наблюдений?
А я что сделал? выбрал нужные данные из нужных источников, для нужных районов, в нужное время, как это еще оптимизировать можно? И естественно по запросу пользователя я представляю ему результаты обработки по конкретной задаче на конкретное время

Добавлено через 5 минут
Такс, проверил вариант try INSERT catch UPDATE, работает только при строгом индексе по 5 основным полям: - не советую 8 минут против 4 на чистую базу, при обновлении данных даже пробовать не буду и так понятно проще очистить от мусора и динамически добавлять - удалять индекс.
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
22.02.2024, 19:37
Какой смысл - все равно пихать в БД (или сначала в файл а потом в БД)?
Собственно с SQLite я так и сделал по сути. В целом не понятно сколько из этих 4 минут занимает чтения и декодирование самих файлов, а сколько вставка в БД.
0
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,355
22.02.2024, 19:51
А на клиенте не пробовали делать проверку "дублей" метрик импорта перед добавлением в БД?
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
22.02.2024, 19:54  [ТС]
Цитата Сообщение от Swa111 Посмотреть сообщение
В целом не понятно сколько из этих 4 минут
Таки если тупо пихать в чистую базу все подряд - это 2 минуты. Т.е. расшифровка точно не более 2 минут остальное возня с БД

Добавлено через 1 минуту
Цитата Сообщение от Jamaica Посмотреть сообщение
А на клиенте не пробовали делать проверку "дублей"
Я матершину не понимаю, как это выглядит?
0
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,355
22.02.2024, 19:57
Цитата Сообщение от POJIBOX Посмотреть сообщение
Таки если тупо пихать в чистую базу все подряд
Вот перед "пиханием все подряд", проверить импортируемые метрики,
и пихать/править только нужные?
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
22.02.2024, 20:12  [ТС]
Цитата Сообщение от Swa111 Посмотреть сообщение
SQL
1
DROP INDEX IX ON Weather;
а ежели его еще нет - исключение или пофиг?

Добавлено через 3 минуты
Цитата Сообщение от Jamaica Посмотреть сообщение
проверить импортируемые метрики
их можно проверить только сравнив с тем, что находится в основной таблице, значит нужно хранить импортируемые данные во временной таблице и потом в 3 захода объединять и чистить временную таблицу выигрыш не определен...

Добавлено через 2 минуты
Цитата Сообщение от Jamaica Посмотреть сообщение
Вот перед "пиханием все подряд", проверить импортируемые метрики,
и пихать/править только нужные?
наверное это близко по смыслу
Цитата Сообщение от POJIBOX Посмотреть сообщение
Такс, проверил вариант try INSERT catch UPDATE, работает только при строгом индексе по 5 основным полям: - не советую 8 минут против 4 на чистую базу
Про построчный UPDATE больше слышать не хочу

Добавлено через 6 минут
А еще забыл добавить я сжимаю БД после работы и это входит во время но там не больше 10 секунд

Добавлено через 1 минуту
Цитата Сообщение от POJIBOX Посмотреть сообщение
а ежели его еще нет - исключение или пофиг?
проверил исключение, а как проверить есть ли индекс?
0
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,355
22.02.2024, 20:26
Цитата Сообщение от POJIBOX Посмотреть сообщение
значит нужно хранить импортируемые данные во временной таблице и потом в 3 захода объединять и чистить временную таблицу
Аккурат от этого я считаю можно уйти, если будет адекватное время исполнения.
1. Поднимаем рекордсет на основную таблицу, читаем ее, и и запихиваем метрики в коллекцию Rows
в виде инстансов класса Row.
2. При поступлении новой метрики от парсера, проверяем коллекцию Rows на наличие дубликатов
с новой метрикой (по 5 полям).
2.1. При отсутствии метрики в коллекции, создаем для нее инстанс Row, и добавляем в коллекцию Rows.
2.2.1 При наличии дубля, анализируем остальные поля, если новая метрика нам интереснее имеющейся,
правим значения полей в имеющемся инстансе Row, UPDATE старой метрики в таблице, новую метрику не добавляем.
2.2.2 При наличии дубля, анализируем остальные поля, если новая метрика нам неинтересна - пропускаем.

По завершении работы парсера (кончились новые метрики), мы имеем в коллекции Rows набор метрик и старых, и новых,
но уже очищенных от дублей как внутри самого импортируемого пакета, так и с учетом имеющихся в Weather.
Остается данные "новых" метрик загнать в рекордсет и UpdateBatch.

То есть не нужна таблица Import, не нужны запросы на чистку, и в Weather, теоретически не нужен составной индекс,
только ключевое поле.

Я имитировал такое решение, время исполнения дольше чем штатным DAO, но в принципе приемлемое.
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
22.02.2024, 20:26
а ежели его еще нет - исключение или пофиг?
Если есть возможность то проверить код ошибки. Если код о том что индекс не существует, то безмолвно продолжить дальше, если что то другое - то ошибка БД.

проверил исключение, а как проверить есть ли индекс?
По идее даже если он и был до начала операции, дроп должен был его удалить. Если падает с ошибкой значит что то не так с бд.

Таки если тупо пихать в чистую базу все подряд - это 2 минуты
Как то все грустно с этим JET. Я конечно понимаю что на переправе коней не меняют. Но 2 минуты это много. Попробовал быстренько накидать на питоне программку так там вставка из CSV (Как бы эмулируем уже декодированные данные) с акутализацией даже всего массива данных на 600к строк занимает около 2-5 сек.
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
22.02.2024, 20:31  [ТС]
Цитата Сообщение от Swa111 Посмотреть сообщение
так там вставка из CSV (Как бы эмулируем уже декодированные данные)
Так это декодированные, а время декодирования и записи в CSV?
0
1333 / 551 / 112
Регистрация: 29.03.2016
Сообщений: 1,355
22.02.2024, 20:32
Цитата Сообщение от Swa111 Посмотреть сообщение
Как то все грустно с этим JET.
Со стороны, да.
Внутри штатным DAO вполне шустро.
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
22.02.2024, 20:37  [ТС]
Цитата Сообщение от Jamaica Посмотреть сообщение
Я имитировал такое решение, время исполнения дольше чем штатным DAO, но в принципе приемлемое.
Блин, я уже говорил, тупое раскодирование и пихание в пустую таблицу - 2 минуты, на все про фсе с очисткой, сжатием без индекса 4 минуты, с индексом 6 (но не уверен, что это не результат какой-нибудь подставы).
Над чем мы сейчас бьемся? из 2 минут мы не вылезем никак! это тупо минимальнейшее время все остальное требует ресурсов в конечном итоге сводящих результат потуг на минимум
0
919 / 292 / 58
Регистрация: 01.06.2023
Сообщений: 818
22.02.2024, 20:43
Так это декодированные, а время декодирования и записи в CSV?
Как оптимизировать декодирование GRIB это уже выходит за рамки этого топика. Я уверен что у SQLite есть библиотеки для встраивания и под Ваш язык. Просто дергаем подготовленный запрос на Insert. Я использовал CSV как эмулятор декодера.

Добавлено через 4 минуты
Цитата Сообщение от POJIBOX Посмотреть сообщение
Блин, я уже говорил, тупое раскодирование и пихание в пустую таблицу - 2 минуты, на все про фсе с очисткой, сжатием без индекса 4 минуты, с индексом 6 (но не уверен, что это не результат какой-нибудь подставы).
Над чем мы сейчас бьемся? из 2 минут мы не вылезем никак! это тупо минимальнейшее время все остальное требует ресурсов в конечном итоге сводящих результат потуг на минимум
Тогда решение было озвучено. Вставляете все скопом. Перед вставкой начинаете транзакцию, удаляете индексы. По окончанию импорта индексируете, удаляете дубли и не нужные данные, коммит. На этом и расходимся.
0
 Аватар для POJIBOX
2 / 2 / 0
Регистрация: 03.06.2018
Сообщений: 163
22.02.2024, 20:44  [ТС]
Можно конечно определить потолок скорости вычистив все операции с БД и оставив только распаковку и формирование строк, но все это муторно... что даст?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.02.2024, 20:44

Для линейного вещественного массива найти произведение всех повторяющихся и не повторяющихся элементов
Для линейного вещественного массива Х найти произведение всех: а) повторяющихся элементов б) не повторяющихся элементов Добавлено...

Как вызвать "Delete" для строк?
with lst1.Items do for i:=1to TextEnd do begin s:=Strings; if Pos('(compInst',s)>0then begin ...

Стандартная функция delete в Eclipse работает а в AndroidStudio не работает
case R.id.btnDelete: {//Кнопка удаление последнего символа ...

Почему не работает Update, но работает аналогичный Delete?
В xmal есть datagrid в него подтянута из базы информация. Название и количество. Надо сделать во viewmodel кнопки delete и update. Delete ...

Использование строк: Функция Delete(s1, s2)
Здравствуйте! В общем, мне нужно было создать функцию DELETE(s1, s2), которая удаляет из строки s1 все символы, встречающиеся в строке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
120
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru