Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
13.02.2014, 14:03
|
|||
---|---|---|---|
|
|||
запрос тормозит если для поля нет declared type, почему??? |
|||
#18+
Здравствуйте! Такая ситуация (всё упрощено до минимума до сути) - есть таблицы (заказы / заказчики) : CREATE TABLE customers ([ID] INTEGER PRIMARY KEY NOT NULL , name ); CREATE TABLE orders ([ID] INTEGER PRIMARY KEY NOT NULL , customer ); //тут несколько десятков тысяч записей. для orders по полю customer построил индекс. запрос - посчитать кол-во заказов по клиентам sql : select name, (select count(*) from orders where customer = c.id ) from customers c план: SCAN TABLE customer EXECUTE CORRELATED SCALAR SUBQUERY 1 SCAN TABLE orders AS td USING COVERING INDEX ind_orders_customer (customer=?) время выполнения примерно 10сек теперь в дизайнере таблицы меняю orders с указанием для колонки customer типа INTEGER, так: CREATE TABLE orders ([ID] INTEGER PRIMARY KEY NOT NULL , customer INTEGER ); тот же запрос, но план: SCAN TABLE customer EXECUTE CORRELATED SCALAR SUBQUERY 1 SEARCH TABLE orders AS td USING COVERING INDEX ind_orders_customer (customer=?) время выполнения становится - 50мс!!!! вот зе фак??? почему такое изменение всего лиш declared type-а для колонки приводит к такой разнице во времени выполнения? в чем тут дело? объясните плиз кто понимает.... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.02.2014, 15:14
|
|||
---|---|---|---|
запрос тормозит если для поля нет declared type, почему??? |
|||
#18+
_pavv, А когда таблица была создана без указания типа, вы какой операцией туда записывали данные внешнего ключа? Версия: Может поле customer биндилось как text в результате чего так и ложилось а потом при работе sqlite выполнял преобразование поля к integer или наоборот к строке. но когда вы явно указали тип колонки - то преобразование выполнилось уже в момент заполнения... Вот пример посмотрите с этого момента: http://www.sqlite.org/datatype3.html 3.4 Comparison Example CREATE TABLE t1( a TEXT, -- text affinity b NUMERIC, -- numeric affinity c BLOB, -- no affinity d -- no affinity ); -- Values will be stored as TEXT, INTEGER, TEXT, and INTEGER respectively INSERT INTO t1 VALUES('500', '500', '500', 500); text|integer|text|integer ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.02.2014, 19:56
|
|||
---|---|---|---|
запрос тормозит если для поля нет declared type, почему??? |
|||
#18+
Если мы заранее не знаем сродство, то индекс вынужденно строится по полю вариантного типа. А значит каждая запись в индексе при каждой операции поиска будет приводиться к покрывающему типу (и критерий поиска тоже, конечно). Если сродство известно заранее, то запись в индексе приводится к заявленному типу при вставке/обновлении данных. А во время операции поиска к заявленному типу приводится уже только критерий поиска. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.02.2014, 22:33
|
|||
---|---|---|---|
|
|||
запрос тормозит если для поля нет declared type, почему??? |
|||
#18+
PPAА когда таблица была создана без указания типа, вы какой операцией туда записывали данные внешнего ключа? Версия: Может поле customer биндилось как text в результате чего так и ложилось а потом при работе sqlite выполнял преобразование поля к integer или наоборот к строке. но когда вы явно указали тип колонки - то преобразование выполнилось уже в момент заполнения... в обоих случаях в колонке хранятся числа. проверено. White OwlЕсли мы заранее не знаем сродство, то индекс вынужденно строится по полю вариантного типа. А значит каждая запись в индексе при каждой операции поиска будет приводиться к покрывающему типу (и критерий поиска тоже, конечно). Если сродство известно заранее, то запись в индексе приводится к заявленному типу при вставке/обновлении данных. А во время операции поиска к заявленному типу приводится уже только критерий поиска. не может же это давать настолько большую разницу... на 3 порядка!!! да, ещё , если просто делать select * from orders where customer=x то в плане SEARCH TABLE orders USING INDEX ind1 (customer=?) и всё летает милисекунды и в случае и без declared type у колонки. так что явно дело не в этом, не в "приводиться к покрывающему типу".... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=54&mobile=1&tid=2008818]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 281ms |
total: | 412ms |
0 / 0 |