crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Как ускорить создание таблицы (через QSqlQuery)?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
512es Дата 20.3.2010, 20:57
  Извиняюсь, что тема давнешняя. Но до сих пор, (раз я сюда попал) актуальная.

Так вот, хочу сказать что для ускорения инсерта в склайт базу, лучше всего подходит инсертить в темпорари таблицу, а из неё моментально всё перелетает в обычную.

Вот только с постгресом это не прокатывает. Попробую через execBatch..
Tonal Дата 18.2.2009, 13:10
  Последовательность их вызова зависит от компилятора и оптимизатора.
Но если запросы в них выполняются в разных транзакциях, как это происходит в Qt если не стартовать транзакцию явно, то между первым и вторым может вклиниться кто-то третий и изменить состав таблицы.
Если же транзакция одна (с соответственным уровнем), то вклинится никто не может.
SABROG Дата 18.2.2009, 11:52
 
Цитата(Tonal @ 18.2.2009, 11:38) *
Функция test() может вернуть false, если вызвана не внутри транзакции.


Мне память не изменяет, сначала будет вызвана rt_count(), затем sql_count()?
Tonal Дата 18.2.2009, 11:38
  Транзакции нужны для гарантирования атомарности изменений и консистентности данных.
Простой пример:
int sql_count() {
  QSqlQuery query("SELECT COUNT(*) FROM tbl");
  return query.value(0).toInt();
}

int rt_count() {
  QSqlQuery query("SELECT * FROM tbl");
  int count = 0
  while (query.next())
    ++count;
  return count;
}

bool test() {
  return sql_count() == rt_count();
}

Функция test() может вернуть false, если вызвана не внутри транзакции.
Litkevich Yuriy Дата 18.2.2009, 1:49
 
Цитата(Rocky @ 18.2.2009, 0:37) *
при навигации по таблице БД, нужно их использовать? Или они толку не дадут?
для случая с SQLite наверное не нужно. А вот при использовании более продвинутых СУБД, может и понадобится. Зависит от того, как ты потроха реализовал. Напримр, если ты используешь процедуру выбора, в которой вызывается другая процедура, что-либо изменяющая в БД, то не откатывая явно транзакцию в БД будет мусор создаваться (во внутренностях) - БД будет расти. Надо будет ее чистить.
trdm Дата 18.2.2009, 0:50
 
Цитата(panter_dsd @ 17.2.2009, 23:34) *
И изменяют нормально. Блокировки работают.
Т.е. пишут поочередно, что дает небольшие потери в скорости.

авторы скулайта предупреждали вроде,
что на смешанных архитектурах блокировки работать будут через пень колоду,
так что там танцевать надо хорошенько вокруг этого процесса - отключать кеширования дисков и
типа не любит она толи фата то-ли нтфс-а.
не помню, но читал...
Цитата
SQLite uses POSIX advisory locks to implement locking on Unix. On Windows it uses the LockFile(), LockFileEx(), and UnlockFile() system calls. SQLite assumes that these system calls all work as advertised. If that is not the case, then database corruption can result. One should note that POSIX advisory locking is known to be buggy or even unimplemented on many NFS implementations (including recent versions of Mac OS X) and that there are reports of locking problems for network filesystems under Windows. Your best defense is to not use SQLite for files on a network filesystem.
panter_dsd Дата 17.2.2009, 23:34
  И изменяют нормально. Блокировки работают.

Т.е. пишут поочередно, что дает небольшие потери в скорости.
SABROG Дата 17.2.2009, 22:42
 
Цитата(panter_dsd @ 17.2.2009, 22:16) *
У меня нормально 5 клиентов на одной базе уживалось, все нормально было. :)

В общем чтение множеством клиентов возможно, а изменение нет.
Цитата
(5) Can multiple applications or multiple instances of the same application access a single database file at the same time?

Multiple processes can have the same database open at the same time. Multiple processes can be doing a SELECT at the same time. But only one process can be making changes to the database at any moment in time, however.


Теперь уже сложно сказать полезен begin transaction для select'a или нет...

Про forwardonly тут http://www.sqlite.org/cvstrac/wiki?p=ScrollingCursor
Kagami Дата 17.2.2009, 22:40
 
Цитата(Rocky @ 17.2.2009, 21:37) *
Ув. форумчане, не подскажите вот при навигации по таблице БД, нужно их использовать? Или они толку не дадут?

Для ускорения навигации можно использовать следующее:
Цитата
void QSqlQuery::setForwardOnly ( bool forward )
Sets forward only mode to forward. If forward is true, only next() and seek() with positive values, are allowed for navigating the results.
Forward only mode can be (depending on the driver) more memory efficient since results do not need to be cached. It will also improve performance on some databases. For this to be true, you must call setForwardMode() before the query is prepared or executed. Note that the constructor that takes a query and a database may execute the query.
Forward only mode is off by default.
Rocky Дата 17.2.2009, 22:39
  Ага, теперь разобрался.. Спасибо :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 23:57