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

Откуда:
Сообщений: 202
Прошу сильно не ругать, я с sql server знакома не очень хорошо.
У меня возникла задача: периодически переносить данные из view на одном сервере в таблички на другом.
Некоторые view - очень сложные, возвращают больше, чем по миллиону строк и очень не быстрые.

Я попробовала сделать так на сервере куда переносят данные:
insert into [load].[operations_in] with (tablock) Select * from [server1].[db_transfert].[load].[operations2017]

Все индексы, кроме кластерного в таблице-приемнике отключила.
Жду уже битый час, оно никак не вставится.
Раньше, когда и операционная база, и база статистики были на одном сервере, такая конструкция работала довольно быстро, всего минут 15.
Записей вставляется много, около 20 миллионов, но табличка по размеру небольшая, 400 мегабайт может быть.

Подскажите, как можно это всё убыстрить? Желательно, чтобы я код могла в процедуру вставить, а то таких представлений у меня очень много, и делать на каждый ssis-пакет очень долго. И я не умею, мне придется либо просить, либо учить, а ни то, ни другое не вариант сейчас.
Я перерыла всё что могла, но по словам bulk insert везде только ссылка на bcp или вставку одиночных файлов или из текстовых файлов.
Неужели нельзя ничего сделать?!
26 окт 17, 18:14    [20903742]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7757
iii2,

создайте пакет SSIS, там есть хитрая bulk вставка, которая недоступна для программиста.
В простейшем случае использовать мастер импорта-экспорта.
26 окт 17, 18:20    [20903759]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
iii2
Желательно, чтобы я код могла в процедуру вставить, а то таких представлений у меня очень много, и делать на каждый ssis-пакет очень долго.
А можно выделить большие представления, и их в SSIS пакет? А остальное insert select?
Программным путём будет действительно долго делать.
А SSIS пакет мышкой натыкать просто, не бойтесь его. Кидаете DataFlow, там указываете источник и приёмник.
26 окт 17, 23:14    [20904445]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
iii2
Прошу сильно не ругать, я с sql server знакома не очень хорошо.
У меня возникла задача: периодически переносить данные из view на одном сервере в таблички на другом.
Некоторые view - очень сложные, возвращают больше, чем по миллиону строк и очень не быстрые.

Я попробовала сделать так на сервере куда переносят данные:
insert into [load].[operations_in] with (tablock) Select * from [server1].[db_transfert].[load].[operations2017]

Все индексы, кроме кластерного в таблице-приемнике отключила.
Жду уже битый час, оно никак не вставится.
Раньше, когда и операционная база, и база статистики были на одном сервере, такая конструкция работала довольно быстро, всего минут 15.
Записей вставляется много, около 20 миллионов, но табличка по размеру небольшая, 400 мегабайт может быть.

Подскажите, как можно это всё убыстрить? Желательно, чтобы я код могла в процедуру вставить, а то таких представлений у меня очень много, и делать на каждый ssis-пакет очень долго. И я не умею, мне придется либо просить, либо учить, а ни то, ни другое не вариант сейчас.
Я перерыла всё что могла, но по словам bulk insert везде только ссылка на bcp или вставку одиночных файлов или из текстовых файлов.
Неужели нельзя ничего сделать?!

Вы можете подключиться студией SSMS к серверу server1, в окне запроса написать Select * from [db_transfert].[load].[operations2017], нажать кнопку, которая Вам покажет предполагаемый план построения запроса, затем скриншот сюда выложить?
50%, что у Вас слетела статистика по таблицам, которые связываются друг с другом внутри этой view "operations2017", и получаете очень длинный цикл nested loops.
И 50%, что у Вас из-за неверной статистики идет при соединении предварительная сортировка sort и связка отсортированных кусков в merge join.

Если не знаете, как выглядит студия SSMS и как посмотреть план запроса - сначала в гугл, затем ролики на ютубе, там очень наглядно.
Просто скриншот сюда выложите, кто-нибудь да посмотрит и что-нибудь полезное посоветует.
26 окт 17, 23:32    [20904496]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
iii2
Жду уже битый час, оно никак не вставится.

Далее в студии SSMS уже смотрите на сервере, куда переносят данные, в "Activity Monitor", что вообще происходит - идет ожидание первой строки на стороне сервера-источника или уже идет запись в журнал и в файл БД, просто долго из-за дисковой очереди. Это Вы сразу увидите по показанию скорости дискового обмена.
Как смотреть - тоже ролик в ютубе.
26 окт 17, 23:34    [20904505]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Andy_OLAP
Как смотреть - тоже ролик в ютубе.

Данный совет снимается, Вы ведь недавно в соседней теме смотрели онлайн обсуждение Лисеева и Гавриленко, Ваш совет "Предполагаю, что запросу не хватает индексов. Создайте покрывающий индекс по DateAndTime include (TagName), если эти поля у вас в одной таблице, из текста запрса не видно." дает понимание, что в студии SSMS Вы разбираетесь.
26 окт 17, 23:40    [20904525]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Andy_OLAP
Вы можете подключиться студией SSMS к серверу server1, в окне запроса написать Select * from [db_transfert].[load].[operations2017], нажать кнопку, которая Вам покажет предполагаемый план построения запроса.

Ой-вей, еще вспомнил, что смотреть в первую очередь.
Внутри view может быть не только join таблиц из одной базы db_transfert на сервере-источнике server1, но еще и какой-нибудь left join с linked_server.db2.view2, то есть проверяйте, данные цепляются на сервере-источнике локально перед отправкой на сервер-приемник или ждут отработки запроса еще на третьем сервере.
Использовать внутри view лучше все из одной базы, если используются куски из другой - на мой взгляд, это не кошерно.
26 окт 17, 23:47    [20904551]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1364
Andy_OLAP,

+

Ваш вангометр видимо Вас подводит, у ТС'а наверняка не включен флаг трассировки на сервере 666 который замедяет запросы и заставляет сервер срать кирпичами прогружать объемные массивы данных на лету.
Почему не предложили что именно этот вариант является корнем проблем? мне просто интересно.
27 окт 17, 00:09    [20904613]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
felix_ff
Andy_OLAP,

+

Ваш вангометр видимо Вас подводит, у ТС'а наверняка не включен флаг трассировки на сервере 666 который замедяет запросы и заставляет сервер срать кирпичами прогружать объемные массивы данных на лету.
Почему не предложили что именно этот вариант является корнем проблем? мне просто интересно.

+
Почему не предположил именно этот вариант (отсутствие флага 666)? Потому что это не кошерный вариант, поэтому и не предположил. Вы таки поймите, к серверу нужен не только научный подход, но и мощная мужская интуиция, "куда копать" в случае возможных проблем, чтобы минимизировать потери времени.
27 окт 17, 00:13    [20904626]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
iii2
Member

Откуда:
Сообщений: 202
Andy_OLAP
Andy_OLAP
Как смотреть - тоже ролик в ютубе.

Данный совет снимается, Вы ведь недавно в соседней теме смотрели онлайн обсуждение Лисеева и Гавриленко, Ваш совет "Предполагаю, что запросу не хватает индексов. Создайте покрывающий индекс по DateAndTime include (TagName), если эти поля у вас в одной таблице, из текста запрса не видно." дает понимание, что в студии SSMS Вы разбираетесь.

Это не я была. Пётр Сергеевич в отпуске, трубку не берет, и в ватсапе не отвечает. Я с его компьютера зашла.
Но да, я понимаю о чем речь.
Запрос отработал за полтора часа, а в пределах сервера работал 15 минут.
Я по плану посмотрела - вся вьюха работает на удаленном сервере, на целевом - только вставка.
Напишу админам, чтобы сетку проверили, наверное.
27 окт 17, 07:38    [20904774]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
iii2
Member

Откуда:
Сообщений: 202
Только интересно, почему то предполагаемый план показывает 10000 записей, а там 15 миллионов?
А план вьюхи, если отдельно запустить, предполагает 18 миллионов.
Статистика там свежая, у нас каждую ночь джобом пересчитывается.
27 окт 17, 08:00    [20904791]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
iii2
Member

Откуда:
Сообщений: 202
Andy_OLAP
Почему не предположил именно этот вариант (отсутствие флага 666)? Потому что это не кошерный вариант, поэтому и не предположил. Вы таки поймите, к серверу нужен не только научный подход, но и мощная мужская интуиция, "куда копать" в случае возможных проблем, чтобы минимизировать потери времени.

Я посмотрела! Никакого флага 666 в природе не существует!
А сервер стартует с флагами:
1118
3057
4199
Сервер 2014 с последними обновлениями.
27 окт 17, 08:15    [20904801]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
iii2
Andy_OLAP
Почему не предположил именно этот вариант (отсутствие флага 666)? Потому что это не кошерный вариант, поэтому и не предположил. Вы таки поймите, к серверу нужен не только научный подход, но и мощная мужская интуиция, "куда копать" в случае возможных проблем, чтобы минимизировать потери времени.

Я посмотрела! Никакого флага 666 в природе не существует!
А сервер стартует с флагами:
1118
3057
4199
Сервер 2014 с последними обновлениями.

Коллега, это мрачный мужской юмор - "у ТС'а наверняка не включен флаг трассировки на сервере 666 который замедяет запросы". Тут просто молодежь, которая придерживается мнения, что флаги это зло. Я же считаю, что жизнь обычно шире, чем узкое представление о ней, невозможно определить дефолтную конфигурацию, которая устроила бы всех, а поэтому использование флагов - это вполне кошерный вариант. И чем больше их - тем гибче вариации поведения сервера БД, тем лучше в целом для всех. Но это конечно оффтоп.
Что касается Вашего варианта - попробуйте все-таки выгрузить на server1 строки из view в файл CSV, перегнать его по сети и при это замерить скорость, а затем вставить в таблицу на сервере-приемнике. И Вы увидите наглядно слабое место с точки зрения производительности и времени выполнения всей операции в целом.
+

Возможно, молодежь умная, начитанная, но я Вам скажу по секрету - у них очень много ума и очень мало совести. Раньше я думал, что это от антисемитизма - но проблема гораздо глубже. Они трясутся от страха за свои рабочие места, поэтому увлеченно грызут друг друга. Я замечал уже не один раз - стоит дать развернутый совет, который устраивает прежде всего автора темы - обязательно придут и начнут всячески критиковать, убежден, этим такие участники форума доказывают сами себе, что бояться нечего, что все другие разработчики глупее их. Поэтому если сейчас начнется критика, зачем Петр Сергеевич включил такие флаги на сервере - не обращайте внимания, занимайтесь своей задачей и не напрягайтесь по пустякам.
27 окт 17, 09:35    [20904981]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
iii2
Только интересно, почему то предполагаемый план показывает 10000 записей, а там 15 миллионов?

а это наверное потому, что кто-то не сисадмин на линкеде,
и версия сервера пониже 2012 SP2, да?
в статистике, когда лезете с основного сервера, вам просто отказано.
27 окт 17, 09:43    [20905019]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
опубликуйте версию @@version, а заодно сообщите, как безопасность линкеда настроена:
каждый сам в себя мапится или все в одного датаридера?
вот если "все в датаридера", SSIS как раз вас и спасет, ибо полезет на сервер напрямую, а не через линкед
27 окт 17, 09:47    [20905027]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
iii2
Member

Откуда:
Сообщений: 202
Забирается отсюда:
Microsoft SQL Server 2014 (SP2-CU8) (KB4037356) - 12.0.5557.0 (X64) Oct 3 2017 14:56:10 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
А вставляется сюда:
Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64) Sep 5 2017 16:12:34 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)

А линкед сервер прицеплен от имени sa.
И запрос тоже от имени sa выполняется.
27 окт 17, 11:13    [20905509]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
iii2
линкед сервер прицеплен от имени sa.

это конечно гениально.
но моя версия точно не катит
27 окт 17, 11:15    [20905525]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
iii2
Забирается отсюда:
Microsoft SQL Server 2014 (SP2-CU8) (KB4037356) - 12.0.5557.0 (X64) Oct 3 2017 14:56:10 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
А вставляется сюда:
Microsoft SQL Server 2016 (SP1-CU5) (KB4040714) - 13.0.4451.0 (X64) Sep 5 2017 16:12:34 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600: ) (Hypervisor)

А линкед сервер прицеплен от имени sa.
И запрос тоже от имени sa выполняется.

Давайте скриншот сюда на "linked server properties" с сервера-приемника, вкладка "server options".
И в providers для SQLNCLI11 тоже скриншот на "provider options".
27 окт 17, 12:09    [20905809]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
Andy_OLAP
Давайте скриншот сюда на "linked server properties" с сервера-приемника, вкладка "server options".
И в providers для SQLNCLI11 тоже скриншот на "provider options".

вау, а что мы там надеемся увидеть?
выставленный флаг 666?
или там транслируют actual execution plan в виде киношки,
считав предполагаемый запрос из мозга товарища, открывшего свойства?
27 окт 17, 12:14    [20905822]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
iii2
Я попробовала сделать так на сервере куда переносят данные:
insert into [load].[operations_in] with (tablock) Select * from [server1].[db_transfert].[load].[operations2017]


Можно из недокументированного еще попробовать
insert into [load].[operations_in] with (tablock) Select * from [server1].[db_transfert].[load].[operations2017]
OPTION (QUERYTRACEON 8795);
27 окт 17, 12:15    [20905827]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Yasha123
Andy_OLAP
Давайте скриншот сюда на "linked server properties" с сервера-приемника, вкладка "server options".
И в providers для SQLNCLI11 тоже скриншот на "provider options".

вау, а что мы там надеемся увидеть?
выставленный флаг 666?
или там транслируют actual execution plan в виде киношки,
считав предполагаемый запрос из мозга товарища, открывшего свойства?

Выскажу экспертное мнение, что недокументированного флага trace flag 666 не существует (хотя не исключаю тестовые сборки MSSQL Server внутри Редмонда, где он присутствует, но мне об этом неизвестно).
27 окт 17, 12:18    [20905840]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
Andy_OLAP
Можно из недокументированного еще попробовать
insert into [load].[operations_in] with (tablock) Select * from [server1].[db_transfert].[load].[operations2017]
OPTION (QUERYTRACEON 8795);

обоснование-то этому на сей раз какое:
"я ратую за все недокументированное"
или же ранее прозвучавшее "в этой жизни надо попробовать все"?
27 окт 17, 12:22    [20905872]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
iii2,

хотите получить ещё хуже слушайте балабола andy c OPTION (QUERYTRACEON 8795);
27 окт 17, 12:23    [20905883]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Yasha123
Andy_OLAP
Можно из недокументированного еще попробовать
insert into [load].[operations_in] with (tablock) Select * from [server1].[db_transfert].[load].[operations2017]
OPTION (QUERYTRACEON 8795);

обоснование-то этому на сей раз какое:
"я ратую за все недокументированное"
или же ранее прозвучавшее "в этой жизни надо попробовать все"?

В качестве обоснования сошлюсь на мнение Пола Ренделла. Я ему доверяю больше, чем разработчикам MSSQL сервера.
27 окт 17, 12:25    [20905892]     Ответить | Цитировать Сообщить модератору
 Re: Как можно быстро вставить данные из представления на одном сервере в таблицу на другом?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Andy_OLAP
Yasha123
пропущено...

обоснование-то этому на сей раз какое:
"я ратую за все недокументированное"
или же ранее прозвучавшее "в этой жизни надо попробовать все"?

В качестве обоснования сошлюсь на мнение Пола Ренделла. Я ему доверяю больше, чем разработчикам MSSQL сервера.

балабол не знает про его 9 лет в разработке SQL сервера
27 окт 17, 12:28    [20905913]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить