Как назвать структуру данных, на русском языке, за счёт которой запрос в sqlite будет выполняться быстрее?

Здравствуйте, прохожу онлайн-квест для андроид-разработчиков https://contest.yandex.ru/droid_mission
Не могу решить задачу :)

Задача:
Тихим пятничным вечером двое агентов остаются допоздна и ведут неразрешимый спор. Им поручили хранить большой объем секретных данных в БД Sqlite с целочисленным ключом key.

Агент А создает таблицу запросом вида:
CREATE TABLE t(key INT PRIMARY KEY, secret_value_1, secret_value_2)
, а агент Б — запросом вида
CREATE TABLE t(key INTEGER PRIMARY KEY ASC, secret_value_1, secret_value_2)
.

Агент А абсолютно уверен, что в его запросе нет ошибки, однако у агента Б есть аргумент против этого: он утверждает, что целостность данных при подходе агента А может быть нарушена.

Перечислите через запятую: колонку или колонки, которые отвечают за целостность у агента Б, но не отвечают у агента А; а также структуру данных, на русском языке, за счёт которой запрос агента Б будет выполняться быстрее.

Вопрос:
Не пойму в чем дело, я уже загуглил что INTEGER (alias ROWID) вместо INT быстрее. Второе что мне кажется я не пойму это написать на русском структуру данных, на русском языке, за счёт которой запрос агента Б будет выполняться быстрее. Я думаю это индекс.
Я ответил key,индекс но это не правильынй ответ.
А что вы думаете по поводу этой задачи?
  • Вопрос задан
  • 803 просмотра
Пригласить эксперта
Ответы на вопрос 1
@BorisKorobkov
Web developer
1. "ROWID"
https://sqlite.org/lang_createtable.html#rowid
The data for rowid tables is stored as a B-Tree structure containing one entry for each table row, using the rowid value as the key. This means that retrieving or sorting records by rowid is fast. Searching for a record with a specific rowid, or for all records with rowids within a specified range is around twice as fast as a similar search made by specifying any other PRIMARY KEY or indexed value.


2. "автоинкремент"
https://www.sqlite.org/datatypes.html
One exception to the typelessness of SQLite is a column whose type is INTEGER PRIMARY KEY. (And you must use "INTEGER" not "INT". A column of type INT PRIMARY KEY is typeless just like any other.)

INTEGER PRIMARY KEY columns can be used to implement the equivalent of AUTOINCREMENT. If you try to insert a NULL into an INTEGER PRIMARY KEY column, the column will actually be filled with an integer that is one greater than the largest key already in the table.

Перед вставкой у агента Б автоматически будет запрос по первичному ключу
SELECT seq + 1 FROM sqlite_sequence WHERE name = 't'

, а у агента А полный перебор таблицы
SELECT MAX(key) + 1 FROM t
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы