powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / sqlite3/Qt 4.3.0 - разогнать удаление записей
18 сообщений из 18, страница 1 из 1
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34789792
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
В общем, ситуация:
имеется таблица, хранящая в себе древовидную :-\ структуру данных (такой
изврат мне понадобился из-за того, что структура ожидается объемом
полмиллиона нодов, в оперативку её не факт, что есть смысл запихивать
(хотя можно), плюс по ней нужен поиск по вилдкардам/маскам, который
дает БД).
Т.е. записи в духе "integer id, integer parent, данные", id - это
primary key unique not null autoincrement, а parent указывает на id
родительской записи в той же таблице (он может быть равен 0, если
это "корневая" запись.

Теперь вопрос. Как такое "дерево" быстро удалить? (в один запрос никак,
насколько я понимаю?)
банальный перебор всех потомков (т.е. select id from asdf where
parent=:id, чтобы узнать потомков, затем для него delete и все то же
для каждого найденного потомка) работает жутко медленно - порядка
минуты для 8000 записей. Можно чуть ускорить процесс, делая delete from
asdf where id=:id or parent=:id, но все равно получается медленно, плюс
требуется искать записи с потомками, это означает либо подзапрос
(тормоза) либо дополнительное поле в базу.

Как можно разогнать процесс такой структуры? Или проще отказаться от
хранения дерева в БД и искать другие пути?

Спасибо.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34789806
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV wrote:

> Здравствуйте!
> В общем, ситуация:
В общем, от идеи хранить древовидную структуру данных в табличной базе
данных пришлось отказаться - слишком неэффективно.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34789822
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErV wrote:

> слишком неэффективно.
Хотя не факт... поиск быстро работает...

в любом случае, вопрос об удалении дерева из базы остается открытым.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34791011
Nick_mi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если уж требуется часто убивать все дерево, и однозначно ивестно, что нижестоящие деревья не входят в какие-либо другие деревья, может стоит для каждой записи ввести ИД верхнего уровня.? Будет увличение дисковой памяти, но работать на удаление будет быстро.
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34791242
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nick_mi wrote:

> Если уж требуется часто убивать все дерево, и однозначно ивестно, что
> нижестоящие деревья не входят в какие-либо другие деревья, может стоит
> для каждой записи ввести ИД верхнего уровня.? Будет увличение дисковой
> памяти, но работать на удаление будет быстро.
В принципе, я о таком же варианте думал, спасибо.
Плохо то, что sqlite слишком медленно (хотя я реализовать мог криво)
работает на добавление новых записей для такой структуры. (записи надо
добавлять пачками по несколько тысяч штук. вчера обкатывал - тормозит
по черному, плюс база весит в 7 раз больше чем пожиравший оперативку
вариант, из-за которого все и было затеяно), т.е. от бд придется
отказаться.
Спасибо за совет, вопрос закрыт.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34792373
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVТеперь вопрос. Как такое "дерево" быстро удалить? (в один запрос никак,
насколько я понимаю?)Ну почему же?
SQLite3 умеет триггера делать. Добавь в свою базу такой триггер и проблема решена.
Код: plaintext
1.
2.
3.
create trigger Kill_Whole_Tree after delete on TreeTable
for each row begin
   delete from TreeTable where parentid=old.id;
end;
Теперь достаточно убить любую ноду, и все ее потомки будут убиты триггером.
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34792739
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl wrote:

> Ну почему же?
> SQLite3 умеет триггера делать. Добавь в свою базу такой триггер и
> проблема решена. create trigger Kill_Whole_Tree after delete on
> TreeTable for each row begin
> delete from TreeTable where parentid=old.id;
> end;
> Теперь достаточно убить любую ноду, и все ее потомки будут убиты
> триггером.
Мммм...
Не то. Потомки потомков не убивеются. Т.е. сносится не все дерево,
убивается пара сотен нодов и все. Объем же убиваемого дерева от 8 до
100 тысяч нодов. Целостность данных гарантирую (т.е. выполняется
условие, что нет ни одного нода, для которого отсутствет родитель, если
нод не корневой).

ЗА совет спасибо.

Соответственно, встречный вопрос: этого (триггеров), насколько я помню,
не было в "understaning sql"
(http://sql.ru/docs/sql/u_sql/index.shtml). Что есть смысл почитать,
чтобы с этим разделом ознакомиться? Сосднюю документацию?
(http://sql.ru/docs/mysql/rus_ref например?)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34792888
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVНе то. Потомки потомков не убивеются. Т.е. сносится не все дерево,
убивается пара сотен нодов и все.Это как это? Если потомков не убивать, то появится набор узлов без родителей. Можно в принципе убивать потомков до Х-колена а остальным обнулять родителя таким образом превращая их в корневые ноды, но это будет еще более странно :)

ErVСоответственно, встречный вопрос: этого (триггеров), насколько я помню,
не было в "understaning sql"
(http://sql.ru/docs/sql/u_sql/index.shtml). Что есть смысл почитать,
чтобы с этим разделом ознакомиться? Сосднюю документацию?
(http://sql.ru/docs/mysql/rus_ref например?)ээээ.... вообще-то, триггера это не совсем стандартная вещь, поэтому в книгах по стандарту SQL (как у Грабера например) это описано не будет а если и будет, то только в плане "есть еще такая штука в расширениях".
А MySQL триггеров вообще делать не умеет, поэтому они в его книжке тоже не описаны. Не стандартно это :)
Зато в SQLite триггера есть и конечно там они описаны: http://www.sqlite.org/lang_createtrigger.html
Но там уже практика, без теории.... А вот где почитать теорию.... Извините, но тут я не смогу помочь. Я сам их на практике изучал сравнивая описания триггеров в БД разных типов :)
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34792961
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl wrote:

> Это как это? Если потомков не убивать, то появится набор узлов без
> родителей. Можно в принципе убивать потомков до Х-колена а остальным
> обнулять родителя таким образом превращая их в корневые ноды, но это
> будет еще более странно :)
Не знаю почему, но в консоли оно не работает (хотя идея отличная). Могу
скинуть тестовую базу (180кбайт в рар-архиве), если хотите. Сессия
выглядит следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
bash- 3 . 1 $ sqlite3 ./cd.db
SQLite version  3 . 4 . 1 
Enter ".help" for instructions
sqlite> select count(id) from files;
 8383 
sqlite> select count(id) from files a where a.parent> 0  and not
exists(select id from files where id=a.parent);
 0 
sqlite> create trigger KillTree after delete on files
   ...> for each row begin
   ...> delete from files where parent=old.id;
   ...> end;
sqlite> delete from files where id= 1 ;
sqlite> select count(id) from files;
 8351 
sqlite> select count(id) from files a where a.parent> 0  and not
exists(select id from files where id=a.parent);
 176 
sqlite>
Т.е. видно, что сносятся потомки первой ноды, но для всех остальных
триггер не вызывается и получаются ноды без родителей.

версия sqlite - 3.4.1.

>Зато в SQLite триггера есть и конечно там они описаны:
>http://www.sqlite.org/lang_createtrigger.html
>Но там уже практика, без теории.... А вот где почитать теорию....
>Извините, но тут я не смогу помочь. Я сам их на практике изучал
>сравнивая описания триггеров в БД разных типов :)
ПОнятно, большое спасибо.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34795553
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ErVНе знаю почему, но в консоли оно не работает (хотя идея отличная).
....
Т.е. видно, что сносятся потомки первой ноды, но для всех остальных
триггер не вызывается и получаются ноды без родителей.Хм....странно.... похоже на недоделку. Попробуй заменить в заголоке триггера after на before, заработает?
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34796088
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl wrote:

> Хм....странно.... похоже на недоделку. Попробуй заменить в заголоке
> триггера after на before, заработает?
Нет. Эффект точно такой же. Один в один.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34796121
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Значит увы... триггера похоже пока не рабочие. Не умеют отрабатывать рекурсивно. Надо писать в саппорт....
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #34796177
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl wrote:

> Значит увы... триггера похоже пока не рабочие. Не умеют отрабатывать
> рекурсивно. Надо писать в саппорт....
Понятно. Спасибо за помощь.

ЗЫ. Вопрос закрыт. Решил отказаться от использования БД.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #35341839
theLexI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лол... а если убивать то место где привязка к дереву стоит, а в кроне делать обход всего дерева постепенно и убивать непривязанные ноды (те у кототых нет родителя)
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #35369294
Фотография PSmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
theLexIлол... а если убивать то место где привязка к дереву стоит, а в кроне делать обход всего дерева постепенно и убивать непривязанные ноды (те у кототых нет родителя)
До ...цатого колена включительно :-)
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #35370572
A.V.Goncharyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может воспользоватся
http://www.scalingweb.com/embedded_file_system.php
и держать дерево в меморимаппед файле ?
хе... изврат... но чего не придумаеш...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #36951681
_Black_Cat_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть еще фокус в том, что почти нигде рекурсивный триггер не работает.
Причем выдает ошибку, а тут получается, что хоть что-то делает...
...
Рейтинг: 0 / 0
sqlite3/Qt 4.3.0 - разогнать удаление записей
    #36953084
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
_Black_Cat_Есть еще фокус в том, что почти нигде рекурсивный триггер не работает.
Причем выдает ошибку, а тут получается, что хоть что-то делает...

Работает. Рекурсивные триггеры появились год назад. Впрочем, триггеры тут вовсе не по делу, т.к. для такой задачи есть стандартный механизм, описанный в любой приличной книжке по SQL:
http://www.sqlite.org/foreignkeys.html#fk_actions For an "ON DELETE CASCADE" action, this means that each row in the child table that was associated with the deleted parent row is also deleted.
Поддержка Foreign Key в SQLite добавлена одновременно или почти одновременно с рекурсивными триггерами.

Что касается постановки задачи, то линейную масштабируемость можно получить, только реализуя разделение дерева на поддеревья. В частности, модуль FTS3 именно так внутри устроен - и работает чертовски эффективно, у меня в тестах до полмиллиарда записей (база порядка 100 гиг), скорость вставки оставалась неизменной. Как хранилище использует обычные таблицы, но есть свои хитрости.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / sqlite3/Qt 4.3.0 - разогнать удаление записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]