Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 12 13 14 15 16 [17] 18 19 20 21 .. 31   вперед  Ctrl
 Re: MS SQL > Oracle = True?  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Не будет ли короче означать потерю какой либо функциональности ? Можно ли в Оракле при обработке нодов деревьев организовывать любые вычисляемые поля и есть ли ограничения ? Например, можно ли сделать вот так:
CREATE TABLE "DBA"."tree" (
  "tree_id" integer NOT NULL PRIMARY KEY,
  "caption" varchar(128) NULL ,
  "parent_id" integer NULL
)
go
COMMENT ON TABLE "DBA"."tree" IS 'Абстрактное дерево'

INSERT INTO Tree (Tree_id, Caption, Parent_id) VALUES(1, 'Иванов', NULL);
INSERT INTO Tree (Tree_id, Caption, Parent_id) VALUES(2, 'Петров', 1);
INSERT INTO Tree (Tree_id, Caption, Parent_id) VALUES(3, 'Сидоров', 1);
INSERT INTO Tree (Tree_id, Caption, Parent_id) VALUES(4, 'Васечкин', NULL);
INSERT INTO Tree (Tree_id, Caption, Parent_id) VALUES(5, 'Пупкин', 4);
INSERT INTO Tree (Tree_id, Caption, Parent_id) VALUES(6, 'Самодуров', 4);

COMMIT;

SELECT *
FROM Tree;
tree_idcaptionparent_id
1'Иванов'NULL
2'Петров'1
3'Сидоров'1
4'Васечкин'NULL
5'Пупкин'4
6'Самодуров'4

  with recursive tmp(
    tree_id, caption, parent_id, level, full_name)
  as (
    select tree_id, caption, parent_id, 0, caption
    from tree   
    where parent_id is null
    union all
    select t.tree_id, t.caption, t.parent_id, tmp.Level + 1, 
      tmp.full_name || '\' || t.caption
    from tree t
      inner join tmp on t.parent_id = tmp.tree_id
  )
  select List(space(level * 5) || caption || 
    if Parent_id is not null then ';' else ':' endif , 
    '\x0D\x0A' order by full_name) as Text
  from tmp;
будет возвращено одна запись с полем "text" в котором будет стоять текст:
ISQL
Васечкин:
Пупкин;
Самодуров;
Иванов:
Петров;
Сидоров;

Для пояснения - List - это аггрегатная функция, которая соединяет записи в long varchar строку с указанным разделителем (в данном случае использовались символы перевода строки), то есть данные рекурсивный запрос используется в аггрегатном запросе. Так что несмотря на усложнение запроса форма записи длиннее не стала :)
12 янв 05, 17:55    [1239929]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67447
Блог
ASCRUS
Не будет ли короче означать потерю какой либо функциональности ?

Возможно, будет. У меня создалось впечатление, что опция with recursive раскрывается во что-то типа join-а переменной вложенности - если так, у такой конструкции в принципе больше возможностей, хотя больше и вопросов к скорости.

ASCRUS
Можно ли в Оракле при обработке нодов деревьев организовывать любые вычисляемые поля и есть ли ограничения ?

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

ASCRUS
Например, можно ли сделать вот так:

Не совсем уверен, что не упустил какую-либо тонкость Вашего примера - поэтому спрошу, то ли это, что Вы имели в виду?

SQL> select lpad ( ' ', 2 * level - 2 ) ||
  2         case when mgr_id is null then name || ':' else name || ';' end
  3  from tree2
  4  start with mgr_id is null
  5  connect by prior id = mgr_id
  6  order siblings by name
  7  ;

LPAD('',2*LEVEL-2)||CASEWHENMG
--------------------------------------------------------------------------------
CLARK:
  JENSON;
  SMIRNOFF;
  SMITH;
    ABBOTH;
    DODSON;
    McLAUREN;
  STARK;

8 rows selected

Что касается функции LIST - это оракловый пример на тему "создание пользовательских агрегатных функций". Если ее откомпилировать, вполне можно будет ее применить; чтобы этим не заниматься, я приведу эквивалентный пример (использование CTE здесь в отличие от Вашего случая необязательно - просто чтобы не записывать одно и то же выражение дважды).

SQL> with
  2    tree as
  3      ( select case when mgr_id is null then name || ':'
  4                    else name || ';' end as name
  5    from tree2
  6    start with mgr_id is null
  7    connect by prior id = mgr_id )
  8  select
  9    min (name), max (name)
 10  from
 11    tree
 12  ;

MIN(NAME)   MAX(NAME)
----------- -----------
ABBOTH;     STARK;

SQL> 
12 янв 05, 18:25    [1240060]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
автор
Не совсем уверен, что не упустил какую-либо тонкость Вашего примера - поэтому спрошу, то ли это, что Вы имели в виду?

Немного не то. У Вас возвращается 8 записей, у меня одна запись в виде текста (для наглядности я его привел с форматированием, а не одной строкой). Это особенно очень удобно, если нужно клиенту вернуть множество записей в виде текста или для генерации HTML таблички с тегами, если это используется для веб-сервиса ASA.
12 янв 05, 19:24    [1240200]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
Yo!
Guest
2ASCRUS

ну тогда можно обернуть еще одной стандартной функцей и получите XML который можно уже мерджить с XSL, что более правильней чем зашивать в код презентацию (html)
12 янв 05, 20:19    [1240270]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
vadiminfo
Member

Откуда: Обнинск
Сообщений: 4802
select SYS_XMLAGG(SYS_XMLGEN(f)) from
(select lpad('_', 2*level,'_') || caption f from tree t
start with parent_id is null
connect by prior tree_id = parent_id);

Тоже возвращает один XML - одно поле
<F>__Иванов</F>
<F>____Петров</F>
<F>____Сидоров</F>
<F>__Васечкин</F>
<F>____Пупкин</F>
<F>____Самодуров</F>

select SYS_XMLGEN(f) from
(select lpad('_', 2*level,'_') || caption f from tree t
start with parent_id is null
connect by prior tree_id = parent_id);

Возвращает 6 записей.
Если Вы справшивали про ограничения в иерархических запросах, то они есть конечно. Но не забывайте, что у Оракла есть аналитические ф-ии, которые заменяют и самомсоединения.
В частности, я тут готовлю на второй работе нудный отчет в ПФ. Там все на Аксцессе. Настроил Оракл читать из аксцесса и одно удовольствие. Там где надо было создавать таблы для промежуточных вычислений сложных отчетов, писать на Вижуал бейсике циклы - один аналитический запрос. Легко его протестировать и все такое.
12 янв 05, 20:27    [1240279]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67447
Блог
ASCRUS
Немного не то. У Вас возвращается 8 записей, у меня одна запись в виде текста (для наглядности я его привел с форматированием,

Поэтому я вторым примером и показал, что к результату выборки можно применить агрегатную функцию - просто не хотелось вытаскивать из документации и инсталлировать пример функции, аналогичной примененной Вами LIST.

Что касается "удобно" - безусловно, это вполне хороший кандидат в стандартные функции. Впрочем, я не помню ни одного случая в своей практике, чтобы мне в SQL требовалась такая функция - соответственно, не скажу, что страдаю от ее отсутствия.
12 янв 05, 20:49    [1240296]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7078
andsm
Индексы для Oracle создавайте какие хотите. Для SQL Server должны быть индексы по LeftPath и RightPath, и по ID.

Давайте, все же приведите скрипты индексов. А то будете потом ссылаться, что я неправильно создал индексы :)
13 янв 05, 08:50    [1240697]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7078
andsm
Индексы для Oracle создавайте какие хотите. Для SQL Server должны быть индексы по LeftPath и RightPath, и по ID.

Все это ты здорово написал!

Вот тоже самое сделал на Oracle. Даже индексов создавать не стал, зачем они, когда с такой скоростью работает запрос... Пример хиленький. Попробуй сделай на моем примере 0 мс, тогда посмотрим на твой алгоритм. А так - семечки!

SQL*Plus: Release 8.1.7.0.0 - Production on Чтв Янв 13 09:24:36 2005

(c) Copyright 2000 Oracle Corporation.  All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

SQL> set timing on
SQL> select count(*) from TestTable sr
  2   join TestTable srIn on srIn.ID=46
  3    and sr.LeftPath between srIn.LeftPath and srIn.RightPath;

  COUNT(*)
----------
        39

Elapsed: 00:00:00.00

Данные брал твои. Любой ораклоид может меня проверить...

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production

SQL> set timing on
SQL> select count(*) from TestTable sr
  2   join TestTable srIn on srIn.ID=8043
  3    and sr.LeftPath between srIn.LeftPath and srIn.RightPath;

  COUNT(*)
----------
     11122

Elapsed: 00:00:00.00
Поражение MS SQL... Большое поражение. А на табло одни нули...
13 янв 05, 09:35    [1240789]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
alex-ls
Поражение MS SQL... Большое поражение. А на табло одни нули...

Это не поражение MS SQL, это больше похоже на неумение alex-ls сравнивать. Результаты с нулевым временм я на MS SQL тоже могу запросто получить, если забуду про кеширование.
13 янв 05, 11:31    [1241350]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
Yo!
Guest
2andsm

так можно всетаки у видеть код с path и level ? или это неразрешимая задача для МС ? 3й день пошел ...
13 янв 05, 11:37    [1241391]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Решил этот запрос запустить на компьютере получше
select count(*) from TestTable sr
 join TestTable srIn on srIn.ID=46
  and sr.LeftPath between srIn.LeftPath and srIn.RightPath
Компьютер: 4 x Xeon 2.5 ГГц, 6 Гб ОЗУ, RAID5, выделенный сервер MS SQL2k.
Совсем без посторонних влияний проверить не получилось - во время теста процессоры были на 25% загружены другими задачами, и дисковая подсистема тоже использовалась. Перед проверкой сбрасывал кеш и буфера, в отличие от alex-ls.
Результаты:
  COUNT(*)
----------
       39

SQL Server parse and compile time: 
   CPU time = 0 ms, elapsed time = 11 ms.

(1 row(s) affected)


SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 0 ms.


При разных запусках времена менялись, наилучшее - 5 ms, худшее - 37, среднее 11-12. Думаю при отсутствии нагрузки было бы как раз 5 ms.
Да, если не чистить кеш то получается как раз 0 ms
13 янв 05, 11:53    [1241503]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Yo!
так можно всетаки у видеть код с path и level ?

Если говорить об этой задаче, то наибольшую сложность вызывает path. level считается просто, хотя это приводит к еще одному джойну и торможению запроса. C Path проблемы из-за отсутствия в MS SQL агрегатных функций - в Юконе обещают что будут. Если поставить цель - достигнуть максимальной скорости запросов на выборку, то нужно добавлять дополнительные поля.
13 янв 05, 11:58    [1241529]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67447
Блог
andsm
C Path проблемы из-за отсутствия в MS SQL агрегатных функций - в Юконе обещают что будут.

Полагаю, пропущено слово "пользовательских" :)

Идея понятна - но, боюсь, быстродействие такого решения будет категорически неудовлетворительным.
13 янв 05, 12:01    [1241550]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
Yo!
Guest
andsm

Если говорить об этой задаче, то наибольшую сложность вызывает path. level считается просто, хотя это приводит к еще одному джойну и торможению запроса. C Path проблемы из-за отсутствия в MS SQL агрегатных функций - в Юконе обещают что будут. Если поставить цель - достигнуть максимальной скорости запросов на выборку, то нужно добавлять дополнительные поля.


итого: чтоб вывести хотябы дерево нужно понатыкать лишних колонок и индексов left&right, навешать тригеров которые замедляют вставку, но при этом результат все равно не дает полноценно работать с деревьями. и вот это называется вариант не хуже ораклового (db2/sybase) ???
13 янв 05, 12:09    [1241585]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
softwarer
Полагаю, пропущено слово "пользовательских" :)

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

Да, именно пользовательских.
Почему быстродействие будет неудовлетворительным? Скорость на выборку будет практически такая же как и Оракл, в некоторых случаях быстрее.
13 янв 05, 12:10    [1241595]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Yo!
итого: чтоб вывести хотябы дерево нужно понатыкать лишних колонок и индексов left&right, навешать тригеров которые замедляют вставку, но при этом результат все равно не дает полноценно работать с деревьями. и вот это называется вариант не хуже ораклового (db2/sybase) ???

Нет, не так. Мне хватает left&right, остальное не требовалось. Потребуется - буду думать. Триггеров в базах которые я проектировал вообще ни одного нет. Про полноценную работу с деревьями - да, не все что легко сделать в Оракл легко сделать в MS SQL2k. В каждом конкретном проекте обычно нужна только часть возможностей. Сделать чтобы деревья работали со сравнимой скоростью - можно, хотя иногда сложнее.
13 янв 05, 12:19    [1241651]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
Yo!
Guest
>риггеров в базах которые я проектировал вообще ни одного нет.

непонял, а откуда берутся значения в left&right ? магия ??
13 янв 05, 12:22    [1241676]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7078
andsm
alex-ls
Поражение MS SQL... Большое поражение. А на табло одни нули...

Это не поражение MS SQL, это больше похоже на неумение alex-ls сравнивать. Результаты с нулевым временм я на MS SQL тоже могу запросто получить, если забуду про кеширование.

Просвятите меня про какое кэширование Вы говорите? Или может кто другой тыкнет меня в ошибку? Буду признателен!
Какие ошибки я допустил при сравнении? Скрипты создания индексов Вы мне так и не дали...
13 янв 05, 12:26    [1241696]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Yo!
непонял, а откуда берутся значения в left&right ? магия ??

Заполняются сервером приложений.
13 янв 05, 12:31    [1241725]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
Yo!
Guest
andsm

Заполняются сервером приложений.


а ну это конечно в корне меняет положение :)
к стате а что происходит при перемещании веток ? 3 дня перестраивается все дерево ?
13 янв 05, 12:35    [1241741]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Yo!
>риггеров в базах которые я проектировал вообще ни одного нет.

непонял, а откуда берутся значения в left&right ? магия ??

В ХП или отдельно наверное рассчитываются - почему то у многих специалистов существует "поверье", что триггеры это плохо. И это действительно плохо, если ими не правильно пользоваться :)

Кстати насчет Path насколько я понимаю в MSSQL возникает нехорошая проблема, размером в 8кб, максимально допустимого для varchar и невозможностью работать в ХП с text-полями.
13 янв 05, 12:37    [1241755]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7078
Ответ на свой вопрос не получил. Оппонент уклоняется от ответа? Спрашиваю еще раз о каком кэшировании Вы спрашивали. В Oracle первый раз запрос выполняется медленнее всего, эти результаты я и привел... Медленнее не получится, прогонял с другими данными, везде 0 мс. А на МS SQL выполнение 2 мс, посмотрите на свой же пост на 10 листе...
13 янв 05, 12:49    [1241823]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67447
Блог
andsm
Почему быстродействие будет неудовлетворительным? Скорость на выборку будет практически такая же как и Оракл, в некоторых случаях быстрее.

Хм. Это впечатление - которое можно проверить, если cчитать вместо PATH какую-нибудь существующую агрегатную функцию по той же выборке. Разница на глаз должна быть примерно такой же, как при использовании в оракле вместо аналитических функций агрегатных (для решения тех же задач).

Насколько я понимаю, желание считать PATH агрегатной функцией означает следующее: к каждой строке выборки джойнится еще одна выборка (родительских узлов для данного), которая обрабатывается агрегатной функцией. Кэш, если повезет, спасет от квадратичного роста количества физических чтений - но не от логических.
13 янв 05, 12:59    [1241857]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
StalkerS
Member

Откуда: Melbourne
Сообщений: 1344
Yo!

так можно всетаки у видеть код с path и level ? или это неразрешимая задача для МС ? 3й день пошел


Похоже, некоторые здесь все-еще с нового года отойти не могут ;)
Запрос, возвращающий путь элементов я выложил еще на 5 странице этого топика !
Вот он :


declare @tree table (parent int, child int )
insert into @tree values(1,2)
insert into @tree values(1,3)
insert into @tree values(1,4)
insert into @tree values(1,6)
insert into @tree values(1,7)
insert into @tree values(2,5)
insert into @tree values(3,5)
insert into @tree values(4,5)
insert into @tree values(5,8)
insert into @tree values(6,8)
insert into @tree values(7,9)
insert into @tree values(8,10)
insert into @tree values(9,10)

declare @elem int, @level int
select @elem=10, @level=0

declare @wave table (parent int null, child int null, level int, path varchar(8000) )

insert into @wave
select *, @level, rtrim(convert(varchar(20),parent))+'-'+rtrim(convert(varchar(20),child))
from @tree
where child=@elem

while @@rowcount>0
begin

select @level=@level+1

insert into @wave
select t.parent, coalesce(t.child,w.parent), @level,
case when t.parent is null then w.path else rtrim(convert(varchar(20),t.parent))+'-'+w.path end
from @wave w
left join @tree t on w.parent=t.child
where w.level=@level-1 and w.parent is not null

end

select path from @wave where parent is null


Он вернет следующие строки:
1-6-8-10
1-7-9-10
1-2-5-8-10
1-3-5-8-10
1-4-5-8-10

Т.е. путь к элементу № 10, начиная с 1 элемента.
13 янв 05, 16:03    [1242694]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7078
To StalkerS:
Да этот пример работает, проверял. Жаль, что не с моими данными... ;)
Кстати Степин Андрей похожий скрипт мне присылал, он проигрывает по скорости стандартному connect by и варианту andsm скорее всего тоже по скорости выборки данных. Но зато быстрее выполняется insert, delete, update по сравнению с вариантом andsm.
13 янв 05, 16:25    [1242842]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 12 13 14 15 16 [17] 18 19 20 21 .. 31   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить