powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Я так подозреваю - нужно обмануть оптимизатор
5 сообщений из 5, страница 1 из 1
Я так подозреваю - нужно обмануть оптимизатор
    #34704499
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начну издалека
Потому как если сразу вывалить - то без пол-литры - ниасилить

ЭстЪ таблица типов параметров PARAM_TYPE
PARAM_TYPE_ID (tinyint) PARAM_TYPE_NAME (varchar)1 'Тип улицы'
и таблица значений этих параметров PARAM
PARAM_TYPE_ID (tinyint) PARAM_ID (int) PARAM_NAME (varchar)1 1 'проспект'1 2 'улица'1 3 'переулок'
Теперь понадобилось по быстрячку наваять контроль за доступом к рихтованию этих самых типов/значений параметров. Родили следующее: прибили в PARAM_TYPE
PARAM_TYPE_ID (tinyint) PARAM_TYPE_NAME (varchar)24 'Группы пользователей'25 'Группы параметров'26 'Группы параметров-Группы пользователей'
с последующим
Группа пользователей X
PARAM_TYPE
PARAM_TYPE_ID (tinyint) PARAM_TYPE_NAME (varchar)X 'Группа пользователей #1'
Регистрация группы
PARAM
PARAM_TYPE_ID (tinyint) PARAM_ID (int) PARAM_NAME (varchar)24 1 'X'
Члены группы
PARAM
PARAM_TYPE_ID (tinyint) PARAM_ID (int) PARAM_NAME (varchar)X 1 'UserId #1'X 2 'UserId #2'
аналогично - по параметрам.
Практически все дальнейшее строится на view'ах
Код: plaintext
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.
41.
42.
43.
//---------------------------------------------------------------------------
create view v_GroupUsers 
as  
select  
  cast(PARAM_NAME as tinyint) as GroupUsersId, 
  PARAM_ID as OrdNo
from  
  PARAM  
where  
(PARAM_TYPE_ID= 24 )

//---------------------------------------------------------------------------
create view v_GroupUsersMembers 
as  
select  
  P.PARAM_TYPE_ID as GroupUsersId, 
  P.PARAM_ID as OrdNo, 
  cast(P.PARAM_NAME as numeric( 18 , 0 )) as MemberUserId
from  
  v_GroupUsers GU 
  join PARAM P on (P.PARAM_TYPE_ID=GU.GroupUsersId)

//---------------------------------------------------------------------------
create view v_GroupParams 
as  
select  
  cast(PARAM_NAME as tinyint) as GroupParamsId, 
  PARAM_ID as OrdNo
from  
  PARAM  
where  
(PARAM_TYPE_ID= 25 )

//---------------------------------------------------------------------------
create view v_GroupParamsMembers 
as  
select  
  P.PARAM_TYPE_ID as GroupParamsId, 
  P.PARAM_ID as OrdNo, 
  cast(P.PARAM_NAME as tinyint) as MemberParamId
from  
  v_GroupParams GP 
  join PARAM P on (P.PARAM_TYPE_ID=GP.GroupParamsId) 
и т.д. и т.п. Надеюсь, я понятно излагаю. И все бы ничего, но понадобилось сделать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select 
  PT.PARAM_TYPE_ID as GroupParamId, 
  PT.PARAM_TYPE_NAME as GroupParamName 
from 
  v_MemberUserIdMemberParamId MUMP 
  join PARAM_TYPE PT on (MUMP.MemberParamId=PT.PARAM_TYPE_ID) 
where 
  (MUMP.ParamTypeId=@ParamTypeId) 
  and (MUMP.MemberUserId=@UserId) 
order by PT.PARAM_TYPE_NAME
На девелоперской/дрозофильной БД все отрабатывает: типо берется в начале выборка по v_MemberUserIdMemberParamId и к ней join'ится PARAM_TYPE. А, вот, на реальной - оптимизатор, я так понял (по dbcc traceon(3604, 302, 310) - там нехилая простыня получается - многа букаффф - ниасилил
), переворачивает join. Т.е. в начале берется выборка из PARAM_TYPE . В результате имеем

Syntax error during explicit conversion of VARCHAR value 'проспект' to a NUMERIC field.

Дык к чему это я все - как можно указать оптимизатору что за чем юзать? Т.е. если в начале взять выборку по v_MemberUserIdMemberParamId и к ней join'ится - то такой ошибки не м.б. в принципе - потому как выбираются такие ID от которых cast из varchar в numeric должен пройти без проблем. Опять же - на девелоперской БД - работает же.

P.S. Понимаю, что все это - хрестоматийная проктология, но - "...маємо те, що маємо..." Нуна на имеющемся как-то выкрутиться...
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
Я так подозреваю - нужно обмануть оптимизатор
    #34704593
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. На боевой БД на
select @@version
Adaptive Server Enterprise/12.5.3/EBF 12875 ESD#4/P/NT (IX86)/OS 4.0/ase1253/1/32-bit/OPT/Thu Sep 08 11:27:35 2005

так же - все сухо. Падает на этой же database, поднятой по b/r, на
select @@version
Adaptive Server Enterprise/15.0.1/EBF 13823/P/NT (IX86)/Windows 2000/ase1501/2379/32-bit/OPT/Mon Aug 14 22:12:39 2006

_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
Я так подозреваю - нужно обмануть оптимизатор
    #34704625
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ex_Soft пишет:

> Syntax error during explicit conversion of VARCHAR value 'проспект' to a
> NUMERIC field.

Я не понимаю немного при чем тут оптимизатор, если есть Syntax error -
логическая ошибка. Разные планы выполнения запросов никак не могут
сказываться на логике запроса по-любому. Значит, логика хромает.
Поэтому надо сначала исправить логику, потом уже оптимизировать
запрос.

А по сути вопроса -
"Дык к чему это я все - как можно указать оптимизатору что за чем юзать? Т"

можно поставить set forсeplan on перед запросом (и выключить после).
Но сначала надо исправить сам запрос.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Я так подозреваю - нужно обмануть оптимизатор
    #34704766
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
можно поставить set forсeplan on перед запросом (и выключить после)


Server Message: Number 195, Severity 15
Server 'Bill15', Line 1:
'forсeplan' is not a recognized option.
Server Message: Number 195, Severity 15
Server 'Bill15', Line 13:
'forсeplan' is not a recognized option.

Ну а по поводу
MasterZiv
надо сначала исправить логику, потом уже оптимизировать запрос

могу сказать только следующее
аналогичную ошибку я смог получить на
select @@version
Adaptive Server Enterprise/12.5.1/EBF 11428/P/NT (IX86)/OS 4.0/ase1251/1823/32-bit/OPT/Wed Sep 17 11:10:54 2003

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//---------------------------------------------------------------------------
create view v_GroupUsersMembers 
as  
select 
  P.PARAM_TYPE_ID as GroupUsersId, 
  P.PARAM_ID as OrdNo, 
  cast(P.PARAM_NAME as numeric( 18 , 0 )) as MemberUserId
from
  PARAM P
where P.PARAM_TYPE_ID in (select GroupUsersId from v_GroupUsers)
замена на join
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
//---------------------------------------------------------------------------
create view v_GroupUsersMembers 
as  
select  
  P.PARAM_TYPE_ID as GroupUsersId, 
  P.PARAM_ID as OrdNo, 
  cast(P.PARAM_NAME as numeric( 18 , 0 )) as MemberUserId
from  
  v_GroupUsers GU 
  join PARAM P on (P.PARAM_TYPE_ID=GU.GroupUsersId)
ситуацию исправила. Поскольку в первом случае идет скан по PARAM со всеми вытекающими, то я решил, что "переворот" исправит ситуацию, что и получилось.
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
Я так подозреваю - нужно обмануть оптимизатор
    #34705394
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу логики - вот все вырезал.
_________________
"Helo, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Я так подозреваю - нужно обмануть оптимизатор
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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