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.
| Source | Connection types | Resolved strategy |
|---|---|---|
| PostgreSQL | pgsql, pgcopy, adbc_pgsql | Ctid |
| Oracle | oraodp, adbc_oracle | Rowid |
| SQL Server | mssql, msoledbsql, adbc_mssql | Physloc |
| Netezza | nzsql, nzcopy, nzoledb, adbc_netezza | NZDataSlice |
-
--sourceschemaand--sourcetableare required.--querycan be added to filter the table (simple query with a WHERE clause).--distributekeycolumnis not used. -
Any other source (
odbc,oledb,mysql,clickhouse,hana,teradata,adbc_teradata) stops with an explicit error. Withodbcandoledb, 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. WhenPhysicalwas resolved, the newfastbcp.method.requestedtag holdsPhysical.
- Windows
- Linux
.\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
./FastBCP \
--connectiontype pgsql \
--server "localhost:5432" \
--database "tpch" \
--user "FastUser" \
--password "FastPassword" \
--sourceschema "tpch_10" \
--sourcetable "orders" \
--directory "/data/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, default1025),--user,--passwordand an optional--database, or a--sourceconnectstringin the Teradata provider spelling (Server,Port,Database,User Id,Password,SSL Mode,HTTPS Port,TMODE,TTU Path, …). Explicitadbc.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 withSSL 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,KRB5andTDNEGO.JWTand Kerberos work over TLS, without TTU.
TTU for the legacy-port logon:
- Linux: FastBCP looks for TTU in the new
FASTBCP_TTU_PATHenvironment variable, then in attuorTeradataToolsAndUtilitiesBasedirectory 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 lackstdclientdiror the ICU links, or when the client directory is not named after its version. - Windows: the driver finds
wincli32.dllitself (ARPETERADATA_TTU_PATH, its own directory, the registered TTU installation).
- Windows
- Linux
.\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
export FASTBCP_TTU_PATH=/opt/teradata/client/20.00
./FastBCP \
--connectiontype adbc_teradata \
--server "td-host" \
--database "TPCH" \
--user "FastUser" \
--password "FastPassword" \
--sourceschema "TPCH" \
--sourcetable "ORDERS" \
--directory "/data/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=trueis set, and requires mutual authentication. - Token and OAuth2 logons require TCPS.
--help
-?, --helpis now listed in the usage.--help,/?and/helpnow behave like-?: they print the usage only, without the banner, and exit with code0. Before, they printed the usage, then the banner and fourERROR in command line parameterslines, and exited with code1.
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.--sourcetableand splits on the whole row id. This is logged asPhysloc : <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
Physlocis 1.6× to 2.6× faster at even degrees of parallelism, thanks to the newPhyslocdistribution. At degree 8 on a 60M-row heap, the export went from 126 s to 48 s.Timepartitionload 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.Timepartitionwith quoted or case-sensitive date columns: columns such as"OrderDate"or[OrderDate]now work.
Bug Fixes
Physloconly 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 newPhyslocdistribution: on rowstore tables, the chunks stay within 3% of even up to degree 192.RandomandPhyslocrow counts: the rows of each chunk were counted in a variable shared by the concurrent chunks, so the per-chunk log lines and the finalTotal data rowswere wrong. Each chunk now counts its own rows.Ntiledropped rows with sub-millisecond timestamp keys: this affected SQL Serverdatetime2(4..7), PostgreSQLtimestampand OracleTIMESTAMP(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 isNULLno longer throws, and numeric bounds no longer depend on the regional settings (no more1,5withfr-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 NULLexported rows with aNULLkey outside the source filter. This affected every method that rewrites theWHEREclause, only when the filter contained anOR. Timepartitionskipped rows with aNULLdate: they are now exported to a<column>=NULLdirectory.Timepartitionwith 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 SizeandDisk Write ThroughputshowedunknownwithDataDriven,TimepartitionandDBPartition, 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
| Component | Version |
|---|---|
| .NET packages | 10.0.13 |
| Microsoft.Data.SqlClient | 7.1.1 |
| SAP HANA .NET driver | 2.30.27 (Sap.Data.Hana.Net.v10.0, native client libraries from SAP HANA Client 2.30.27) |
| ArpeMSSQL ADBC driver | 0.7.6 (reads sql_variant and the SQL Server 2025 JSON type; an unreadable column no longer drops the connection) |
| ArpePGSQL ADBC driver | 0.4.7 |
| ArpeOracle ADBC driver | 0.4.1 |
| ArpeNetezza ADBC driver | 0.3.7 |
| ArpeTeradata ADBC driver | 0.3.4 (new) |
| AdbcFileExport | 0.5.4 |
| AWSSDK.S3 | 4.0.104.4 |
| Azure.Storage.Files.DataLake | 12.28.0 |
Documentation
- Parallel Parameters:
Physicalmethod, deprecation ofCtid,Rowid,PhyslocandNZDataSlice. - Connection Parameters:
adbc_teradataconnection type. - FASTBCP_TTU_PATH: new environment variable.
- Examples: the parallel examples use
Physicalfor PostgreSQL, Oracle, SQL Server and Netezza; new Teradata examples in Other Databases.