powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / select * from t1 order by s - не юзает UNIQ-индекс, если `s` = utf8 coll 'NUMERIC-SORT=1'
3 сообщений из 3, страница 1 из 1
select * from t1 order by s - не юзает UNIQ-индекс, если `s` = utf8 coll 'NUMERIC-SORT=1'
    #38635971
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi all

Следующий скрипт создает UTF8-коллацию `coll_ns` с признаком 'NUMERIC-SORT=1', а затем - табличку с varchar-полем `s`, коллация которого = coll_ns.
Далее проверяется план запроса
Код: sql
1.
select * from t order by s

- для двух случаев:
1) когда по полю `s` создан простой (не уникальный) индекс;
2) когда по полю `s` создан уникальный индекс.

В запросе НЕТ критериев отбора, однако при наличии order by и соотв. индекса ФБ, насколько могу судить, всегда задействует этот индекс.

Ну так вот: во втором случае, когда create UNIQUE index ..., этот индекс НЕ цепляется.
(оно, наверное, и хорошо, даже очень: запрос без критериев отбора, быстрее всю таблицу пробежать; но настораживает как-то... не бага ли ?)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
C:\MIX\firebird\OLTPTEST>isql -q
SQL> create database '192.168.0.220/3333:/var/db/fb30/tmp201405071909.fdb'; commit;
SQL> show version;
ISQL Version: WI-V2.5.3.26730 Firebird 2.5
Server version:
Firebird/linux AMD64 (access method), version "LI-T3.0.0.31113 Firebird 3.0 Alpha 2"
Firebird/linux AMD64 (remote server), version "LI-T3.0.0.31113 Firebird 3.0 Alpha 2/tcp (oel64)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26730 Firebird 2.5/tcp (csprog)/P12"
on disk structure version 12.0
SQL> create collation coll_ns for utf8 from unicode 'NUMERIC-SORT=1'; commit;
SQL> recreate table t1( s varchar(36) character set utf8 collate coll_ns ); commit;
SQL> insert into t1 select ''||row_number()over() from rdb$types, rdb$types; commit;
SQL> create index t1_s on t1(s);  -- ::: NB :::  NON- unique index
SQL> commit;
SQL> set planonly;
SQL> select * from t1 order by s;

PLAN (T1 ORDER T1_S) -- Ok

SQL>
SQL> set planonly;
SQL> drop index t1_s; commit;

SQL> create  UNIQUE  index t1_s_ unq  on t1(s); commit;
SQL> set planonly;
SQL> select * from t1 order by s;

PLAN SORT (T1 NATURAL) -- Почему не "PLAN (T1 ORDER T1_S_UNQ)" ?

SQL> set planonly;
...
Рейтинг: 0 / 0
select * from t1 order by s - не юзает UNIQ-индекс, если `s` = utf8 coll 'NUMERIC-SORT=1'
    #38636027
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид,

читай комменты в тынце
...
Рейтинг: 0 / 0
select * from t1 order by s - не юзает UNIQ-индекс, если `s` = utf8 coll 'NUMERIC-SORT=1'
    #38636036
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

почитал. Слова понял, даже фразы целиком осилил.
Не догнал только, почему от тяжёлой руки Кальтенбруннера пострадали именно UNIQUE-индексы...

И как их теперь проверять на missing entries, сверяя с natural-подсчетом, если приспичит вдруг....

Вот так:
Код: plaintext
1.
2.
SQL> select * from t1 where s>'';

PLAN (T1 INDEX (T1_S_UNQ))

- ? (при условии, что в поле не бывает null и пустых строк)
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / select * from t1 order by s - не юзает UNIQ-индекс, если `s` = utf8 coll 'NUMERIC-SORT=1'
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]