Я не думаю, что вы можете получить что-то проще, чем это:
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;
}
Лучший способ выяснить это - запустить запросы к таймеру профилировщика / SQLite. Настройте тест и выполните запрос 1000 раз со строкой, затем 1000 раз в виде большого двоичного объекта. Победитель - самый быстрый.
Интуиция - это одно, достоверные данные - другое.
Я думаю, AIEE, и на вашем месте я бы хранил GUID в паре целочисленных типов на SQLITE (SQLITE INTEGER - 64 бита).
Однако в этом случае blob может на самом деле работают лучше.
LFSR прав, профилируйте его.
Первичный ключ часто индексируется и используется для сортировки. Большой двоичный объект
не может быть проиндексирован, что делает его самым медленным из всех типов данных. Фактически, это худший выбор в качестве первичного ключа, и большинство баз данных, включая стандарт SQL99, запрещают его.
Проблема с BLOB
заключается в том, что его тип данных неизвестен базе данных ( BLOB
следует использовать только для чего-либо неопределенного, например логотипа, изображения, текстового документа, который может быть сохранен только как двоичные данные). Следовательно, он не может его оптимизировать. Еще одна проблема - отображение. Большой двоичный объект нельзя просто отобразить как текст.
Большинство реализаций SQL не позволяют сравнивать поля BLOB
, но SQLite позволяет это. Однако он преобразует все, с чем вы его сравниваете, в blob, а затем сравнивает его по крупицам.
Лучшим вариантом для столбца первичного ключа в SQLite является использование INTEGER PRIMARY KEY
, как описано здесь ;: http://www.sqlite.org/lang_createtable .html # rowid дает лучшую производительность (он уже присутствует как столбец rowid
, только с псевдонимом).
Чтобы ответить на ваш вопрос: да, это влияет производительность плохо. Но что еще более важно, будет очень сложно хорошо управлять своими таблицами. Используйте INTEGER PRIMARY KEY
, это действительно лучший, гарантированно уникальный и невероятно быстрый.
rowid
, он просто псевдоним).
Чтобы ответить на ваш вопрос: да, это влияет на производительность плохо. Но что еще более важно, будет очень сложно хорошо управлять своими таблицами. Используйте INTEGER PRIMARY KEY
, это действительно лучший, гарантированно уникальный и невероятно быстрый.
rowid
, он просто псевдоним).
Чтобы ответить на ваш вопрос: да, это влияет на производительность плохо. Но что еще более важно, будет очень сложно хорошо управлять своими таблицами. Используйте INTEGER PRIMARY KEY
, это действительно лучший, гарантированно уникальный и невероятно быстрый.