Skip to main content
Version: 1.4 (Latest)

Release Notes 1.4

New Features​

New Parallel Method — Physical​

The new --parallelmethod Physical splits a table on the physical row location of the source engine. You no longer need to know which engine-specific method applies: FastBCP picks it from the connection type.

SourceConnection typesResolved strategy
PostgreSQLpgsql, pgcopy, adbc_pgsqlCtid
Oracleoraodp, adbc_oracleRowid
SQL Servermssql, msoledbsql, adbc_mssqlPhysloc
Netezzanzsql, nzcopy, nzoledb, adbc_netezzaNZDataSlice
  • --sourceschema and --sourcetable are required. --query can be added to filter the table (simple query with a WHERE clause). --distributekeycolumn is not used.

  • Any other source (odbc, oledb, mysql, clickhouse, hana, teradata, adbc_teradata) stops with an explicit error. With odbc and oledb, the error asks for a native connection type, because FastBCP cannot know which engine is behind the driver.

  • The resolved strategy is logged:

    Distribute Method : Physical (Ctid)
  • OpenTelemetry spans carry the resolved method in fastbcp.method. When Physical was resolved, the new fastbcp.method.requested tag holds Physical.

.\FastBCP.exe `
--connectiontype pgsql `
--server "localhost:5432" `
--database "tpch" `
--user "FastUser" `
--password "FastPassword" `
--sourceschema "tpch_10" `
--sourcetable "orders" `
--directory "D:\export\orders" `
--fileoutput "orders.parquet" `
--parallelmethod Physical `
--paralleldegree 8

See Parallel Parameters for more details.

ADBC Teradata — -C adbc_teradata​

FastBCP now reads Teradata through the embedded ArpeTeradata ADBC driver, via the new -C adbc_teradata connection type. The driver is used for both the metadata step and the data step, with the Teradata SQL dialect: every parallel method of -C teradata works (Random, Ntile, DataDriven, RangeId, Timepartition, and DBPartition on PPI tables).

Key highlights:

  • Parquet output only, like the other adbc_* connection types
  • Windows x64 and Linux x64 only
  • Connection with --server host[:port] (legacy port, default 1025), --user, --password and an optional --database, or a --sourceconnectstring in the Teradata provider spelling (Server, Port, Database, User Id, Password, SSL Mode, HTTPS Port, TMODE, TTU Path, …). Explicit adbc.arpeteradata.* keys win.
  • Trusted authentication (-A / --trusted) is not supported
  • The default logon (sslmode=prefer) uses TLS on the HTTPS port (443) and needs no Teradata client software. When the server has no TLS, or with SSL Mode=disable, the driver uses the legacy port through the customer's Teradata Tools and Utilities (TTU). The legacy port works on Linux and on Windows.
  • Logon mechanisms (logmech, ArpeTeradata 0.3.4): LDAP, JWT, KRB5 and TDNEGO. JWT and Kerberos work over TLS, without TTU.

TTU for the legacy-port logon:

  • Linux: FastBCP looks for TTU in the new FASTBCP_TTU_PATH environment variable, then in a ttu or TeradataToolsAndUtilitiesBase directory next to the FastBCP binary. When nothing is found, the driver searches itself (ARPETERADATA_TTU_PATH, /opt/teradata/client, the system library path). Teradata's TTU download can be unpacked next to the binary without installing it (see FASTBCP_TTU_PATH). FastBCP warns at startup when the TTU folder lacks tdclientdir or the ICU links, or when the client directory is not named after its version.
  • Windows: the driver finds wincli32.dll itself (ARPETERADATA_TTU_PATH, its own directory, the registered TTU installation).
.\FastBCP.exe `
--connectiontype adbc_teradata `
--server "td-host" `
--database "TPCH" `
--user "FastUser" `
--password "FastPassword" `
--sourceschema "TPCH" `
--sourcetable "ORDERS" `
--directory "D:\export\orders" `
--fileoutput "orders.parquet" `
--parallelmethod Ntile `
--distributekeycolumn "o_orderkey" `
--paralleldegree 8

See Connection Parameters for more details.

Deprecations​

Ctid, Rowid, Physloc and NZDataSlice​

The engine-specific values Ctid, Rowid, Physloc and NZDataSlice are deprecated and will be removed in FastBCP 2.0. Use --parallelmethod Physical instead: it resolves to the same strategy from the connection type.

They are still accepted. FastBCP runs the export as before and logs a warning:

Parallel method Ctid is deprecated and will be removed in 2.0 ==> use --parallelmethod Physical

Behaviour Changes​

Physloc and Rowid Require --sourceschema and --sourcetable​

Like Ctid, the Physloc and Rowid methods, used directly or through Physical, now require --sourceschema and --sourcetable. Without them, FastBCP stops at the parameter check:

ERROR in command line parameters : With Physical (Physloc) Method you must define source schema (--sourceschema) and source table (--sourcetable) ==> With Physical (Physloc) Method --sourceschema and --sourcetable are both mandatory

Before 1.4, Rowid crashed when they were missing. A Physloc export based on --query alone must now also give the schema and table.

ArpeOracle 0.4.1 Security Defaults (-C adbc_oracle)​

  • TCPS now verifies the server certificate by default.
  • Kerberos no longer forwards the TGT unless krb5_forward=true is set, and requires mutual authentication.
  • Token and OAuth2 logons require TCPS.

--help​

  • -?, --help is now listed in the usage.
  • --help, /? and /help now behave like -?: they print the usage only, without the banner, and exit with code 0. Before, they printed the usage, then the banner and four ERROR in command line parameters lines, and exited with code 1.

Physloc Distribution​

  • Even chunks on rowstore tables: the distribute key is now the two low bytes of the page id. The previous key was a multiple of 256 for most page ids, so with an even degree of parallelism (2, 4, 8, …) most chunks stayed empty and a single chunk did the work. Runs of 256 pages now go to each chunk.
  • Clustered columnstore tables: %%physloc%% is a row id there, not a page address, so the rowstore key was the same for every row. FastBCP now detects a clustered columnstore index on --sourceschema.--sourcetable and splits on the whole row id. This is logged as Physloc : <schema>.<table> is a clustered columnstore, splitting on the columnstore row id. If the check fails, FastBCP logs a warning and uses the rowstore key.

Improvements​

  • Physloc is 1.6× to 2.6× faster at even degrees of parallelism, thanks to the new Physloc distribution. At degree 8 on a 60M-row heap, the export went from 126 s to 48 s.
  • Timepartition load balancing: partition discovery now returns the row count of each partition, with no extra scan. Partitions are then exported biggest first through a shared queue, instead of a static round-robin.
  • Timepartition with quoted or case-sensitive date columns: columns such as "OrderDate" or [OrderDate] now work.

Bug Fixes​

  • Physloc only parallelised with an odd --paralleldegree: with a degree of 2, 4, 8 or 16, one chunk held every row and the other workers exported nothing; with 6 or 12, only three chunks got rows. Fixed by the new Physloc distribution: on rowstore tables, the chunks stay within 3% of even up to degree 192.
  • Random and Physloc row counts: the rows of each chunk were counted in a variable shared by the concurrent chunks, so the per-chunk log lines and the final Total data rows were wrong. Each chunk now counts its own rows.
  • Ntile dropped rows with sub-millisecond timestamp keys: this affected SQL Server datetime2(4..7), PostgreSQL timestamp and Oracle TIMESTAMP(4..9). Chunk bounds were truncated to milliseconds, so rows past a truncated bound were silently skipped. Chunks now share their boundaries, so every row lands in exactly one chunk whatever its precision. A bucket whose minimum is NULL no longer throws, and numeric bounds no longer depend on the regional settings (no more 1,5 with fr-FR).
  • Source filter with OR: the predicate added by a parallel method was not parenthesized. For example, WHERE a = 1 AND k < x OR k IS NULL exported rows with a NULL key outside the source filter. This affected every method that rewrites the WHERE clause, only when the filter contained an OR.
  • Timepartition skipped rows with a NULL date: they are now exported to a <column>=NULL directory.
  • Timepartition with week granularity duplicated rows: the week predicate now combines the date range with exact year/week filters, on every engine (SQL Server, PostgreSQL, Netezza, MySQL, Oracle, SAP HANA, Teradata, ClickHouse). Partition row counts are 64-bit (COUNT_BIG(*) on SQL Server).
  • Performance Output Files Size and Disk Write Throughput showed unknown with DataDriven, Timepartition and DBPartition, which write into partition subdirectories. The size now covers every file written by the run, and still ignores unrelated files already in the directory.

Dependencies​

ComponentVersion
.NET packages10.0.13
Microsoft.Data.SqlClient7.1.1
SAP HANA .NET driver2.30.27 (Sap.Data.Hana.Net.v10.0, native client libraries from SAP HANA Client 2.30.27)
ArpeMSSQL ADBC driver0.7.6 (reads sql_variant and the SQL Server 2025 JSON type; an unreadable column no longer drops the connection)
ArpePGSQL ADBC driver0.4.7
ArpeOracle ADBC driver0.4.1
ArpeNetezza ADBC driver0.3.7
ArpeTeradata ADBC driver0.3.4 (new)
AdbcFileExport0.5.4
AWSSDK.S34.0.104.4
Azure.Storage.Files.DataLake12.28.0

Documentation​

Copyright © 2026 Architecture & Performance.