Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
Надёюсь я не повторюсь в своём вопросе и никого не обижу.
Предположим имеется база-источник с таблицей в 10 млн строк на Oracle (9iR2+p6) и целева таблица на MS 2000 + p3.
Лирическое отсупление : опыт работы с Ораклом говорит о том, что если надо из Ora_server1.tab1 переложить данные в Ora_server2.tab2, не используя различных утилит, то лучше всего воспользоватся курсором и фетчить по 1000 - 10 000 строк и потом коммитить и так далее до " последней крошки". А не 10 000 000 за раз. ( Хотя бывают разные задачи).

Теперь вопрос как реализовать ( покажите пример кода, а то оптыта в MS SQL не хвататет) такой же метод - как в "лирическом отступлении".
Или же, можно ли воспользоватся OPENQUERY и при этом тянуть данные из Оракла посредстам курсора?

Хочу просто потестить разницу для MS SQL

Спасибо!
31 окт 05, 14:47    [2023409]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
то лучше всего воспользоватся курсором и фетчить по 1000 - 10 000 строк и потом коммитить и так далее до " последней крошки".


Тока без курсора и так же по 1 000 - 10 000 строк.
31 окт 05, 14:52    [2023438]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а сливать данные хотите именно из сиквела? из оракла в сиквел нельзя?

для спящего время бодрствования равносильно сну
31 окт 05, 14:53    [2023443]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
Алексей2003
а сливать данные хотите именно из сиквела? из оракла в сиквел нельзя?

для спящего время бодрствования равносильно сну

Ну я ж говорю - хочу потестить для MS SQL
31 окт 05, 15:44    [2023774]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
pkarklin
автор
то лучше всего воспользоватся курсором и фетчить по 1000 - 10 000 строк и потом коммитить и так далее до " последней крошки".


Тока без курсора и так же по 1 000 - 10 000 строк.


И как по подробнее , а то я в MS SQL не очень. А интересно увидеть прирост\не прирост производительности на MS SQL.
Может в двух словах опишите пример....
31 окт 05, 15:46    [2023793]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Parkhomets Andrey

Может в двух словах опишите пример....


1. Цикл по диапазону ROW_ID.
2. Каждую пачку записей в транзакцию.
31 окт 05, 15:49    [2023810]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
pkarklin
Parkhomets Andrey

Может в двух словах опишите пример....


1. Цикл по диапазону ROW_ID.
2. Каждую пачку записей в транзакцию.


Нверно ROW_ID имеет другое название :)
31 окт 05, 15:55    [2023849]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Может быть и другое, точно не знаю. Под ROW_ID подразумевался "номер записи", который сущесвету в Оракл и не существует в MS SQL.
31 окт 05, 16:00    [2023876]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
pkarklin
Может быть и другое, точно не знаю. Под ROW_ID подразумевался "номер записи", который сущесвету в Оракл и не существует в MS SQL.

Да я понял, не нашёл я прямого у поминания в BOL про row_id ( rownum).
Есть только TOP - которое позволяет определённое кл-во строк вытянуть.
Как вытягивать следёющую строку мало понятно.
А как последнюю ? В MS SQL только один способ организайии цикла через "DECLARE @counter INT
SELECT @counter = 0
WHILE @counter < 5
BEGIN
SELECT @counter = @counter + 1
END" и всё ?
31 окт 05, 16:17    [2023984]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Погодите... Вы из Оракла в МС сиквел данне тяните или пардон...
31 окт 05, 16:22    [2024010]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
pkarklin
Погодите... Вы из Оракла в МС сиквел данне тяните или пардон...


Именно вытягиваю, а не вталкиваю
31 окт 05, 16:24    [2024032]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Ну так вы зе запрос к ораклу будете отправлять и он должен быть в синтаксисе оракл, а не мс скл.
31 окт 05, 16:26    [2024048]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
pkarklin
Ну так вы зе запрос к ораклу будете отправлять и он должен быть в синтаксисе оракл, а не мс скл.


Гениально.


Как я понимаю MS к Ораклу может обратится по средствам OPENQUERY(linked_server, 'query'). И как так сделать чтобы в 'query' влезло открытие курсора ( но на стороне MS )??????
Конечно можно извратится через OPENQUERY(linked_server, 'select f(counter) from dual'), где f(counter) - функция в Оракле, которая построчно вытягивает строки( хотя меня такая функция смущает ).
автор
31 окт 05, 16:33    [2024092]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Glory
Member

Откуда:
Сообщений: 104760
Как я понимаю MS к Ораклу может обратится по средствам OPENQUERY(linked_server, 'query'). И как так сделать чтобы в 'query' влезло открытие курсора ( но на стороне MS )??????
На стороне MSSQL курсор открывается с помощью DECLARE CURSOR
31 окт 05, 16:47    [2024185]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Parkhomets Andrey
pkarklin
Ну так вы зе запрос к ораклу будете отправлять и он должен быть в синтаксисе оракл, а не мс скл.


Гениально.


Как я понимаю MS к Ораклу может обратится по средствам OPENQUERY(linked_server, 'query'). И как так сделать чтобы в 'query' влезло открытие курсора ( но на стороне MS )??????
Конечно можно извратится через OPENQUERY(linked_server, 'select f(counter) from dual'), где f(counter) - функция в Оракле, которая построчно вытягивает строки( хотя меня такая функция смущает ).
автор


Зачем Вам курсор. Почему бы просто не послать в цикле запрос вида

INSERT INTO SomeTable
SELECT * FROM
OPENQUERY(linked_server, 'select * from ActualTable WHERE ROWID BETWEEN 1 AND 10000')
31 окт 05, 16:54    [2024229]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
pkarklin
Parkhomets Andrey
pkarklin
Ну так вы зе запрос к ораклу будете отправлять и он должен быть в синтаксисе оракл, а не мс скл.


Гениально.


Как я понимаю MS к Ораклу может обратится по средствам OPENQUERY(linked_server, 'query'). И как так сделать чтобы в 'query' влезло открытие курсора ( но на стороне MS )??????
Конечно можно извратится через OPENQUERY(linked_server, 'select f(counter) from dual'), где f(counter) - функция в Оракле, которая построчно вытягивает строки( хотя меня такая функция смущает ).
автор


Зачем Вам курсор. Почему бы просто не послать в цикле запрос вида

INSERT INTO SomeTable
SELECT * FROM
OPENQUERY(linked_server, 'select * from ActualTable WHERE ROWID BETWEEN 1 AND 10000')


И по-какому параметру делать цикл ?
31 окт 05, 17:13    [2024359]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Вот по этому: ROWID BETWEEN 1 AND 10000

Но так как OPENQUERY не поддерживает парамтеры придеться использовать динамический SQL.
31 окт 05, 17:19    [2024401]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
pkarklin
Вот по этому: ROWID BETWEEN 1 AND 10000

Но так как OPENQUERY не поддерживает парамтеры придеться использовать динамический SQL.

Не то! Потому что не получается выйграша, который даёт курсор ( открывает таблицу один раз и вытаскивает то что надо по строчно).
В Вашем же примере, вы по нескольку раз обращаемся к таблице, т.е. несколько раз читаем её полностью и ищем следующую порцию ROWID.
Это ИМХО не то, будет только тормозить.


Есть другое предложение : организовать следующее в виде функции

declare Ora_select cursor for

select @vSQLTxt=' SELECT '+@vFieldList+' FROM '
select @vSQLTxt=@vSQLTxt + ' OPENQUERY(ORA,''select ' + @vFieldList + ' from ORA_SHEMA.' + @vSrcTableName + ''' )'

только не знаю - нет ли тут логических ошибок.
31 окт 05, 17:33    [2024502]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
WiRuc
Member

Откуда: Воронеж
Сообщений: 1280
pkarklin

Зачем Вам курсор. Почему бы просто не послать в цикле запрос вида

INSERT INTO SomeTable
SELECT * FROM
OPENQUERY(linked_server, 'select * from ActualTable WHERE ROWID BETWEEN 1 AND 10000')


А чем не устраивает SELECT * INTO SomeTable FROM OPENQUERY(linked_server, 'select * from ActualTable')
31 окт 05, 17:33    [2024504]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Crimean
Member

Откуда:
Сообщений: 13148
автор
Почему бы просто не послать в цикле запрос вида
select * from ActualTable WHERE ROWID BETWEEN 1 AND 10000


ИМХО все же в цикле

top n
where id > @id
order by id
31 окт 05, 17:35    [2024526]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
WiRuc
pkarklin

Зачем Вам курсор. Почему бы просто не послать в цикле запрос вида

INSERT INTO SomeTable
SELECT * FROM
OPENQUERY(linked_server, 'select * from ActualTable WHERE ROWID BETWEEN 1 AND 10000')


А чем не устраивает SELECT * INTO SomeTable FROM OPENQUERY(linked_server, 'select * from ActualTable')


Поясню: допусти записей 100 млн. И во время загрузки отвалилась сеть.
Начинать сначала ? А зачем ведь можно организовать "пачки" и догрузить недостающие строки начиная с той, с которой произошёл сбой.
Имхо экономия времени.
31 окт 05, 17:36    [2024537]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
Не то! Потому что не получается выйграша, который даёт курсор ( открывает таблицу один раз и вытаскивает то что надо по строчно).
В Вашем же примере, вы по нескольку раз обращаемся к таблице, т.е. несколько раз читаем её полностью и ищем следующую порцию ROWID.
Это ИМХО не то, будет только тормозить.


не понял... Чтобы в оракле получить первые 10 000 записей надо "полностью прочитать" таблицу?! Что Вы не то говорите. Сам принцип OPENQUERY - это выполнение запроса на удаленном сервер и обработка тока его результатов.
31 окт 05, 17:38    [2024552]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
WiRuc
Member

Откуда: Воронеж
Сообщений: 1280
Parkhomets Andrey

Поясню: допусти записей 100 млн. И во время загрузки отвалилась сеть.
Начинать сначала ? А зачем ведь можно организовать "пачки" и догрузить недостающие строки начиная с той, с которой произошёл сбой.
Имхо экономия времени.

А, понятно, в условиях нестабильной связи это решение однозначно лучше.
31 окт 05, 17:39    [2024560]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
Crimean
автор
Почему бы просто не послать в цикле запрос вида
select * from ActualTable WHERE ROWID BETWEEN 1 AND 10000


ИМХО все же в цикле

top n
where id > @id
order by id

Согласен, без "order by id" никак не обойтись, ну лучше если сорсовая таблица изначально отсортирована, а если нет ?
Хотя я больше склонен к номеру строки - т.к. Оракл выбирает их по физическому параметру хранения на диске , а ID - это логическое название поля, соот-венно по ID будет не так быстрее, как если бы через курсор.
31 окт 05, 17:41    [2024573]     Ответить | Цитировать Сообщить модератору
 Re: Нужен совет по быстрой выборке больших таблиц из Oracle  [new]
Parkhomets Andrey
Member

Откуда: Киев
Сообщений: 282
pkarklin
автор
Не то! Потому что не получается выйграша, который даёт курсор ( открывает таблицу один раз и вытаскивает то что надо по строчно).
В Вашем же примере, вы по нескольку раз обращаемся к таблице, т.е. несколько раз читаем её полностью и ищем следующую порцию ROWID.
Это ИМХО не то, будет только тормозить.


не понял... Чтобы в оракле получить первые 10 000 записей надо "полностью прочитать" таблицу?! Что Вы не то говорите. Сам принцип OPENQUERY - это выполнение запроса на удаленном сервер и обработка тока его результатов.


Первые нет, а втрорые 10 000.

Поясню на примере : попробуйте в цыкле выбрирать строки через курсор - каждую следующую строку или пачку вы получите быстрее - нежели скажите искать с 10 001 по 20 000. По той причине , что найдя в первой пачке 10 000 -ую, сервер знает где лежит 10 001 -ая. И её не надо искать.
31 окт 05, 17:45    [2024601]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить