powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Кодировка подключения, разный план
25 сообщений из 30, страница 1 из 2
Кодировка подключения, разный план
    #38816405
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Есть запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
  ET.*,
  R.REPLICATION_ID AS R$REPLICATION_ID, R.OPERATION AS R$OPERATION, R.CREATE_DATETIME AS R$CREATE_DATETIME
FROM REPLICATIONS$GET_ACTUALLY_INFOS(:1   , 'E$OPERATIONS') R
INNER JOIN "E$OPERATIONS" ET ON (ET."CASH_FK" || '/' || CAST(ET."DATE" AS VARCHAR(10)) || '/' || ET."NUM") = R.TABLE_KEY
WHERE R.OPERATION = 'C'
ORDER BY R.REPLICATION_ID, R.CREATE_DATETIME



Почему при использовании кодировки коннекта UTF8 план такой:
Код: sql
1.
PLAN SORT (JOIN (SORT (REPLICATIONS INDEX (REPLICATIONS$IDX_PK)), ET NATURAL))

, а при использовании кодировки WIN1251 план такой:
Код: sql
1.
PLAN SORT (JOIN (SORT (REPLICATIONS INDEX (REPLICATIONS$IDX_PK)), ET INDEX (R$E$OPERATIONS$IDX)))



Как можно пофиксить?

PS. FB 2/5/3
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816428
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE INDEX R$E$OPERATIONS$IDX ON E$OPERATIONS COMPUTED BY ( "CASH_FK" || '/' || CAST("DATE" AS VARCHAR(10)) || '/' || "NUM" );

TABLE_KEY D$TABLE_KEY

CREATE DOMAIN D$TABLE_KEY AS
VARCHAR(128) CHARACTER SET OCTETS
COLLATE OCTETS;
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816438
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Почему при использовании кодировки коннекта UTF8 план такой:
А почему изначально база не была спроектирована в утф?
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816444
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Она в UTF8. Все коннекты в UTF8. На 2.5.2 план был
Код: sql
1.
PLAN SORT (JOIN (SORT (REPLICATIONS INDEX (REPLICATIONS$IDX_PK)), ET INDEX (R$E$OPERATIONS$IDX)))

, сейчас план
Код: sql
1.
PLAN SORT (JOIN (SORT (REPLICATIONS INDEX (REPLICATIONS$IDX_PK)), ET NATURAL))



Отсюда пошли дикие тормоза.
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816466
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А поле OPERATION какого чарсета?
Попробуй литералу явно чарсет задать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816479
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
выражение (ET."CASH_FK" || '/' || CAST(ET."DATE" AS VARCHAR(10)) || '/' || ET."NUM") должно полностью совпадать между DDL индекса и текстом запроса. Литералы в SQL заданы в чарсете коннекта. Видимо, этот индекс был создан в коннекте с чарсетом WIN1251, а не UTF8. Если чарсет коннекта пляшет и зафиксировать его нельзя, поможет префикс чарсета: _ascii '/' вместо '/'.
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816493
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr,

и вообще раз уж без DDL не обошлось, лучше вынести это выражение в COMPUTED-By столбец, и этот столбец использовать как в индексе, так и в запросе
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816497
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если индекс R$TEST$1$IDX создать в кодировке WIN1251, то данная проблема воспроизводится.
Создаем коннект с кодировкой UTF8 и делаем запрос:

Код: sql
1.
2.
3.
4.
5.
SELECT
 *
FROM TEST$2 T2
INNER JOIN TEST$1 ET ON (ET."CASH_FK" || '/' || CAST(ET."DATE" AS VARCHAR(10)) || '/' || ET."NUM") = T2.TABLE_KEY
WHERE T2.REPLICATION_ID = 1



В итоге план - PLAN JOIN (ET NATURAL, T2 INDEX (TEST$2$PK_DESC)).

Как можно решить данную проблему?

Код: sql
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
SET SQL DIALECT 3;

CREATE DOMAIN D$DATE AS
DATE;

CREATE DOMAIN D$INTEGER AS
INTEGER;

CREATE DOMAIN D$KEY AS
BIGINT;

CREATE DOMAIN D$TABLE_KEY AS
VARCHAR(128) CHARACTER SET OCTETS;

CREATE TABLE TEST$1 (
    CASH_FK  D$KEY NOT NULL /* D$KEY = BIGINT */,
    "DATE"   D$DATE NOT NULL /* D$DATE = DATE */,
    NUM      D$INTEGER NOT NULL /* D$INTEGER = INTEGER */
);


CREATE TABLE TEST$2 (
    REPLICATION_ID  D$KEY NOT NULL /* D$KEY = BIGINT */,
    TABLE_KEY       D$TABLE_KEY NOT NULL /* D$TABLE_KEY = VARCHAR(128) */
);


INSERT INTO TEST$1 (CASH_FK, "DATE", NUM) VALUES (1, '2014-11-18', 100);

COMMIT WORK;

INSERT INTO TEST$2 (REPLICATION_ID, TABLE_KEY) VALUES (1, '1/2014-11-18/100');

COMMIT WORK;

ALTER TABLE TEST$2 ADD CONSTRAINT TEST$2$PK_DESC PRIMARY KEY (REPLICATION_ID)
USING DESCENDING INDEX TEST$2$PK_DESC;

CREATE INDEX R$TEST$1$IDX ON TEST$1 COMPUTED BY ( "CASH_FK" || '/' || CAST("DATE" AS VARCHAR(10)) || '/' || "NUM" );
CREATE INDEX TEST$2$IDX_PK ON TEST$2 (REPLICATION_ID);
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816502
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если индекс создать в кодировке UTF8 - то все ОК. Как переделать кодировку индекса?
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816503
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__,

сделай через столбец, а не выражение напрямую - тогда кодировки должны совпадать будут
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816504
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попутный вопрос, как узнать какие индексы созданы в Win1251?
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816505
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Если индекс создать в кодировке UTF8 - то все ОК. Как переделать кодировку индекса?

Удали индекс и создай заново, в правильном соединении

Но тогда у тебя вылезет в других соединениях...
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816515
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Как можно решить данную проблему?
1. Устранить нарушение первой НФ.
2. Не использовать литералы в запросе.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816546
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

кстати, еще один - хотя и небольшой - аргумент за константы в DDL
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816767
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как узнать какие индексы созданы в кодировке Win1251?
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816784
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__,

чё-то типа такого должно быть:

DDL:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create domain dm_latin varchar(20) character set win1252;
commit;

recreate table t(
    id int primary key using index t_pk
    ,s01 varchar(10) character set utf8 unique using index t_s01_utf8
    ,s02 varchar(10) character set win1251 unique using index t_s02_win1251
    ,s03 dm_latin unique using index t_s03_win1252
);
commit;

Query:
Код: plaintext
1.
2.
3.
4.
5.
select ri.rdb$index_name, ri.rdb$field_name, rf.rdb$field_source, ff.rdb$character_set_id, rc.rdb$character_set_name
from rdb$index_segments ri
join rdb$indices rx on ri.rdb$index_name=rx.rdb$index_name and rx.rdb$system_flag=0
join rdb$relation_fields rf on ri.rdb$field_name = rf.rdb$field_name
join rdb$fields ff on rf.rdb$field_source = ff.rdb$field_name and ff.rdb$character_set_id is not null
join rdb$character_sets rc on ff.rdb$character_set_id = rc.rdb$character_set_id;

Result:
RDB$INDEX_NAMERDB$FIELD_NAMERDB$FIELD_SOURCERDB$CHARACTER_SET_IDRDB$CHARACTER_SET_NAMET_S01_UTF8S01RDB$134UTF8T_S02_WIN1251S02RDB$1452WIN1251T_S03_WIN1252S03DM_LATIN53WIN1252

Но этот запрос, нутром чую, может не все варианты объявлений покрывать...
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38816931
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблоид__Avenger__,

чё-то типа такого должно быть:

Пересоздал индексы в коннекте utf8. Вопрос закрыт.
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38817190
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochи вообще раз уж без DDL не обошлось, лучше вынести это выражение в COMPUTED-By столбец, и этот столбец использовать как в индексе, так и в запросе
И давно можно делать индексы по вычислимым полям?
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38817200
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

сделай по выражению, равному вычислимому полю :-)
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38817207
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochсделай по выражению, равному вычислимому полю :-)
Именно из-за этого у ТС-а и проблема.
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38817233
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

нет, у него проблема из-за разных литералов, которе должны по его мнению быть идентичными, но в разных запросах с разными настройками соединений не идентичны

я же как раз предложил литералы сделать только один раз и спрятать их внутрь столбца

---

кстати, вопрос к птицеводам - в чём логика?
индексы, вычисляемые по выражению, разрешены
столбцы, вычисляемые по выражению, разрешены
индексы по столбцам, вычисляемым по выражению, не разрешены
но индексы по выражению равному столбцу, вычисляемому по выражению, разрешены
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38817278
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochиндексы по столбцам, вычисляемым по выражению, не разрешены
потому что такой столбец вычисляется "на ходу". т.е. он не детерминирован, что не гарантирует идентичность того же выражения для того же столбца через N секунд, минут...

самый типичный пример - вычисляемый столбец по random. Построил ты индекс по этому столбцу, а дальше-то?
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38817322
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

понимаешь ли... всё сказанное тобой абсолютно резонно, но - в точно такой же степен относится и к индексу по выражениям.

Тут как бы, в отсутствие materialized views, или трусы или крестик :-)
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38817369
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochя же как раз предложил литералы сделать только один раз и спрятать их внутрь столбца
Я придираюсь, т.к. твой совет являет дезинформацией.
Делать надо триггер и материализовать вычисления в поле, после чего индексировать. Никакого COMPUTED BY.
...
Рейтинг: 0 / 0
Кодировка подключения, разный план
    #38817381
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm,

в принципе - да.
я исходил из минимальных изменений относитеьно оригинала.
...
Рейтинг: 0 / 0
25 сообщений из 30, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Кодировка подключения, разный план
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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