Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8 9 10 .. 31   вперед  Ctrl
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7079
www.fun4me.narod.ru
Хотя нет, я ошибся. Для всяких там пирамид, сетевых маркетингов и рефералов "зарплату" без деревьев, пожалуй не посчитаешь. На да пусть там и используется Oracle, только лицензионный.

Дерево КЭ (конструкторских элементов).
Т.е. изделие (1) состоит из корпуса (2) и начинки (3).
Корпус (2) состоит из того и того. Начинка (3) тоже из чего и пошло. Чтобы сделать изделие нужно пройти все его дерево, на каждый промежуточный путнк несколько операций (резка, контроль, слесарная), несколько матрериало (металл, пластик), инструмент (щипцы, пила) и т.д. и т.п.
Продолжать?!
Если кто-то сможет это нормально реализовать на MS SQL, я пожму ему руку. Пока таких не встречал.
В качестве альтернативного примера можно привести топологию электрических сетей (работал там два года!), та же ситуация. Куча деревьев, вывод MS SQL не рулит.
Если деревья в базе не используются, то согласен, этот минус MS SQL в расчет не берем.
Но есть еще блокировки... А они всплывают тем чаще, чем больше пользователей. Но здесь у меня знаний меньше, напора знатоков MS SQL не выдержу :)
18 дек 04, 10:55    [1190846]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7079
Я прочитал статью...
Впечатления? Ну это лучше, чем то что есть в MS SQL по умолчанию.
Но! К глубокой скорби поклонников MS SQL это не дает никаких шансов в схватке с ORACLE при наличии больших древовидных таблиц в базе. Повторяю, НИКАКИХ!
А за статью спасибо, познавательная!
18 дек 04, 11:41    [1190871]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
alex-ls
Я прочитал статью...
Впечатления? Ну это лучше, чем то что есть в MS SQL по умолчанию.
Но! К глубокой скорби поклонников MS SQL это не дает никаких шансов в схватке с ORACLE при наличии больших древовидных таблиц в базе. Повторяю, НИКАКИХ!

Больших - это каких? Иерархии с глубиной до 120 уровней и десятками тысяч записей в каждой ветке подойдут? - Цифры для одного из проектов, где я это делал.
18 дек 04, 12:15    [1190903]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7079
Ау, поклоники MS SQL.
Можно получить объяснения по приведенному коду.

create procedure Test_My_Proc
as
drop table Test_My
create table Test_My (a int)
insert into Test_My Values(1)
insert into Test_My Values('sdfgdg')

The command(s) completed successfully.

exec Test_My_Proc

(1 row(s) affected)
Server: Msg 245, Level 16, State 1, Procedure Test_My_Proc, Line 7
Syntax error converting the varchar value 'sdfgdg' to a column of data type int.
 
commit tran

Server: Msg 3902, Level 16, State 1, Line 6
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

select * from Test_My

Результат:
a
----
1


II Вариант

begin tran
exec Test_My_Proc
commit tran

(1 row(s) affected)

Server: Msg 245, Level 16, State 1, Procedure Test_My_Proc, Line 7
Syntax error converting the varchar value 'sdfgdg' to a column of data type int.

commit tran

Server: Msg 3902, Level 16, State 1, Line 1
The COMMIT TRANSACTION request has no corresponding BEGIN TRANSACTION.

select * from Test_My

Server: Msg 208, Level 16, State 1, Line 1
Invalid object name 'Test_My'.
18 дек 04, 12:17    [1190907]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7079
andsm
alex-ls
это не дает никаких шансов в схватке с ORACLE при наличии больших древовидных таблиц в базе.

Больших - это каких? Иерархии с глубиной до 120 уровней и десятками тысяч записей в каждой ветке подойдут? - Цифры для одного из проектов, где я это делал.

Сойдет!
Доказательства быстрой работы представить можешь? Или только на словах?
18 дек 04, 12:20    [1190911]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
alex-ls
Доказательства быстрой работы представить можешь? Или только на словах?

И какие доказательства хочешь увидеть?
18 дек 04, 12:26    [1190914]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
StalkerS
Member

Откуда: Melbourne
Сообщений: 1345
alex-ls
Дерево КЭ (конструкторских элементов).
Т.е. изделие (1) состоит из корпуса (2) и начинки (3).
Корпус (2) состоит из того и того. Начинка (3) тоже из чего и пошло. Чтобы сделать изделие нужно пройти все его дерево, на каждый промежуточный путнк несколько операций (резка, контроль, слесарная), несколько матрериало (металл, пластик), инструмент (щипцы, пила) и т.д. и т.п.
Продолжать?!
Если кто-то сможет это нормально реализовать на MS SQL, я пожму ему руку. Пока таких не встречал.


тогда тебе крупно повезло, как раз я и реализовывал на mssql базу для технологического отдела предприятия,
там имеется древовидная структура сборок на каждое изделие, на каждую деталь/сборку вводиться технология
(да еще и не одна, т.к. деталь может иметь несколько вариантов технологии).

Скорее напиши, по каким причинам моя база не должна работать в теории, а то на практике она работает, может
у меня проблемы с адекватным восприятием действительности, а ты - Neo матрицы в которой мы живем ?
18 дек 04, 12:31    [1190918]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7079
StalkerS

тогда тебе крупно повезло, как раз я и реализовывал на mssql базу для технологического отдела предприятия,
там имеется древовидная структура сборок на каждое изделие, на каждую деталь/сборку вводиться технология
(да еще и не одна, т.к. деталь может иметь несколько вариантов технологии).

Скорее напиши, по каким причинам моя база не должна работать в теории, а то на практике она работает, может
у меня проблемы с адекватным восприятием действительности, а ты - Neo матрицы в которой мы живем ?

Я не говорил, что на MS SQL не будет работать. Я сказал, что будет работать медленнее. Так скорее всего и есть.
18 дек 04, 12:37    [1190927]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7079
andsm
alex-ls
Доказательства быстрой работы представить можешь? Или только на словах?

И какие доказательства хочешь увидеть?

Приведи процедуру, которая построит дерево вниз от случайного элемента и вверх тоже от случайного элемента. Выдавая таким образом на выходе список элементов, которые в нее входит (раз) и в которые она входит (два).
Естественно с тестовой таблицей.
Я проверю, а сравнительные результаты вывешу. Можешь мне поверить, обманывать не буду ;)
Естественно онные будут для нашего сервера, но тенденция будет видна.
18 дек 04, 12:41    [1190930]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
www.fun4me.narod.ru
Member

Откуда: Moscow
Сообщений: 2406
Не, так не пойдёт. Надо вам собраться всем в одном месте и на идентичных системах заимплементить дерево. Кто проиграет - с того ящк пива!
18 дек 04, 12:47    [1190935]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
www.fun4me.narod.ru
Member

Откуда: Moscow
Сообщений: 2406
Можно через rdesktop на двух виртуальных машинах.
18 дек 04, 12:50    [1190937]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
alex-ls
Приведи процедуру, которая построит дерево вниз от случайного элемента и вверх тоже от случайного элемента. Выдавая таким образом на выходе список элементов, которые в нее входит (раз) и в которые она входит (два).

Вниз, все подчиненные элементы + сам элемент:
declare @ID int
set @ID=123 -- идентификатор какой-нибудь записи
select t.* from TestTable t 
 join TestTable tIn on tIn.ID=@ID and t.LeftPath between tIn.LeftPath and tIn.RightPath
Вверх:
declare @ID int
set @ID=123 -- идентификатор какой-нибудь записи
select t.* from TestTable t 
 join TestTable tIn on tIn.ID=@ID and tIn.LeftPath between t.LeftPath and t.RightPath
18 дек 04, 12:56    [1190943]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
StalkerS
Member

Откуда: Melbourne
Сообщений: 1345
вуа-ля :

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-4-5-8-10 - это путь от самой первой сборки (1) до
указанной (10), данный код возвращает все возможные пути.
Это требуется, когда нужно быстро найти все вхождения в изделие какой-либо детали (подшипника например)
18 дек 04, 12:57    [1190945]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7079
Да ладно Вам. Код своих процедур я дам тоже.
Я понимаю поверить на слово тяжело. Так что каждый у себя проверит!
А насчет собраться вместе, это хорошо. Эх, если б в Москве все жили... Или получали на местах столько же!
А так сбор неосуществим по финансовым соображениям... А жаль.
18 дек 04, 12:58    [1190949]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Да, и тестовая таблица:
create table TestTable(
ID int not null primary key,
ParentID int null,
LeftPath int null,
RigtPath int null
)
18 дек 04, 12:59    [1190950]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Еще нужны какие-нибудь данные
Insert into TestTable(ID, ParentID, LeftPath, RightPath) values(1, null, 1, 10)
Insert into TestTable(ID, ParentID, LeftPath, RightPath) values(2, 1, 2, 3)
Insert into TestTable(ID, ParentID, LeftPath, RightPath) values(3, 1, 4, 9)
Insert into TestTable(ID, ParentID, LeftPath, RightPath) values(4, 3, 5, 8)
Insert into TestTable(ID, ParentID, LeftPath, RightPath) values(5, 4, 6, 7)
18 дек 04, 13:03    [1190956]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7079
Результаты постараюсь подготовить на следующей неделе...
18 дек 04, 13:14    [1190969]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
oopsa
Guest
alex-ls
Ау, поклоники MS SQL.
Можно получить объяснения по приведенному коду.

судя из приведенного текста человек особо не задумывался над тем, что писал... точнее вообще не задумывался...
а может просто не понимал, что пишет?
и строки для постинга настриг случайным образом.
18 дек 04, 13:29    [1190976]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
Sarin
Member

Откуда: Земля, Солнечная система.
Сообщений: 14485
Господа, я не спец ни по Ораклу, ни по МССКЛ, но вот что скажу: среди достоинств мелкософтовского сервера указана большая простота запросов Типа на Оракле напишешь то-же, но строчек будет в два раза больше.
Когдато я изучал ассемблер (так по верхам), для того, чтоб вывести строку требуется 3 команды, а на паскале, или с, или бейсике одна. Но пусть в меня бросит камень тот, кто считает, что ассемблер плохой язык.

А ещё статья (как кстати и про ASP.NET) напомнила рекламную компанию Visual Studio.

Да прибудет с вами дистрибутив.
18 дек 04, 13:31    [1190981]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
oopsa
Guest
alex-ls
Я прочитал статью...
Впечатления? Ну это лучше, чем то что есть в MS SQL по умолчанию.
Но! К глубокой скорби поклонников MS SQL это не дает никаких шансов в схватке с ORACLE при наличии больших древовидных таблиц в базе. Повторяю, НИКАКИХ!

ОБОСНОВАНИЕ в студию... ;)
18 дек 04, 13:38    [1190987]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7079
oopsa
alex-ls
Ау, поклоники MS SQL.
Можно получить объяснения по приведенному коду.

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

Почему случайным? Обрати внимание на begin tran. Причем в Т-Flex (пример на основе их кода) об этом не знают, наверное... Получаются случайные данные в ПРОИЗВОДСТВЕННОЙ БАЗЕ.
18 дек 04, 13:45    [1191003]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 7079
andsm
Еще нужны какие-нибудь данные
Insert into TestTable(ID, ParentID, LeftPath, RightPath) values(1, null, 1, 10)
Insert into TestTable(ID, ParentID, LeftPath, RightPath) values(2, 1, 2, 3)
Insert into TestTable(ID, ParentID, LeftPath, RightPath) values(3, 1, 4, 9)
Insert into TestTable(ID, ParentID, LeftPath, RightPath) values(4, 3, 5, 8)
Insert into TestTable(ID, ParentID, LeftPath, RightPath) values(5, 4, 6, 7)

Какие создавать индексы?
Да и не мог ты дать процедуру проставления LeftPath и RightPath по ID и ParentID? Будет около 180 000 строк... Деревья будут реальные.

To oopsa:
Во-первых зарегистрируйтесь, пожалуйста.
Во-вторых результаты (обоснования) ждите на слудующей неделе.
18 дек 04, 13:55    [1191017]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
alex-ls
Какие создавать индексы?
Да и не мог ты дать процедуру проставления LeftPath и RightPath по ID и ParentID? Будет около 180 000 строк... Деревья будут реальные.

Индексы по LeftPath и RightPath.
Для проставления LeftPath и RightPath я использую C#, кода этого класса у меня дома нет. Способ проставить LeftPath и RightPath все же есть, присылай таблицу без них, обратно пришлю с заполненными.
18 дек 04, 14:10    [1191029]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
www.fun4me.narod.ru
Member

Откуда: Moscow
Сообщений: 2406
Можно ещё триггером обновлять таблицу путей из вершины к листьям
create table track(
    target_id int, -- лист дерева, в который мы можем придти из узла node_id
    node_id int, -- узел дерева, лежащий на пути к листу target_id
    level_num int, -- номер узла node_id на пути к target_id из вершины дерева
    primary key(target_id, node_id)
);

При инициализации таблицы её надо заполнять снизу вверх - от листьев к вершине. При добавлении узла, если у него есть "братья", то копируется весь путь к родительскому узлу с указанием target_id нового узла, в противном случае путь к родительскому узлу заменяется на путь к новому узлу. При удалении узла удаляется весь путь с target_id удаляемого узла.

Тогда, берём случайный узел @ID на дереве TestTable и получаем:

вверх:
select tree.* from (select top 1 * from track node_id = @ID) node_track -- что ищем
    join track current_track on current_track.target_id = node_track.target_id
    join TestTable tree on tree.ID = current_track.node_id
where
    and current_track.level_num <=node_track.level_num -- в какую сторону ищем
order by current_track.level_num

вниз:
select tree.* from track node_track
    join track current_track on current_track.target_id = node_track.target_id 
    join TestTable tree on tree.ID = current_track.node_id
where
    node_track.node_id = @ID -- что ищем
    and current_track.level_num >=node_track.level_num -- в какую сторону ищем
order by node_track.target_id, current_track.level_num

При построении таблицы track учитывается, что к любому терминальному листу из вершины дерева можно придти единственным способом и дерево представляется в виде набора списков, связывающих корень с листом.
18 дек 04, 16:14    [1191137]     Ответить | Цитировать Сообщить модератору
 Re: MS SQL > Oracle = True?  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
www.fun4me.narod.ru
Можно ещё триггером обновлять таблицу путей из вершины к листьям

Метод работает только для иерархий с малой глубиной. Для иерархии с глубиной 120 такая таблица содержит миллионы записей. Время добавления/удаления одного элемента - полчаса минимум.
18 дек 04, 16:41    [1191152]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 3 4 [5] 6 7 8 9 10 .. 31   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить