Я столкнусь с проблемами производительности, если я буду использовать поле блоба в качестве первичного ключа в SQLite?

Я не думаю, что вы можете получить что-то проще, чем это:

static uint Concat (uint a, uint b)
{
  uint
    pow = 1;

  while (pow < b)
  {
    pow = ((pow << 2) + pow) << 1;
    a = ((a << 2) + a) << 1;
  }

  return a + b;
}

, который не имеет выделения памяти, преобразования строк или умножения; или, может быть:

static uint Concat (uint a, uint b)
{
  uint
    pow = 1;

  while (pow < b)
  {
    pow = ((pow << 2) + pow) << 1;
  }

  return a * pow + b;
}

Если вы хотите объединить два двоичных числа:

static uint Concat (uint a, uint b)
{
  uint
    mask = uint.MaxValue;

  while ((mask & b) != 0)
  {
    mask <<= 1;
    a <<= 1;
  }

  return a | b;
}
10
задан Lawrence Barsanti 13 October 2009 в 20:28
поделиться

3 ответа

Лучший способ выяснить это - запустить запросы к таймеру профилировщика / SQLite. Настройте тест и выполните запрос 1000 раз со строкой, затем 1000 раз в виде большого двоичного объекта. Победитель - самый быстрый.

Интуиция - это одно, достоверные данные - другое.

14
ответ дан 3 December 2019 в 23:13
поделиться

Я думаю, AIEE, и на вашем месте я бы хранил GUID в паре целочисленных типов на SQLITE (SQLITE INTEGER - 64 бита).

Однако в этом случае blob может на самом деле работают лучше.

LFSR прав, профилируйте его.

1
ответ дан 3 December 2019 в 23:13
поделиться

Почему вы не должны его использовать

Первичный ключ часто индексируется и используется для сортировки. Большой двоичный объект не может быть проиндексирован, что делает его самым медленным из всех типов данных. Фактически, это худший выбор в качестве первичного ключа, и большинство баз данных, включая стандарт SQL99, запрещают его.

Проблема с BLOB заключается в том, что его тип данных неизвестен базе данных ( BLOB следует использовать только для чего-либо неопределенного, например логотипа, изображения, текстового документа, который может быть сохранен только как двоичные данные). Следовательно, он не может его оптимизировать. Еще одна проблема - отображение. Большой двоичный объект нельзя просто отобразить как текст.

Большинство реализаций SQL не позволяют сравнивать поля BLOB , но SQLite позволяет это. Однако он преобразует все, с чем вы его сравниваете, в blob, а затем сравнивает его по крупицам.

Лучшая альтернатива

Лучшим вариантом для столбца первичного ключа в SQLite является использование INTEGER PRIMARY KEY , как описано здесь ;: http://www.sqlite.org/lang_createtable .html # rowid дает лучшую производительность (он уже присутствует как столбец rowid , только с псевдонимом).

Заключение

Чтобы ответить на ваш вопрос: да, это влияет производительность плохо. Но что еще более важно, будет очень сложно хорошо управлять своими таблицами. Используйте INTEGER PRIMARY KEY , это действительно лучший, гарантированно уникальный и невероятно быстрый.

html # rowid дает лучшую производительность (он уже присутствует как столбец rowid , он просто псевдоним).

Заключение

Чтобы ответить на ваш вопрос: да, это влияет на производительность плохо. Но что еще более важно, будет очень сложно хорошо управлять своими таблицами. Используйте INTEGER PRIMARY KEY , это действительно лучший, гарантированно уникальный и невероятно быстрый.

html # rowid дает лучшую производительность (он уже присутствует как столбец rowid , он просто псевдоним).

Заключение

Чтобы ответить на ваш вопрос: да, это влияет на производительность плохо. Но что еще более важно, будет очень сложно хорошо управлять своими таблицами. Используйте INTEGER PRIMARY KEY , это действительно лучший, гарантированно уникальный и невероятно быстрый.

-1
ответ дан 3 December 2019 в 23:13
поделиться
Другие вопросы по тегам:

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