Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
 Re: Работа с коллекциями в T-SQL  [new]
www.fun4me.narod.ru
Member

Откуда: Moscow
Сообщений: 2406
/imho/, стоящее в конце поста и выглядещее как подпись, относится ко всему посту.
18 фев 04, 16:15    [541713]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
None0
Guest
А очень просто:
Например у вас есть достаточно тяжелый запрос из-за навороченного ORDER-а. Если вам далее необходимо работать с этой выборкой, то почему бы ее не кинуть в коллекцию. Законный вопрос: а почему тогда мне ее не кинуть во временную таблицу? Единственный мой ответ здесь - запись в темп-таблицу всегда сопровождается редо-логами, то есть дерганьем дисковой ситемы. А зачем нам нагружать ее лишный раз? Робота с колекциями же - работа с памятью (если ее достаточно конечно).
19 фев 04, 00:11    [542378]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
2 None0
В приведённом примере надо одназначно использовать временные таблицы(или таблицы-переменные). На мой взгляд.
Сервер сам должен решать что ему делать в памяти, а что на диске
19 фев 04, 10:38    [542694]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
Gt.
Guest
запись в темпорари таблицу не сопровождается записью логи и совершенно не обязательно дергатается диск.

ЗЫ. наверника темпорари тоже можно закрепить в памяти.
19 фев 04, 10:46    [542728]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
Gt.

в MS SQL любая запись в таблицу логируется...
19 фев 04, 11:02    [542778]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
AlTk
Member

Откуда: Волгоград
Сообщений: 124
сейчас посмотреть негде, но вроде SELECT INTO не логируется.
19 фев 04, 11:21    [542839]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Времянки в MSSQL логируются. Табличные переменные имеют локальную область видимости, висят в памяти и в транзакциях и логах не участвуют. SELECT INTO лучше не баловаться, лучше использовать CREATE TABLE #TableName (...) и INSERT INTO #TableName. В FAQ по MSSQL по моему все на SQL.RU это есть, ну или на форуме MSSQL уж точно есть :)
19 фев 04, 11:31    [542852]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
Gt.
Guest
да я про оракл ... речь вроде про оракл и колекции
19 фев 04, 12:09    [542953]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
None0
Guest
Ха, вот еще пример.
Работаю с деревьями. Задача: От каждого листа построить до корня путь в виде строки идентификаторов. Чегото типа того: '567,1223,4343,189'. Элементов в дереве порятка 500.
Чего я делаю. Сгружаю дерево иерархическим запросом в коллекцию. И начинаю по ней активно шуровать циклами для постоения нужных путей. Да, тоже самое можно сделать иерархическими запросами со START WITH, равного листу. И запросов таких должно быть столько, сколько листьев. Да и потом полюбому такие выборки надо анализировать.
Вариант работы с коллекцией по циклам в разы бастрее, чем задалбливать базу запросами.
Итог: мне, как разработчику в Оракле коллекции нужны и важны. МС-Скуэлистам - большой привет.
19 фев 04, 16:19    [543817]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
2None0
автор
Итог: мне, как разработчику в Оракле коллекции нужны и важны. МС-Скуэлистам - большой привет.

К чему это сказано? Вроде все пришли к выводу, что в MSSQL полный аналог оракловских коллекций - таблицы-переменные или временные таблицы.

автор
Ха, вот еще пример. Работаю с деревьями. Задача: ......

Ну я в MSSQL делаю так-же, используя таблицы-переменные, тем более, что в MSSQL нет иерархических запросов. А вообще, правильно создав модель данных, это можно делать одним запросом, что я в последнее время и предпочитаю.

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

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


Это было сказано про темп-таблицы в MSSQL?
В MSSQL запись в темп-таблицу всегда сопровождается редо-логами, но не дерганьем дисковой системы, а запись в таблицы-переменные даже не сопровождается редо-логами.

Я специалист в MSSQL, а не в Оракле, и поэтому не позволяю себе делать делать заявления типа "Оракл ацтой, патамушта там ничего нильзя сделать". Вот буду специалистом, тогда позволю :-)
19 фев 04, 17:14    [544016]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
None0
Guest
>>Вроде все пришли к выводу, что в MSSQL полный аналог оракловских коллекций - таблицы-переменные или временные таблицы.

Тогда вопросы:
1) Можно заполнять таблицы-переменные одним SELECT-ом.
2) Их можно использовать в запросах как обычные таблицы базы для оператора SELECT.
3) Генерится ли ошибка, исключение (или что там на MSSQL), при доступе к несуществующим индексам таблицы-переменной.
4) Можно ли их передавать в/из хранимых процедур.

Если все ответы положительны (или условно положительны), тогда да, аналогия очевидно полная.

>>МС-Скуэлистам - большой привет.
Эээ, кому либо передать привет уже является непреличным?

>>Оракл ацтой, патамушта там ничего нильзя сделать
А где я такое сказал о MSSQL???
19 фев 04, 18:44    [544220]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
tygra
Member

Откуда: Тверь (Иркутск, Край)
Сообщений: 9997
автор
1) Можно заполнять таблицы-переменные одним SELECT-ом.
2) Их можно использовать в запросах как обычные таблицы базы для оператора SELECT.
3) Генерится ли ошибка, исключение (или что там на MSSQL), при доступе к несуществующим индексам таблицы-переменной.
4) Можно ли их передавать в/из хранимых процедур.


1. А как же? Любые таблицы можно так заполнять :)
2. Угу
3. У таблицы-переменной индексов нет, у временной - есть, генерится
4. Переменные - нет, временные - да, но не посредством переменной процедуры, а саму по себе.

Так что ничем принципиально не отличаются.
Тут другое - оракловский подход пакетов придется забывать :)

-- Tygra's --
19 фев 04, 19:16    [544259]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
2None0
Из всего списка не только п. 4. И вот это очень и очень плохо.
19 фев 04, 20:00    [544299]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
2tygra
я так понял в 3 пункте имеется ввиду обращение к элементу коллекции, которого реально нет. К примеру collect(15) и при этом в коллекции нет этого элемента. А ответ здесь будет таким - нет смысла, т.к.это все же таблица, а не коллекция :)
19 фев 04, 22:49    [544397]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
Simple
Guest
Большой спасибо за обсуждение данного вопроса. В принципе и предполагалось перейти на временые таблицы, но исходя из того что они все таки создаются на винте, а скорость чтения из памяти по сравнению со скоростью жесткого накопителя... сами знаете. Конечно будет замедление. Значит динамических массивов с использованием в DML в MSSQL нет ?
Хорошо что упомянули деревья. Будите смеяться но они тоже есть (правда всего одна структура, по сравнению с коллекциями, они сплошь и рядом). Правда через некоторое написание кода в ХП это тоже решается, жать что не так красиво, придется структуру в ручную строить.
20 фев 04, 06:53    [544503]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
2 None0

Сдается мне, что Вы путаете коллекции Oracle (т.е. таблицы PL/SQL о которых шла речь изначально) с объектными таблицами, появившимися позже и имеющими совершенно другую функциональность. Тем самым Вы вводите в заблуждение людей не знакомых с Oracle.
20 фев 04, 07:43    [544523]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
2Simple
автор
исходя из того что они все таки создаются на винте....
Значит динамических массивов с использованием в DML в MSSQL нет?

Да почти в каждом посте обсуждали, сколько можно - ничего на винте не создаётся - только если нет памяти; скажем, создаю массив больше, чем вся память компа. Надеюсь, в Оракле при отсутствии памяти тоже используется винт, или просто всё падает?
20 фев 04, 10:17    [544741]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Извиняюсь, сейчас перечитал, действительно сначала шла речь об объектных таблицах.
20 фев 04, 10:22    [544761]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
None0
Чего я делаю. Сгружаю дерево иерархическим запросом в коллекцию. И начинаю по ней активно шуровать циклами для постоения нужных путей. Да, тоже самое можно сделать иерархическими запросами со START WITH, равного листу. И запросов таких должно быть столько, сколько листьев. Да и потом полюбому такие выборки надо анализировать.
Вариант работы с коллекцией по циклам в разы бастрее, чем задалбливать базу запросами.


Извиняюсь, но плакать хочется читая такое. Мне кажется работать с базой по одной записи - это кощунство. Задалбливать базу запросами... А для чего база нужна то? Она по идее и должна лучше с запросами справляться чем с циклами. Может я чего не понимаю, но вот решение этой задачи на MS SQL:
create table #t(id int, parent int, caption varchar(20))

go

insert #t(id, parent, caption)
select 1, 0, '1'
union
select 2, 0, '2'
union
select 3, 1, '1.3'
union
select 4, 1, '1.4'
union
select 5, 2, '1.5'
union
select 6, 3, '1.3.6'
union
select 7, 6, '1.3.6.7'
union
select 8, 4, '1.4.8'
union
select 9, 3, '1.3.9'
go

--------- собственно решение ---------

declare @t table(id int, level int, caption varchar(20), path varchar(99))
declare @L int
set @L=0

insert @t
select id, 0, caption, convert(varchar, id)
from #t where parent=0
while @@rowcount<>0
begin
set @L=@L+1
insert @t -- запрос выполнится только 3 раза, а не 9!

select t.id, @L, t.caption, v.path+'.'+convert(varchar, t.id)
from @t v, #t t
where v.id=t.parent and level=@L-1
end

select * from @t


Может и коллекциями это будет лучше и проще - ну покажите мне как бы это было на Оракле, а то только ссылки и красивые слова


Simple
...скорость чтения из памяти по сравнению со скоростью жесткого накопителя... сами знаете. Конечно будет замедление. Значит динамических массивов с использованием в DML в MSSQL нет ?

А никто и не спорит что написанное на низком уровне дольше работает. Только писать намного дольше приходится.
20 фев 04, 11:12    [544903]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
Описка:
...написанное на низком уровне быстрее работает...
20 фев 04, 11:13    [544911]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
None0
Guest
>>Gluk (Kazan)

А по-моему и коллекция и объектная таблица и pl/sql nested-table - это все называние одного разными словами. А что такое "объектная таблица". И когда они появились (если в 9-ке, то увы, не силен).

>>SergSuper

insert #t(id, parent, caption)

select 1, 0, '1'
union
select 2, 0, '2'
union
select 3, 1, '1.3'
union
select 4, 1, '1.4'
union
select 5, 2, '1.5'
union
select 6, 3, '1.3.6'
union
select 7, 6, '1.3.6.7'
union
select 8, 4, '1.4.8'
union
select 9, 3, '1.3.9'
go


В моей структуре столбца caption нет. Его нужно получить.
20 фев 04, 12:20    [545142]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
2 None0

Я сам по первоначалу путался:

type T_TYPE is table of number index by binary_integer;

таблица PL/SQL ака ассоциативная(разреженная) коллекция старого стиля. В 9i появилась возможность by varchar2. Элементы не обязаны идти по порядку, и ее нельзя использовать в forall, bulk collect и иже с ними, для другого она (например для обхода мутации триггеров).

create or replace type T_TYPE as table of varchar2(10);
/

Объектная таблица, которую Вы имеете в виду, появилась в 8i если не путаю. Ее можно использовать для всяких выкрутасов типа update-ов в forall, bulk collect, функций таблиц и т.п. У Кайта во втором томе хорошо описано.
20 фев 04, 12:35    [545180]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
None0
Guest
Gluk (Kazan):
>>type T_TYPE is table of number index by binary_integer;
эту фигню я называю разреженной матрицей.

А все остальное, что описано в PL/SQL User's Guide and Reference / Collections and Records называю коллекциями.

>>У Кайта во втором томе хорошо описано.
Да я вкурсе, спасибо.
20 фев 04, 12:47    [545209]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
None0
Guest
А вообще все должно быть так:
Каждый более менее развитый язык обязан иметь одномерные массивы. Каждый язык должен поддерживать не только простые типы данных (int, char, long), но и сложные, состоящие из комбинации простых. Естественно передача данных в/из функций (как прямо, так и по ссылке) само собой разумеющееся.

Так вот коллекции - ни что иное как массивы сложных типов (простые типы - частность). А так как язык у нас - процедурное расширение SQL, то такие массивы можно представлять как обычные таблицы базы.
20 фев 04, 13:14    [545282]     Ответить | Цитировать Сообщить модератору
 Re: Работа с коллекциями в T-SQL  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
2 None0
Если Вы чуть внимательнее посмотрите, то поймёте поле caption - это только название ветки, я его использовал для проверки правильности. А сам путь до корня вычисляется и записывается в поле path таблицы-переменной @t.

Конечно в T-SQL от MS мне много чего не нравится, но массивы там нахрен не нужны.

Дык и всё-таки: имею я надежду увидеть решение с коллекциями от Вас?
20 фев 04, 14:46    [545571]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3 4   вперед  Ctrl      все
Все форумы / Сравнение СУБД Ответить