Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Кодировка подключения, разный план / 25 сообщений из 30, страница 1 из 2
25.11.2014, 17:05
    #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
25.11.2014, 17:15
    #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
25.11.2014, 17:20
    #38816438
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка подключения, разный план
__Avenger__Почему при использовании кодировки коннекта UTF8 план такой:
А почему изначально база не была спроектирована в утф?
...
Рейтинг: 0 / 0
25.11.2014, 17:22
    #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
25.11.2014, 17:37
    #38816466
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка подключения, разный план
А поле OPERATION какого чарсета?
Попробуй литералу явно чарсет задать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.11.2014, 17:43
    #38816479
dimitr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка подключения, разный план
выражение (ET."CASH_FK" || '/' || CAST(ET."DATE" AS VARCHAR(10)) || '/' || ET."NUM") должно полностью совпадать между DDL индекса и текстом запроса. Литералы в SQL заданы в чарсете коннекта. Видимо, этот индекс был создан в коннекте с чарсетом WIN1251, а не UTF8. Если чарсет коннекта пляшет и зафиксировать его нельзя, поможет префикс чарсета: _ascii '/' вместо '/'.
...
Рейтинг: 0 / 0
25.11.2014, 17:51
    #38816493
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка подключения, разный план
dimitr,

и вообще раз уж без DDL не обошлось, лучше вынести это выражение в COMPUTED-By столбец, и этот столбец использовать как в индексе, так и в запросе
...
Рейтинг: 0 / 0
25.11.2014, 17:53
    #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
25.11.2014, 17:55
    #38816502
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка подключения, разный план
Если индекс создать в кодировке UTF8 - то все ОК. Как переделать кодировку индекса?
...
Рейтинг: 0 / 0
25.11.2014, 17:55
    #38816503
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка подключения, разный план
__Avenger__,

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

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

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

кстати, еще один - хотя и небольшой - аргумент за константы в DDL
...
Рейтинг: 0 / 0
25.11.2014, 22:37
    #38816767
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка подключения, разный план
Как узнать какие индексы созданы в кодировке Win1251?
...
Рейтинг: 0 / 0
25.11.2014, 23:30
    #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
26.11.2014, 09:12
    #38816931
__Avenger__
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировка подключения, разный план
Таблоид__Avenger__,

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

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

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

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

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

---

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

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

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

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

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


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