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.