Почему ручная реализация хеш-тега повышает производительность моих запросов? - PullRequest
6 голосов
/ 21 марта 2012

В моей модели я настроил Entity (скажем, Person), чтобы иметь атрибут в виде строки (называемый «name»), и поместил в него индекс.Если я делаю много запросов по моей модели, запросы оказываются снижением производительности.Мой запрос прост:

  [ NSPredicate predicateWithFormat: @"%K == %@", @"name", lPersonName ];

, поэтому я предполагаю, что индекс выполнит свою работу.

Затем, если я вычислю какой-нибудь простой хэш-тег и сохраню его вместе с моим объектом,индексированный целочисленный атрибут (называемый «хэш»), и выполнение более узкого запроса снижает производительность.Например:

[ NSPredicate predicateWithFormat: @"%K == %d AND (%K == %@)",
                           @"hash", [ self calculateHashForName: lPersonName ],
                           @"name", lPersonName ];

Почему индекс целого числа намного быстрее, чем индекс строки?Я что-то пропускаю?Это проблема с базовыми данными?

Конечно, я могу оставить решение с помощью хеш-тега, но если я пропущу что-то, я хотел бы узнать об этом раньше, а не позже.

Ответы [ 2 ]

1 голос
/ 21 марта 2012

На компьютерах низкого уровня встроенные целые числа обрабатываются, у процессоров есть внутренний тип данных для целых чисел, но нет внутреннего типа данных для строк (в любом случае в ARM и x86).

4000000000 == -123456789 

Может обрабатыватьсякомпьютер в 1 инструкции, в то время как ...

"Abcdefg" == "Abcdefzzzz"

Должен циклически проходить по символам, принимая несколько инструкций.

Это довольно обобщенно, но в этом суть проблемы.Короче говоря, компьютеры обрабатывают целые числа быстрее, и хотя строки могут быть выражены как целые числа (двоичные байты), они имеют переменную длину, что делает их более сложными для обработки.

0 голосов
/ 23 марта 2012

Существует (как минимум) две возможности:

  1. Размер строк имени больше целых чисел, поэтому требуемое пространство для хранения больше для индекса строки.На производительность базы данных напрямую влияет размер хранилища, поскольку стоимость поиска измеряется в поисках диска (на данный момент без учета кэширования), и чем больше данных, тем больше запросов запрашивается

  2. хранилища SQLiteтаблиц в B-деревьях и может использовать INTEGER PRIMARY KEY для поиска записи с максимальной эффективностью без дополнительного индекса - из вашего кода неясно (для меня), если хеш используется в качестве INTEGER PRIMARY KEY

...