Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Кеширование функций и процедур / 9 сообщений из 9, страница 1 из 1
10.01.2007, 11:05
    #34244900
Егор Комов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование функций и процедур
Есть функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ALTER FUNCTION "DBA"."xp_t2"()
RETURNS long varchar
NOT DETERMINISTIC
BEGIN
	DECLARE "de1" long varchar;
	DECLARE "de2" long varchar;
             select top  1   "IR_PAyload" into de1 from DE_InReg where ir_num = TRUNCNUM(rand(*)* 3000 , 0 )  ORDER BY ir_num;
	select current time into de2;
              SET    de1=cast (de2 as text)||cast (de1 as text);
             RETURN "de1";
   
END

ir_num - PK, autoincrement
"IR_PAyload" - тип xml,

При запуске из централа - каждый раз полностью разный результат, все как положенно.

Если эту функцию опубликовать как WebService - то меняется только время (de2), de1 всегда одно и тоже! То есть закешировав select, повторно он во время вызова не генерируется!

Как с этим бороться?
...
Рейтинг: 0 / 0
10.01.2007, 11:09
    #34244911
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование функций и процедур
не знаю какая субд, но наличие rand() наводит на мысль, что каждый раз в качестве аргумента нужно дать произвольное значение: например... кол-во миллисекунд... из централа у вас постоянный коннект вот оно и генерит разные но одни и те же последоватльности... через веб у вас же коннект не persistent, так? вот он и начинает каждый раз с одной и той же цифры...
все ИМХО
...
Рейтинг: 0 / 0
10.01.2007, 11:10
    #34244918
Егор Комов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование функций и процедур
Изврещения типа TOP 1 ... order by появились в процессе заставить ASA повторно запускать select, без них результат такой же.
ASA 9.0.2 , последний ebf.
...
Рейтинг: 0 / 0
10.01.2007, 11:15
    #34244938
Егор Комов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование функций и процедур
Рыжий Котне знаю какая субд, но наличие rand() наводит на мысль, что каждый раз в качестве аргумента нужно дать произвольное значение: например... кол-во миллисекунд... из централа у вас постоянный коннект вот оно и генерит разные но одни и те же последоватльности... через веб у вас же коннект не persistent, так? вот он и начинает каждый раз с одной и той же цифры...
все ИМХО

Для того, что бы Random давал фиксированную последовательноть, ему надо указать число в качестве параметра. Если ему не указывать - это совершенно случайное число.
Сейчас проверил, указание в качестве параметра числа для ws не меняет ничего...
...
Рейтинг: 0 / 0
10.01.2007, 11:19
    #34244956
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование функций и процедур
Егор Комов

странно...
выполнил select rand(*) несколько раз, каждый раз закрывая/открывая isql
все время 0.24258612526701118
ASA 9.0.2 3320
...
Рейтинг: 0 / 0
10.01.2007, 11:44
    #34245057
Егор Комов
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование функций и процедур
Да, точно, каждое новое открытие - одинаковый результат. Значит штатный Random не проходит.
Буду искать другой....
...
Рейтинг: 0 / 0
10.01.2007, 12:07
    #34245147
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование функций и процедур
Так и есть, все правильно.
* задает начало последовательности.
rand(*) конечно вернет одно и то же первое!!! значение.
Следующий вызов rand(*) вернет другое и т.д., но не разрывая соединение.
Если разорвете, то в следующем соединении rand(*) повторит последовательность.
...
Рейтинг: 0 / 0
10.01.2007, 14:41
    #34245837
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование функций и процедур
Я вот такой формулой устанавливаю новую последовательность случайных чисел для генерации:
Код: plaintext
1.
2.
3.
SELECT Rand()
FROM sa_RowGenerator( 1 ,  10 )
WHERE Rand(DatePart(ms, CURRENT TIMESTAMP) - DatePart(ss, CURRENT TIMESTAMP)) IS NOT NULL
Делал для того, чтобы на сайте каждый раз показывались разные банеры с каталога фильмов, работает без претензий.

P.S. Попробуйте заремарить WHERE и в нескольких сессиях запустить запрос - все будет повторяться. С WHERE повторов у сессий не будет.

--
www.rusug.ru - портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
10.01.2007, 16:52
    #34246332
Рыжий Кот
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кеширование функций и процедур
так может автору перед его первым селектом просто вставить пустой
SELECT Rand(DatePart(ms, now()));
следующий вызов rand(*)
должен быть уже уникальным
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Кеширование функций и процедур / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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