SQL Server - Експорт великої таблиці без первинного ключа


9

Мені потрібно синхронізувати велику таблицю ~ 500 мільйонів рядків без первинного ключа між SQL Server і MySQL. У таблиці є лише кластеризований складений неповторний індекс.

У мене є з'єднання ODBC між серверами, але імпорт ~ 8 мільйонів рядків зайняв близько 45 хвилин, тому я вважаю, що більший одиничний імпорт був би нерозумним, оскільки в будь-якій точці можуть виникати перебої. Я не можу змінити існуючу структуру таблиці, можу додати інші таблиці. Після подальшого читання зміщення / отримання не є варіантом для великих таблиць. "Виберіть ... де х між ... і ..." - це не варіант, оскільки у мене немає унікального ключа.

Як я можу експортувати таблицю партіями, які гарантовано містять усі рядки? Моя проблема полягає в тому, що, оскільки кластерний ключ не є унікальним, замовлення після нього не гарантує, що фізичні рядки мають однаковий порядок між послідовними запитами та замовленням після того, як усі стовпці займуть занадто довго. І як би ви рекомендували мігрувати партії через файли ODBC або CSV?


Це буде повторювана (узуальна операція) чи разова операція?
Богдан Богданов

Початковий експорт буде одноразовим, зміни синхронізації, як нові записи чи оновлення, повинні повторюватися. CDC не є варіантом, але буде досліджено далі після початкової міграції.
ніхто

Я думаю, щоб отримати допомогу з цього питання, ви повинні більш детально пояснити весь процес (схоже, у вас дуже складна проблема)
Богдан Богданов

Ви зазначаєте, "оскільки кластерний ключ не є унікальним, впорядкування після нього не гарантує, що фізичні рядки мають однаковий порядок між послідовними запитами". Оскільки порядок рядків не зберігається (якщо у вас немає даних про послідовність), ви не можете розраховувати на отримання того ж фізичного порядку рядків. Порядок рядків не є за замовчуванням ні порядком вставки, ні порядком індексу, але визначається пунктом ORDER BY .
RLF

Так, RLF, я згоден. У стовпцях є всі вставки, A, B, C, D, E. Клавішний клавіша знаходиться на ABC. Комбінація ABC не є унікальною, ні комбінація ABCD. Чи дозволить "замовити" не унікальні стовпці, щоб експортувати всю таблицю партіями? А Богдан Бодганов, платформа Stack відлякує складні проблеми, краще просто вирішити питання. Як експортувати повну велику таблицю якомога швидше партіями без втрати рядків?
ніхто

Відповіді:


0

Якщо припустимо, що у вас немає оновлень або видалень з вихідної таблиці, ви можете спробувати наступне:
1. Створіть копію існуючої таблиці за допомогою синтаксису CTAS (для SQLServer це SELECT * into source_table_copy FROM source_table). Така операція дуже швидка навіть для величезних столів.
2. Додайте after insertтригер на source_tableцю копію до нового запису [s] source_table_copy.
3. Тепер, коли source_tableпереходять усі нові записи source_table_copy, і ви можете переміщувати дані з скопійованої таблиці в Mysql партіями. Наприклад, якщо у вас є зв'язок між двома серверами, все можна зробити в тілі зберігається TSQL процедури.
Наприклад, фрагмент коду, який переміщує до 20 записів на новий сервер, може виглядати так

 --declare table variable to keep deleted records until they delivered to target host 
  BEGIN TRANSACTION;
  DELETE TOP (20) FROM source_table_copy OUTPUT DELETED.* INTO @Table_Var;

  --insert data into linked server , or to csv file
  COMMIT; 

Можна також використовувати CURSOR для читання даних, а потім видалити за допомогою where current ofпункту.

** В ідеалі вам потрібно не допустити, щоб додатки вставляли дані під source_tableчас кроку 1. Якщо це абсолютно неможливо, я перейду з after insertтригером, який додається безпосередньо перед кроком 1 та видаляється одразу після того, як він буде виконаний, який копіює дані в іншу таблицю, яку я можу пізніше злиття з source_table_copy.


Дякую за рішення, я також щось намагався, проте з нормальною вставкою. Я спробую синтаксис CTAS, щоб побачити, чи прискорює роботу. Наступне запитання, якщо ви не заперечуєте: чи вплине "тригер після вставки" на виступи?
ніхто

Оскільки корпус тригера дуже простий (просто вставити дані в іншу таблицю), вплив на продуктивність буде мінімальним.
a1ex07
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.