Firebird 2.5.8, 3.0.4 проблемы с индексом unicode_ci_ai - PullRequest
0 голосов
/ 15 октября 2018

Я использую Firebird 3.0.4 x64 в Linux и Windows, Superserver

Базы данных, которые я перенесу на utf8 с сортировкой unicode_ci_ai, используются намного медленнее, проблема в индексах с различными полями varchar.

пример проблемы

данные:

CREATE TABLE TEST_UNICODE (
    S1  VARCHAR(10) NOT NULL COLLATE UNICODE,
    S2  VARCHAR(10) NOT NULL COLLATE UNICODE
);


CREATE TABLE TEST_UNICODE_CI_AI (
    S1  VARCHAR(10) NOT NULL COLLATE UNICODE_CI_AI,
    S2  VARCHAR(10) NOT NULL COLLATE UNICODE_CI_AI
);


INSERT INTO TEST_UNICODE (S1, S2) VALUES ('A', 'A');
INSERT INTO TEST_UNICODE (S1, S2) VALUES ('A', 'B');
INSERT INTO TEST_UNICODE (S1, S2) VALUES ('B', 'A');
INSERT INTO TEST_UNICODE (S1, S2) VALUES ('B', 'B');

COMMIT WORK;

INSERT INTO TEST_UNICODE_CI_AI (S1, S2) VALUES ('A', 'A');
INSERT INTO TEST_UNICODE_CI_AI (S1, S2) VALUES ('A', 'B');
INSERT INTO TEST_UNICODE_CI_AI (S1, S2) VALUES ('B', 'A');
INSERT INTO TEST_UNICODE_CI_AI (S1, S2) VALUES ('B', 'B');

COMMIT WORK;

CREATE INDEX TEST_UNICODE ON TEST_UNICODE (S1, S2);
CREATE INDEX TEST_UNICODE_CI_AI ON TEST_UNICODE_CI_AI (S1, S2);

COMMIT WORK;

Запрос:

SELECT S1,S2 FROM test_unicode WHERE S1 = 'B' AND S2 = 'A'
UNION ALL
SELECT S1,S2 FROM test_unicode_ci_ai WHERE S1 = 'B' AND S2 = 'A'

План Isql:

Select Expression
    -> Union
        -> Filter
            -> Table "TEST_UNICODE" Access By ID
                -> Bitmap
                    -> Index "TEST_UNICODE" Range Scan (full match)
        -> Filter
            -> Table "TEST_UNICODE_CI_AI" Access By ID
                -> Bitmap
                    -> Index "TEST_UNICODE_CI_AI" Range Scan (partial match: 1/2)

Я получаю 2 индексированных чтения с test_unicode_ci_ai и 1 индексированное чтение с test_unicode с миллионами записей, проблема обостряется.

Что я делаю неправильно?Спасибо

Протестировано в 2.5.8 x64 Windows Superserver, имеет такую ​​же ошибку

...