Size: a a a

DBA - русскоговорящее сообщество

2020 December 26

LE

Lex E in DBA - русскоговорящее сообщество
Serg
Вот, кстати, запрос создания таблицы
CREATE TABLE states (
uid INTEGER NOT NULL UNIQUE,
data BLOB,
PRIMARY KEY(`uid`)
);
Индекс я тут вроде как создаю для uid.
Попробуй поэкспериментиповать с  CREATE INDEX
Будет ли разница
источник

x

x in DBA - русскоговорящее сообщество
Это и так первичный ключ, не нужен тут индекс
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Lex E
Попробуй поэкспериментиповать с  CREATE INDEX
Будет ли разница
Не надо. Потому что не будет разницы
источник

x

x in DBA - русскоговорящее сообщество
Serg
Вопрос по SQLite C#. Если вызываю этот метод в цикле 100-1000 раз, то проект ооочень надолго задумывается. Что можно предпринять или что нужно поменять, при условии что заранее неизвестно сколько будет итераций? Может метод или запрос неверные?
Попробуйте вместо вызова 100 раз, вызвать один раз, но достать 100 строк

Используя, например, where uid in
источник

S

Serg in DBA - русскоговорящее сообщество
В общем суть в чем. Тут как чтение так и запись важны. В игре есть заспавненные по всей карте ресурсы - деревья, камни и т.д. Когда игрок срубает дерево, нужно записать в БД, что данное дерево теперь имеет 0 ресурсов до его респавна. Если игроков на сервере будет 200-250, и даже половина будет добывать ресурсы, то есть вероятность одновременной записи в базу данных 100-150 запросов. Как вариант я думаю создавать временный список, и как-то раз в секунду одним запросом все это записывать в БД.
источник

x

x in DBA - русскоговорящее сообщество
Так это на сервере? Тогда очевидно используйте нормальную СУБД, а не sqlite
источник

S

Serg in DBA - русскоговорящее сообщество
Сразу скажу, что существует массив ресурсов в памяти, с ним идет основная работа. Запись в БД нужна на случай непредвиденного завершения работы сервера, чтобы при возобновлении работы можно было восстановить состояние игрового мира.
источник

S

Serg in DBA - русскоговорящее сообщество
x
Так это на сервере? Тогда очевидно используйте нормальную СУБД, а не sqlite
Мне нужно чтобы сервер работал независимо, скопировал папку на другую машину (хостинг), и все работает дальше.
источник

S

Serg in DBA - русскоговорящее сообщество
К тому же, таких серверов может быть запущено 2-3 на одной машине.
источник

S

Serg in DBA - русскоговорящее сообщество
Поэтому выбор пал именно на SQLite, которая встраивается в само приложение.
источник

x

x in DBA - русскоговорящее сообщество
А при "падении" выбора вы учитывали требования к нагрузке и перфомансу?
источник

S

Serg in DBA - русскоговорящее сообщество
x
А при "падении" выбора вы учитывали требования к нагрузке и перфомансу?
Немного не понял вопрос) Что такое "падение выбора" и "перфоманс".
источник

x

x in DBA - русскоговорящее сообщество
В общем сначала убедитесь, что проблема в базе, а не в приложении. Как минимум у Вас коннекшен создается при каждом вызове метода, что уже антипаттерн.
Во-вторых, как писали выше - попробуйте выбирать не по одной строке, а несколько.
В любом случае, с sqlite вы упрётесь в производительность, и ваша возможность копировать папки между серверами будет не нужна
источник

S

Serg in DBA - русскоговорящее сообщество
x
В общем сначала убедитесь, что проблема в базе, а не в приложении. Как минимум у Вас коннекшен создается при каждом вызове метода, что уже антипаттерн.
Во-вторых, как писали выше - попробуйте выбирать не по одной строке, а несколько.
В любом случае, с sqlite вы упрётесь в производительность, и ваша возможность копировать папки между серверами будет не нужна
Ну вот с MySQL у меня не было проблемы произвести 2-10 тыс. запросов за секунду, а тут с SQL прям 50 проблема (максимум что она может).
источник

x

x in DBA - русскоговорящее сообщество
Потому что она не предназначена для такого
sqlite.org/whentouse.html
источник

S

Serg in DBA - русскоговорящее сообщество
Хорошо. Изучу материал.
источник

E

Etki in DBA - русскоговорящее сообщество
Lex E
Поздрааляю, ты столкнулся с потребностью оптимизировать нагрузку на БД)
Это очень частая штука.

Select * - означает что мы выбираем всю таблицу, и время выполнения (time complexity) будет n^2

Наша задача уменьшить время выполнения до lg n или n.
Мы не хотим читать всю таблицу каждый раз, поэтому делаем индекс. Он будет бинарным деревом с временной сложностью lg n

Профит

https://sqlite.org/lang_createindex.html

https://sqlite.org/faq.html#q19
> Выбираем всю таблицу

Там where так-то

> N^2

Че
Откуда в итерации без вложенных итераций N^2?
источник

x

x in DBA - русскоговорящее сообщество
Да кринж какой-то
источник

LE

Lex E in DBA - русскоговорящее сообщество
Etki
> Выбираем всю таблицу

Там where так-то

> N^2

Че
Откуда в итерации без вложенных итераций N^2?
Как только мы сделали SELECT *... это уже lg n, как минимум

Сохранили в переменную и пошли перебирать , это еще n

(Lg n) + n = n

Получается линейное время, не квадратичное

Точняк
источник

IZ

Ilia Zviagin in DBA - русскоговорящее сообщество
Lex E
Поздрааляю, ты столкнулся с потребностью оптимизировать нагрузку на БД)
Это очень частая штука.

Select * - означает что мы выбираем всю таблицу, и время выполнения (time complexity) будет n^2

Наша задача уменьшить время выполнения до lg n или n.
Мы не хотим читать всю таблицу каждый раз, поэтому делаем индекс. Он будет бинарным деревом с временной сложностью lg n

Профит

https://sqlite.org/lang_createindex.html

https://sqlite.org/faq.html#q19
Да, про N^2 ты подзагнул...
источник