{"id":47204,"date":"2026-09-29T21:37:18","date_gmt":"2026-09-29T19:37:18","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=47204"},"modified":"2026-09-29T21:37:20","modified_gmt":"2026-09-29T19:37:20","slug":"archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/","title":{"rendered":"Archiving 5 TB from Oracle into SQL Server: a migration logbook (part 1)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">680,000 rows in 863 seconds. That is 788 rows per second, and the table I was loading holds 229,881,717 of them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eighty-one hours. For one table. There were five more behind it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SSMA is well documented but migrations at this scale are not done often enough to have plenty of materials. Most of what you find is either a step-by-step guide against a sample database, or a vendor case study with no numbers in it. This post has the numbers, in the order I actually got them, including the ones I got wrong first.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To keep my sanity through a long and intricate migration, I kept a logbook. This first part is about getting the data across: the brief, the type negotiation, and the settings that took the load from 788 rows per second to 42,170. Part 2 picks up exactly where this one stops, with 3.2 TB sitting in heaps and not a single index on it.<\/p>\n\n\n\n<h2 id=\"h-day-1-the-brief-and-the-one-sentence-that-mattered\" class=\"wp-block-heading\">Day 1. The brief, and the one sentence that mattered<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An Oracle 19c production database running an asset management package, to be archived into SQL Server 2025 Standard Edition. Roughly 5,600 tables, 4,800 views, a little under 5 TB depending on how you count (more on that later).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Three facts shaped everything that followed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The target is<strong><span style=\"text-decoration: underline\"> read-only<\/span><\/strong>. Nothing will ever write to it once the load is finished, because the whole point of the exercise is to keep fifteen years of records available to people who need to look something up rather than to keep an application running. Auditors come by, rarely and unpredictably, to find one specific row.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is the entire performance requirement, and it decided more of this project than any measurement did. It is why the indexes are broad rather than targeted at known queries, why PAGE compression costs nothing here, why 25,000 triggers went straight in the bin, and why two views that take thirty seconds are perfectly acceptable. Every one of those decisions comes back later in this series.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The freeze has no deadline. This is unusual enough to state plainly. Most migrations are built around a cutover window measured in hours, and every technical decision bends to it. Here the source was frozen since the beginning and simply stayed frozen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The data travels in two hops, which becomes the story of the whole load:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"171\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-43.png\" alt=\"\" class=\"wp-image-47208\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-43.png 1024w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-43-300x50.png 300w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-43-767x128.png 767w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 id=\"h-getting-in-without-asking-for-the-keys\" class=\"wp-block-heading\">Getting in without asking for the keys<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The source is critical production, so the migration account got the minimum that actually works: <code>CREATE SESSION<\/code>, dictionary read, and <code>SELECT <\/code>on the tables in scope.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">SSMA also asks for <code>CREATE ANY PROCEDURE<\/code>, <code>CREATE ANY TYPE<\/code> and <code>CREATE ANY TRIGGER<\/code>. Those three serve server-side extraction and SSMA\u2019s own testing feature and at the end of the project a single <code>DROP USER &lt;user_name&gt; CASCADE<\/code> removes the whole thing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is a decision hiding here that is worth making deliberately.<code> SELECT ANY TABLE<\/code> is convenient and gives your account read access to the entire database, including schemas you are not migrating. Granting <code>SELECT <\/code>table by table on the schemas in scope is more work and produces an auditable perimeter.<\/p>\n\n\n\n<h2 id=\"h-day-2-negotiating-with-numbers\" class=\"wp-block-heading\">Day 2. Negotiating with numbers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We agreed the type mapping with the client before converting anything, which I recommend for the political reasons as much as the technical ones:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Oracle<\/th><th>SQL Server<\/th><\/tr><\/thead><tbody><tr><td>NUMBER(38) to NUMBER(*)<\/td><td>FLOAT<\/td><\/tr><tr><td>NUMBER(19) to NUMBER(38)<\/td><td>DECIMAL[19-38]<\/td><\/tr><tr><td>NUMBER(11) to NUMBER(18)<\/td><td>BIGINT<\/td><\/tr><tr><td>NUMBER(5) to NUMBER(10)<\/td><td>INT<\/td><\/tr><tr><td>NUMBER(1) to NUMBER(4)<\/td><td>SMALLINT<\/td><\/tr><tr><td>DATE<\/td><td>DATETIME2(0)<\/td><\/tr><tr><td>XMLTYPE<\/td><td>XML<\/td><\/tr><tr><td>VARCHAR2(n CHAR)<\/td><td>NVARCHAR(n)<\/td><\/tr><tr><td>CHAR(n CHAR)<\/td><td>NCHAR(n)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 id=\"h-38-digits-against-51\" class=\"wp-block-heading\">38 digits against 51<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Then the conversions started failing on decimal overflow, and the reason is more interesting than &#8220;<em>the numbers were too big<\/em>&#8220;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle <code>NUMBER <\/code>without precision is a <strong>floating decimal:<\/strong> 38 significant digits, with an exponent range running from 1e-130 to just under 1e126. SQL Server <code>DECIMAL <\/code>is <strong>fixed point<\/strong>: the precision bounds the magnitude. <code>DECIMAL(38,0)<\/code> stops at 1e38 and there is no exponent to escape with.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So the values that broke were not unusually precise, they were unusually <em>large<\/em>. A value carrying 51 digits and two significant figures is perfectly ordinary in Oracle, sails through every constraint it meets on the way out, and then has no <code>DECIMAL <\/code>representation waiting for it at the other end.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The answer is <code>FLOAT<\/code>, which is also a floating type and reaches \u00b11.79e308. Eleven tables were reloaded after switching the mapping.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><span style=\"text-decoration: underline\">Be careful<\/span><\/strong> what you promise the client here, because <code>FLOAT <\/code>keeps <span style=\"text-decoration: underline\">15 significant digits, not 38<\/span>. For the values that actually overflowed, large magnitude and few significant figures, the loss is zero. For a value in those columns carrying more than 15 significant digits, the loss is real. That is countable rather than arguable, so count it before you write the reassuring email.<\/p>\n\n\n\n<h3 id=\"h-25-000-triggers-none-converted\" class=\"wp-block-heading\">25,000 triggers, none converted<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The source carried roughly 25,000 triggers, almost all in one schema. I converted none of them and unticked them all before <em>Convert Schema<\/em>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The reasoning fits in one line: on a read-only database, a trigger never fires. Converting and testing 25,000 objects that will never execute would have consumed weeks and produced nothing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tables went first, with their types and sequences, to unblock the data migration. Packages, views and procedures came later. Indexes are not a separate step: SSMA converts them alongside their table, turning bitmap indexes into nonclustered ones, handling function-based indexes case by case, and skipping <code>XMLTYPE <\/code>indexes entirely.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then 103 tables failed extraction with <code>ORA-00904<\/code>, all because of hidden <code>SYS_C\u2026$<\/code> columns left behind by function-based indexes. I had already set &#8220;<em>Ignore hidden system columns<\/em>&#8221; to <code>Yes<\/code>, which is why this took longer than it should have: in our project that option governed schema conversion and did not stop the extraction from asking for the column. The fix is a custom select that aliases <code>NULL <\/code>into the missing name (see my <a href=\"https:\/\/www.dbi-services.com\/blog\/fixing-ora-00904-on-oracle-hidden-columns-during-ssma-data-migration\/\">previous blog about this problem<\/a>).<\/p>\n\n\n\n<h2 id=\"h-day-3-turning-everything-off\" class=\"wp-block-heading\">Day 3. Turning everything off<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The loading method is three switches and a recovery model.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Disable the nonclustered indexes. A disabled index stores nothing and is not maintained row by row during the load.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Disable the foreign keys with <code>NOCHECK CONSTRAINT<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Drop the clustered primary keys on the largest tables and load into heaps.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then set the recovery model to <code>SIMPLE<\/code>. With heaps and bulk insert, logging is already minimal.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The script that does this across every schema needs to be restartable and needs to log what it did. A load that runs for days will be interrupted, and you want to know exactly which of 22&#8217;000 indexes were disabled when it was.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Script to disable all nonclustered indexes:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: sql; title: ; notranslate\" title=\"\">\nUSE &lt;DB_NAME&gt;;  \nGO\n  \n  \nIF OBJECT_ID(N&#039;tempdb..#Schemas&#039;) IS NOT NULL DROP TABLE #Schemas;\nCREATE TABLE #Schemas (schema_name sysname PRIMARY KEY);\n  \nINSERT INTO #Schemas (schema_name) VALUES (N&#039;&lt;SCHEMA_NAME&gt;&#039;); --Insert your schema name here\n    ;\n  \nSELECT schema_name AS schemas_a_traiter FROM #Schemas;\nGO\n  \n  \n-- Disable all NC Indexes\n \nSET NOCOUNT ON;\nDECLARE @Execute bit = 0;   -- 0 = preview ; 1 = execute\n  \nDECLARE @cmd nvarchar(max);\nDECLARE @n   int = 0;\n  \nDECLARE idx_cur CURSOR LOCAL FAST_FORWARD FOR\n    SELECT N&#039;ALTER INDEX &#039; + QUOTENAME(i.name)\n         + N&#039; ON &#039; + QUOTENAME(s.name) + N&#039;.&#039; + QUOTENAME(t.name)\n         + N&#039; DISABLE;&#039;\n    FROM   sys.indexes  i\n    JOIN   sys.tables   t ON i.object_id = t.object_id\n    JOIN   sys.schemas  s ON t.schema_id = s.schema_id\n    WHERE  s.name IN (SELECT schema_name FROM #Schemas)\n      AND  i.type_desc            in (N&#039;NONCLUSTERED&#039;) \n      AND  i.is_disabled          = 0                \n    ORDER BY s.name, t.name, i.name;\n  \nOPEN idx_cur;\nFETCH NEXT FROM idx_cur INTO @cmd;\nWHILE @@FETCH_STATUS = 0\nBEGIN\n    SET @n += 1;\n    PRINT @cmd;\n    IF @Execute = 1\n    BEGIN\n        BEGIN TRY\n            EXEC sys.sp_executesql @cmd;\n        END TRY\n        BEGIN CATCH\n            PRINT N&#039;   -- ECHEC : &#039; + ERROR_MESSAGE();\n        END CATCH\n    END\n    FETCH NEXT FROM idx_cur INTO @cmd;\nEND\nCLOSE idx_cur;\nDEALLOCATE idx_cur;\n  \nPRINT N&#039;---&#039;;\nPRINT CONVERT(nvarchar(10), @n) + N&#039; index nonclustered &#039;\n    + CASE WHEN @Execute = 1 THEN N&#039;disabled.&#039; ELSE N&#039;te be disabled (preview).&#039; END;\nGO\n  \n  \n----------------------------------------------\n \n \nSET NOCOUNT ON;\nDECLARE @Execute bit = 0;   -- 0 = preview ; 1 = executer\n  \nDECLARE @cmd nvarchar(max);\nDECLARE @n   int = 0;\n  \nDECLARE fk_cur CURSOR LOCAL FAST_FORWARD FOR\n    SELECT N&#039;ALTER TABLE &#039; + QUOTENAME(s.name) + N&#039;.&#039; + QUOTENAME(t.name)\n         + N&#039; NOCHECK CONSTRAINT &#039; + QUOTENAME(fk.name) + N&#039;;&#039;\n    FROM   sys.foreign_keys fk\n    JOIN   sys.tables  t ON fk.parent_object_id = t.object_id\n    JOIN   sys.schemas s ON t.schema_id = s.schema_id\n    WHERE  s.name IN (SELECT schema_name FROM #Schemas)\n      AND  fk.is_disabled = 0;\n  \nOPEN fk_cur;\nFETCH NEXT FROM fk_cur INTO @cmd;\nWHILE @@FETCH_STATUS = 0\nBEGIN\n    SET @n += 1;\n    PRINT @cmd;\n    IF @Execute = 1\n    BEGIN\n        BEGIN TRY EXEC sys.sp_executesql @cmd; END TRY\n        BEGIN CATCH PRINT N&#039;   -- FAILED: &#039; + ERROR_MESSAGE(); END CATCH\n    END\n    FETCH NEXT FROM fk_cur INTO @cmd;\nEND\nCLOSE fk_cur;\nDEALLOCATE fk_cur;\n  \nPRINT N&#039;---&#039;;\nPRINT CONVERT(nvarchar(10), @n) + N&#039; FK &#039;\n    + CASE WHEN @Execute = 1 THEN N&#039;disabled.&#039; ELSE N&#039;to be disabled (preview).&#039; END;\nGO \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">There is a second script that puts all of this back, with PAGE compression, once the data is in. It belongs with the rebuild rather than with the load, so it is in part 2.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Day 4. \u00d753, on the same architecture<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The first load ran <strong>client-side<\/strong>: the hop server reads from Oracle and writes to SQL Server.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On the SQL Server side the dominant wait was <code>ASYNC_NETWORK_IO<\/code>, which is the engine telling you it has finished its work and is sitting there waiting for the next batch to arrive. Meanwhile CPU and memory on the hop VM stayed low throughout. Nothing anywhere in the chain was short of power; the pipeline was simply underfed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The answer for this was not a different architecture (with for example a linked server directly from Oracle to SQL Server), it was three settings on the one I already had.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Load into heaps with the nonclustered indexes disabled. Parallelise <strong>across tables<\/strong>, not within one, which is the part most people have backwards about SSMA: Thread Count 14 with <code>Table lock = No<\/code>, because <code>TABLOCK <\/code>plus multithreading deadlocks. Batch size at 200&#8217;000.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Measured with the two-timestamp method: <strong>7,000,000<\/strong> <strong>rows in 166 seconds, about 42,170 rows per second<\/strong>. Against 788, that is \u00d753.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is worth being explicit about why write-side changes fixed a network wait, because the two do not obviously connect. Of the three levers only one touches writing. Parallelising across tables fills a pipe that was carrying a single stream and fast writes remove the back-pressure that was leaving the sender idle.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"598\" height=\"348\" src=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-44.png\" alt=\"\" class=\"wp-image-47228\" srcset=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-44.png 598w, https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-44-300x175.png 300w\" sizes=\"auto, (max-width: 598px) 100vw, 598px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Two volumetry traps<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ranking tables by <code>dba_segments <\/code>with <code>segment_type = 'TABLE' <\/code><strong>ignores LOBs<\/strong>, which live in their own segment. One table that looked unremarkable carried 123 GB of LOB. Redo the ranking with LOB segments included before you plan anything. And row count does not rank the same way as volume. One table held 2.8 billion rows in 67 GB. Another held a tenth of that in fourteen times the space.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What I would tell the next person, about the load<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The bottleneck was the feed rate rather than the hardware. 788 rows per second, with <code>ASYNC_NETWORK_IO <\/code>at the top of the wait list, on a chain where nothing was short of CPU or memory. Three settings took it to 42,170: heaps, disabled indexes and parallelism across tables. Reach for the settings before you reach for a new architecture, because the new architecture takes a week to build and may not be the thing that was slow.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">On types, the failure was one of magnitude and not of precision, which is worth knowing before you try to diagnose it. Oracle <code>NUMBER <\/code>is a floating decimal whose exponent runs far past anything <code>DECIMAL <\/code>can address, so a value with 51 digits and two significant figures breaks a conversion that a value with 38 significant digits survives without trouble. And when you move those columns to <code>FLOAT<\/code>, count what you are actually giving up before you write the email saying nothing was lost.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">At this point the data is across and the database is useless. Every nonclustered index is disabled, the largest tables have no primary key, the foreign keys are off, and none of the four thousand views compile. <strong>Part 2<\/strong> is about putting all of that back.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Loading 5 TB from Oracle into SQL Server with SSMA: type overflows, heaps, and the settings that took 788 rows\/s to 42,170.<\/p>\n","protected":false},"author":157,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":"","_members_access_role":[],"_members_access_error":""},"categories":[198,59,99],"tags":[],"type_dbi":[],"class_list":["post-47204","post","type-post","status-publish","format-standard","hentry","category-database-management","category-oracle","category-sql-server"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.5 (Yoast SEO v28.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Archiving 5 TB from Oracle into SQL Server: a migration logbook (part 1) - dbi Blog<\/title>\n<meta name=\"description\" content=\"Loading 5 TB from Oracle into SQL Server with SSMA: type overflows, heaps, and the settings that took 788 rows\/s to 42,170.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Archiving 5 TB from Oracle into SQL Server: a migration logbook (part 1)\" \/>\n<meta property=\"og:description\" content=\"Loading 5 TB from Oracle into SQL Server with SSMA: type overflows, heaps, and the settings that took 788 rows\/s to 42,170.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-29T19:37:18+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-29T19:37:20+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-43.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"171\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Louis Tochon\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Louis Tochon\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/\"},\"author\":{\"name\":\"Louis Tochon\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/e4195b0cb120295b3407a502c23e75b6\"},\"headline\":\"Archiving 5 TB from Oracle into SQL Server: a migration logbook (part 1)\",\"datePublished\":\"2026-09-29T19:37:18+00:00\",\"dateModified\":\"2026-09-29T19:37:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/\"},\"wordCount\":1549,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/09\\\/image-43.png\",\"articleSection\":[\"Database management\",\"Oracle\",\"SQL Server\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/\",\"name\":\"Archiving 5 TB from Oracle into SQL Server: a migration logbook (part 1) - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/09\\\/image-43.png\",\"datePublished\":\"2026-09-29T19:37:18+00:00\",\"dateModified\":\"2026-09-29T19:37:20+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/e4195b0cb120295b3407a502c23e75b6\"},\"description\":\"Loading 5 TB from Oracle into SQL Server with SSMA: type overflows, heaps, and the settings that took 788 rows\\\/s to 42,170.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/09\\\/image-43.png\",\"contentUrl\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/2\\\/2026\\\/09\\\/image-43.png\",\"width\":1024,\"height\":171},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Archiving 5 TB from Oracle into SQL Server: a migration logbook (part 1)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/e4195b0cb120295b3407a502c23e75b6\",\"name\":\"Louis Tochon\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g\",\"caption\":\"Louis Tochon\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/louistochon\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Archiving 5 TB from Oracle into SQL Server: a migration logbook (part 1) - dbi Blog","description":"Loading 5 TB from Oracle into SQL Server with SSMA: type overflows, heaps, and the settings that took 788 rows\/s to 42,170.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/","og_locale":"en_US","og_type":"article","og_title":"Archiving 5 TB from Oracle into SQL Server: a migration logbook (part 1)","og_description":"Loading 5 TB from Oracle into SQL Server with SSMA: type overflows, heaps, and the settings that took 788 rows\/s to 42,170.","og_url":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/","og_site_name":"dbi Blog","article_published_time":"2026-09-29T19:37:18+00:00","article_modified_time":"2026-09-29T19:37:20+00:00","og_image":[{"width":1024,"height":171,"url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-43.png","type":"image\/png"}],"author":"Louis Tochon","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Louis Tochon","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/"},"author":{"name":"Louis Tochon","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/e4195b0cb120295b3407a502c23e75b6"},"headline":"Archiving 5 TB from Oracle into SQL Server: a migration logbook (part 1)","datePublished":"2026-09-29T19:37:18+00:00","dateModified":"2026-09-29T19:37:20+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/"},"wordCount":1549,"commentCount":0,"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-43.png","articleSection":["Database management","Oracle","SQL Server"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/","url":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/","name":"Archiving 5 TB from Oracle into SQL Server: a migration logbook (part 1) - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/#primaryimage"},"image":{"@id":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/#primaryimage"},"thumbnailUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-43.png","datePublished":"2026-09-29T19:37:18+00:00","dateModified":"2026-09-29T19:37:20+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/e4195b0cb120295b3407a502c23e75b6"},"description":"Loading 5 TB from Oracle into SQL Server with SSMA: type overflows, heaps, and the settings that took 788 rows\/s to 42,170.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/#primaryimage","url":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-43.png","contentUrl":"https:\/\/www.dbi-services.com\/blog\/wp-content\/uploads\/sites\/2\/2026\/09\/image-43.png","width":1024,"height":171},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/archiving-5-tb-from-oracle-into-sql-server-a-migration-logbook-part-1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Archiving 5 TB from Oracle into SQL Server: a migration logbook (part 1)"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/e4195b0cb120295b3407a502c23e75b6","name":"Louis Tochon","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ce0ee48c64e763e6c4076e21c80729d15bc4493288aeb8695125c69082100e10?s=96&d=mm&r=g","caption":"Louis Tochon"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/louistochon\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/47204","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/157"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=47204"}],"version-history":[{"count":28,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/47204\/revisions"}],"predecessor-version":[{"id":47234,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/47204\/revisions\/47234"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=47204"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=47204"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=47204"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=47204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}