powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Что лучше: Java или ...?
13 сообщений из 13, страница 1 из 1
Что лучше: Java или ...?
    #32324589
Aleksey Kh.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возникла необходмость вести многовалютный учет.
Для этого пришлось к каждому полю с ценой завести поле с ид. валюты.
Мне так не всегда удобно.
1. Имеет-ли смысл завести Ява-класс, в котором сразу хранить и сумму и валюту? На первый взгляд, мне во многих местах так было бы удобнее.
2. А много я в производительности потеряю, в случаях, если я буду накладывать ограничение на запрос по какому-либо полю (или тем более методу) ява-класса?
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32325213
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем не удобен вариант с полем id валюты ? Даже если сделаете Java класс, там также придется делать 2 поля, какая разница. В производительности однозначно потеряете, чтобы обработать обьект СУБД придется его десериализовывать для каждой записи, плюс на выборку по полям класса оптимизатор запросов будет уходить на Table Scan. По моему обычными средствами все реализуется гораздо проще, эффективнее и красивее.

P.S. Кстати тема более подходит для форума "Проектирование БД". Если хотите, я могу этот топик туда перенаправить, думаю там найдется много народу, которые выскажут свое мнение ЗА и ПРОТИВ.
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32326560
Aleksey Kh.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не удобен, в основном, одним: есть куча функций для работы с ценой - не удобно возвращать два параметра.
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32326604
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и работайте с ценой - сделайте вьювер, в котором будет вычисляемое поле Цена * ЗначениеВалюты и применяйте на них свою кучу функций :)
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32326618
Aleksey Kh.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Я посмотрел "проектирование БД" - не надо меня туда.
2. Не понял, что такое "вьювер"? Если это просто вьюшка :) - то не очень понял, как я могу их использовать.
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32327142
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно такой вариант: хранить цену как условные единицы, а в справочнике валют делать раскладку на условные единицы, например если принять USD как условную единицу, то типа того:
Цена товара: 200.00

Справочник валют:
USD - 1.00
Руб - 29.80
Eur - 0.92

Делаем вьювер:
Код: plaintext
1.
2.
3.
4.
5.
create view ЦенаТовара
as
  select в.КодВалюты, т.КодТовара, т.Цена, 
    т.Цена * в.ЗначениеВалюты as ЦенаВВалюте
  from Товар т, Валюта в

В итоге вьювер возвращает на каждый товар его раскладку для каждой валюты. Далее с ним легко работать - например надо получить товар в его рублевом эквиваленте:
Код: plaintext
1.
2.
3.
4.
select т.*, ц.ЦенаВВалюте
from Товар т
  inner join ЦенаТовара ц 
    on ц.КодТовара = т.КодТовара and ц.КодВалюты = 'Руб'


Если необходимо хранить цену не в условных единицах, а реальных на конкретно указанную валюту, то вышеприведенный пример просто следует немного усложнить: добавить в таблицу Товар еще поле КодВалюты, в справочнике валют оставить все как есть - то есть отношение значения валюты к условной единице, а вьювер написать примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create view ЦенаТовара
as
  select т.КодВалюты, т.КодТовара, т.Цена, 
    т.Цена / вт.ЗначениеВалюты * в.ЗначениеВалюты as ЦенаВВалюте
  from Товар т
    inner join Валюта вт on вт.КодВалюты = т.КодВалюты,
  Валюта в

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

Ну и естественно оба варианта требуют, чтобы какая то валюта была принята за условную (то есть имела значение валюты равное 1) и весь справочник валют расписывался по отношению к ней. Если возникнет необходимость хранения истории изменения значений валют, то со справочника валют необходимо будет вынести значение валюты в отдельную таблицу с датой периода действия значения и соотвествующе для облегчения получения значений так же понаделать вьювера, например возвращать текущие значения валют, возвращать значения валют на указанную дату и т.д.

P.S. Ну общий смысл думаю понятен - тут надо искать не пути изменения модели работы РСУБД (а использование Java именно к этому и приведет и кстати думаю хлопот больше будет, чем отдачи), а более серьезно подойти к структуре проектируемой БД, чем правильней она будет созданна, тем легче и красивей обычным SQL без всяких заморочек можно будет работать.
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32327441
Aleksey Kh.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор=ASCRUS писал:Если возникнет необходимость хранения истории изменения значений валют, то со справочника валют необходимо будет вынести значение валюты в отдельную таблицу с датой периода действия значения

А, в принципе, так и сделано :), только без вьюшек.
Цену товара на заданную дату и в заданной валюте я получаю вызовом функции.

1. А что, если использовать просмотры, будет быстрее?
Вот они, беды, перехода от программирования к БД - иногда некоторые БДшные приемы даже не приходят в голову, хотя, казалось бы, ничего не известного. Надо будт на реальных данных покрутить, что быстрее...

2. Да, так можно жить (так и живем), но есть одна большая неудобность: в прайс-листе есть куча цен, каждая из которых может быть или задана непосредственно (с указанием валюты) или задана ссылкой на другую цену с некоторой скидкой/наценкой. Вычисляется рекурсивным вызовом функции. Вот тут при каждом вызове надо получать и цену и валюту. Собственно, вопрос только в этом месте. Правда, полагаю, можно будет обойтись использованием _чего_нибудь_такого_ только в функции, а хранить отдельно.
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32327465
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одно точно - запросы и представления без пользовательских функций работают однозначно быстрее. Во первых вызов функции на каждую строку возвращаемого результата приведет к тому, что СУБД придется вызывать функцию, которая скажем так не на Си написана и изначально по определению будет работать медленно. Во вторых если функция использует запросы внутри себя, то это еще больше замедлит работы системы, ведь получается на каждую запись результата запроса будет выполнен еще один запрос, что тоже довольно таки печально. В случае же обработки информации чистыми запросами в дело вступает оптимизатор запросов, который уже начинает использовать индексы и статистику, выбирать наиболее эффективный план выполнения запроса и т.д.. Так что мое мнение - UDF существуют только для легких скалярных вычислений, т.е. для обработки результата запроса (округлить, сравнить, сумма прописью и т.д). А обработка множеств данных должна всегда осуществляться только на SQL, в случае часто использования запросов в качестве подзапросов в других запросов целесообразно делать вьювера, в крайних случаях некой расширенной обработки информации, при ее частом использовании в разных местах можно иногда позволять себе использовать в запросах ХП, но опять же это приведет к снижению эффективности оптимизатора запросов и увеличению в планах запросов методов table scan.
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32330424
Aleksey Kh.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос:
Код: 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.
( Plan [ Total Cost Estimate:  20 . 1196385  ] 
  ( WorkTable
    ( HashGroupBy
      ( NestedLoopsJoin[ TRUE ]
        ( NestedLoopsJoin[ TRUE ]
          ( HashJoin*
            ( NestedBlockJoin
              ( HashJoin*
                ( TableScan ( t_vagon v )[ v.DIn IS NOT NULL :  98 . 2430838 % Statistics ][ hash( v.id_nTo ) in hashmap( i.id_nTo ) :  100 % Any ] )
                ( TableScan ( t_prefix pr )[ ( hash( pr.id_prefix ) in hashmap( i.pr_invoice ) :  100 % Any ) AND ( hash( pr.id_nTo ) in hashmap( i.id_nTo ) :  100 % Any ) ] )
              )
              ( IndexScan ( t_ordercargo_buhg ob ) t_ordercargo_buhg )
            )
            ( HashFilter 
              ( HashFilter 
                ( IndexScan ( t_invoice i ) idx_t_invoice_Dout[ ( expr( i.DOut ) <= expr() :  25 % Guess ) AND ( i.Place =  'C' :  98 . 25739264 % Statistics ) ] )
              )
            )
          )
          ( IndexScan ( t_cargo c ) t_cargo[ ( ob.id_Vagon = c.id_Vagon : . 1516666458 % Column-Column ) AND ( c.id_nTo = i.id_nTo :  3 . 675903147 % Column-Column ) AND ( ob.id_nTo = c.id_nTo :  6 . 993964724 % Column-Column ) AND ( c.id_nTo = v.id_nTo :  9 . 266220957 % Column-Column ) AND ( ob.id_nFrom = c.id_nFrom :  35 . 00498278 % Column-Column ) ] )
        )
        ( IndexScan ( t_order o ) t_order[ ( o.id_invoice = i.id_invoice : . 1919388383 % Column-Column ) AND ( o.id_nTo = i.id_nTo :  4 . 476617798 % Column-Column ) AND ( o.pr_invoice = i.pr_invoice :  5 . 637640599 % Column-Column ) AND ( ob.pr_invoice = o.pr_invoice :  5 . 74840149 % Column-Column ) AND ( c.id_nTo = o.id_nTo :  6 . 609805418 % Column-Column ) AND ( v.id_nTo = o.id_nTo :  6 . 613974472 % Column-Column ) AND ( ob.id_nTo = o.id_nTo :  7 . 382862088 % Column-Column ) ] )
      )
    )
  )
)
( SubQ  1  [ Total Cost Estimate: . 0001343657  ] 
  ( SingleRowGroupBy
    ( IndexScan ( t_order_out oo ) t_order_out[ oo.r_type =  'SPECIAL_DISCOUNT' :  3 . 846502304 % Statistics ] )
  )
)
( SubQ  2  [ Total Cost Estimate: . 0001371419  ] 
  ( NestedLoopsJoin[ TRUE ]
    ( IndexScan ( t_clients cl ) t_clients )
    ( IndexScan ( t_global_clients gc ) t_global_clients )
  )
)
( SubQ  3  [ Total Cost Estimate: . 0001482861  ] 
  ( IndexScan t_price_list t_price_list )
)

А что плохого в таком плане?
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32330672
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неплохо было бы посмотреть сам запрос, план без запроса не очень читабелен :)
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32330824
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 ASCRUS

Начиная с восьмой версии ASA сайбейз обещает "сквозную" оптимизацию UDF в запросах, т.е. с учетом плана запроса. Не знаю, как там реализовано, но заявление есть. Но по-моему тоже лучше вместо функции написать view: проще оптимизировать (для оптимизатора), проще читать и часто проще писать.
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32330866
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю, в ASA есть кэширование функций. Но что выполняется внутри функций, естественно в план запроса никак попасть не может. Отследить очень легко, например есть 2 таблицы Table1 и Table2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
create table Table1 (
  T1_id int not null primary key,
  Name varchar( 50 )
)

create table Table2 (
  T2_Id int not null primary key,
  T1_Id int null,
  foreign key references Table1
)


Пишем обычный запрос:
Код: plaintext
1.
2.
3.
select t2.T2_id, t1.Name
from Table1 t1
  key join Table2 t2

Смотрим план запроса, там все Ok, присутствуют обе таблицы, сканирование Table2 идет по индексу внешнего ключа.

Например мы написали функцию, которая по Id возвращает поле Name таблицы Table1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
create function fn_GetTable1Name (
   @Id int
)
returns varchar( 50 )
begin
  declare @Name varchar( 50 );

  select Name
  into @Name
  from Table1
  where T1_Id = @Id;

  return @Name;
end


Пишем запрос, по на первый взгляд аналогичен вышенаписанному запросу:
Код: plaintext
1.
2.
select t2.T2_id, fn_GetTable1Name( t2.T2_Id )
from Table2 t2

Смотрим план запроса, там присутствует только Table2, по которой идет TableScan. Сканирование Table1 будет вызываться для каждой строчки запроса Table2 из самой функции и оптимизатором никак не учитывается.

Даже с учетом того, что вышеприведенный пример очень прост, если в таблицы Table1 и Table2 загнать по десяток миллионов записей, то разницу во времени выполнения можно будет уже ощутить не только через план запросов.

Плюс если рассмотреть оба варианта запроса - без функции и с функцией, то выплывает, что они будут возвращать разный результат запросов. Я не зря сделал поле T1_id в таблице Table2 как NULL - по key join будут возвращаться только те записи, которые имеют родителя в таблице Table1, в случае с функцией будут возвращаться все записи таблицы Table2. Так что в случае перевода частей запросов в функции мы сами себя очень даже можем запутать, привести к неоднозначности и ограничить использование соединений в SQL.

P.S. В этом плане легко тем, кто работал с MSSQL версий ниже 2000, там UDF не было и в помине, поэтому и вопросов насчет эффективности вьюверов и UDF не возникало, в каком то плане наверное это даже было полезным, хотя частенько отсутствие UDF было очень и очень печальным.
...
Рейтинг: 0 / 0
Что лучше: Java или ...?
    #32332037
c127
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 ASCRUS
> Но что выполняется внутри функций, естественно в план запроса никак попасть не может.

Видел эту информацию в what's new для ASA8, буквально одно предложение, подробностей не знаю.

>P.S. В этом плане легко тем, кто работал с MSSQL версий ниже 2000, там UDF не было и в помине, поэтому и вопросов насчет эффективности вьюверов и UDF не возникало, в каком то плане наверное это даже было полезным, хотя частенько отсутствие UDF было очень и очень печальным.

У меня в этом плане трудностей вроде тоже не было, хотя можно сказать был воспитан сайбейзом, когда он еще был ваткомом. Шутка.

На самом деле это скорее вопорс типа мышления, кому-то удобнее мыслить декларативно, кому-то процедурно. Оба подхода имеют достоинства и недостатки.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Что лучше: Java или ...?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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