|
Скорость поиска по ID
|
|||
---|---|---|---|
#18+
Приветствую ! Есть простая таблица: Код: plsql 1. 2. 3. 4.
Которая фактически используется как key-value хранилище. В таблице около 7 миллионов записей. Файл базы данных лежит на SSD. Необходимо делать больше число запросов вида SELECT Name WHERE ID=X и как-то меня скорость не устраивает. На моей машине (Core I7 3.3 ггц + SSD)получается в районе 1000-1200 поисков в секунду ! Это нормально или как ? По идее ведь должно быть раз в 10 быстрее или я ошибаюсь ? з.ы. Доступ к БД из Delphi через компоненты LiteDAC от DevArt. А у вас какая средняя скорость поиска по ключу ? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 06:25 |
|
Скорость поиска по ID
|
|||
---|---|---|---|
#18+
amsdev, Для сгенерированной таблицы в 7 млн строк, значения поля "ID" от 1 .. 7 000 000, значение поля "Name" 4 буквенные слова. Получились такие результаты, в .NET: Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Тест Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 21:48 |
|
Скорость поиска по ID
|
|||
---|---|---|---|
#18+
Да, похоже тормозит LiteDAC не понятно почему. Через другой sqlite враппер получается не меньше 50к поисков в секунду. Попробую его профайлером.... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 00:32 |
|
Скорость поиска по ID
|
|||
---|---|---|---|
#18+
amsdev, Может LiteDAC не делает биндинг через sqlite а выполняет подстановку параметра в sql перед исполнением? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 13:32 |
|
Скорость поиска по ID
|
|||
---|---|---|---|
#18+
C LiteDAC не удалось разобраться почему тормозит, максимум что из него смог выжать это 2000 поисков в секунду по primary key полю. В качестве решения подошел опенсорсный Sqlite враппер от mORMot - www.synopse.info он гораздо тоньше и ближе к апи Sqlite чем LiteDAC, к тому же у автора-француза бзик на оптимизацию (в хорошем смысле). С ним получается 100 000 поисков в секунду (и в районе 200 000 если открыть базу данных в режиме Exclusive). С другой стороны, это не TDataSet, что не так удобно. Точнее там есть Датасет, эмулирующий обычный (и работающий на порядки быстрее), но он немного отличается там сям, а код переписывать лень. Поэтому для критичных мест использую mORMot, а для обычных - LiteDAC. LiteDAC в целом не плох и если не делать миллионов выборок в цикле то работает вполне сносно, хотя 300 баксов отданых за него жалко. Пример использования враппера mORMot для поиска, может кому пригодится: uses SynSQLite3, SynDBSqlite3, SynDB; // С начала где-то при старте проги нужно один раз сделать: FreeAndNil(sqlite3); sqlite3:=TSQLite3LibraryDynamic.Create('c:\sqlite3.dll'); // sqlite3 это глобальная переменная из SynSQlite3 // там можно использовать и статическую линковку, но мне нужна внешняя т.к. она собрана с особыми параметрами. // сама выборка var SqDb:TSQLDataBase; Qry:TSQLDBSQLite3ConnectionProperties; QryRes:ISQLDBRows; begin SqDb:=TSQLDataBase.Create('c:\mydb.db','',SQLITE_OPEN_READWRITE or SQLITE_OPEN_CREATE,10000); // 10000 это размер кэша Qry:=TSQLDBSQLite3ConnectionProperties.Create(SqDb); QryRes:=Qry.Execute(StringToUTF8('SELECT ID FROM MyTable WHERE ID=?'),[IDtoSearch]); if QryRes.Step then ShowMessage('Found'); Qry.Free; SqDb.Free; QryRes:=nil; // обязательно, иначе будет AV ! Это штатно по справке. end; ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 15:50 |
|
|
start [/forum/topic.php?fid=54&msg=39400821&tid=2008530]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 260ms |
total: | 394ms |
0 / 0 |