powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по RDB$GET_CONTEXT
15 сообщений из 15, страница 1 из 1
Вопрос по RDB$GET_CONTEXT
    #39341492
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Есть VIEW, которая возвращает общее количество записей около 6 млн.

Если выполнить запрос
Код: plsql
1.
2.
3.
select count(*)
  from SOME_VIEW
 where SOME_ID = 12

, то значение count(*) около 380 тыс записей, время выполнения запроса около 4 сек

Код: plsql
1.
2.
3.
select count(*)
  from SOME_VIEW
 where SOME_ID = ( select min( ID ) from SOME_TABLE )


SOME_TABLE - global temporary table on commit preserve rows , содержащая одну запись ID = 12
Запрос выполняется за то же самое время, что и предыдущий.

Далее создаем контекстную переменную:
Код: plsql
1.
2.
select RDB$SET_CONTEXT( 'USER_SESSION', 'SOME_ID', 12 )
  from RDB$DATABASE



Код: plsql
1.
2.
3.
select count(*)
  from SOME_VIEW
 where SOME_ID = RDB$GET_CONTEXT( 'USER_SESSION', 'SOME_ID' )


Такой запрос выполняется почти в 1.5 раза дольше, чем предыдущие.

В чем причина увеличения времени выполнения запроса?
Многократный вызов RDB$GET_CONTEXT() ,
тогда как подзапрос ( select min( ID ) from SOME_TABLE ) выполняется один раз?

С уважением, Polesov.
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39341495
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesovтогда как подзапрос ( select min( ID ) from SOME_TABLE ) выполняется один раз?

в данном случае действительно один. Некорректированный подзапрос считается инвариантом.
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39341506
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисНекорректированный подзапрос считается инвариантом.

Могли бы и RDB$GET_CONTEXT инвариантом считать...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39341510
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

* Некоррелированный
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39341550
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а на какой версии был поставлен эксперимент? В 2.х контекстные переменные довольно неэффективно вычисляются, в 3-ке заметно лучше.
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39341586
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dimitr, 2.5.6.27020
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39344720
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovМогли бы и RDB$GET_CONTEXT инвариантом считать...

это КМК то же самое, чтобы считать инвариантом генераторы

в рамках запроса он не меняется, но

1) если запрос вызывает какую-нибудь SP, она может изменить переменную
2) если есть параллельные подключения из других потоков - они могут изменить переменную
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39344725
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesovdimitr, 2.5.6.27020

select * from mon$CONTEXT_VARIABLES
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39344733
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

ты не прав. Инвариантом можно считать детерминированные функции при неизменных входных параметрах. Получение следующего значения генератора (или GUID) никак не детерминированная функция.

Arioch1) если запрос вызывает какую-нибудь SP, она может изменить переменную

считать любые контекстные переменные инвариантом наверное не стоит, за исключением не изменяемых из пространства SYSTEM.

Arioch2) если есть параллельные подключения из других потоков - они могут изменить переменную

не могут параллельные подключения менять контекстные переменные. Ты для начала подумай какие контексты существуют у контекстных переменных
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39344766
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисты не прав

"доказательство от противного"
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39344789
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисне могут параллельные подключения менять

Сейчас, видимо, да

но если потом сделают редактирование mon$CONTEXT_VARIABLES ...
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39344815
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

не сделают.

1. MON$ не для редактирования.
2. Изменение чужих контекстных переменных уровня коннекта или транзакции это нарушение security

Теоретически могли бы ввести новое пространство имён контекстов, которое шарится между коннектами, но я таких планов не слышал.
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39344827
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисТеоретически могли бы ввести новое пространство имён контекстов, которое шарится между коннектами

...но таки где его хранить чисто технически?

хотя мог бы в принципе быть контекст "все коннекты=сессии одного и того же USERNAME", исчезающий в момент отрыва последней сессии конкретного пользователя

> MON$ не для редактирования.

delete from mon$attachments where mon$conneciton_id = .....

> это нарушение security

....если только не делается администратором БД
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39344830
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

ты не сравнивай отключение коннекта или отмену статмента юзера с возможностью влезть посередине его работы и что-то там ему подменить (это даже админу нельзя давать)
...
Рейтинг: 0 / 0
Вопрос по RDB$GET_CONTEXT
    #39345014
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PolesovМногократный вызов RDB$GET_CONTEXT() ,
тогда как подзапрос ( select min( ID ) from SOME_TABLE ) выполняется один раз?Что, собственно, мешает сделать?
Код: plsql
1.
2.
3.
select count(*)
  from SOME_VIEW
 where SOME_ID = (SELECT RDB$GET_CONTEXT( 'USER_SESSION', 'SOME_ID' ) FROM RDB$DATABASE)
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вопрос по RDB$GET_CONTEXT
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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