Federated analytics

Query connected databases and files together with federated SQL

Tangents lets teams query connected Postgres, MySQL, SQLite, DuckDB files, CSV, JSON, and Parquet sources together in an on-demand DuckDB session.

Sources
Databases + files
Engine
DuckDB
Execution
On demand
Deployment
SaaS or self-hosted

Source availability, connection permissions, and the query plan determine query cost and freshness.

Illustrative architecture

Federated query instrument panel

No live executionTangent / DuckDB session

QUERY MODEL / Data read on demand · conditional filter and projection pushdown · session-side join

Stage 01 / sources

Attached relations

04 READY
  • Postgres

    ATTACHED

    orders.production

    AS pg_orders

  • MySQL

    ATTACHED

    crm.customers

    AS mysql_customers

  • SQLite

    ATTACHED

    catalog.db

    AS catalog

  • Parquet

    ATTACHED

    regions.parquet

    AS regions_file

Attach selected sources ↓

Stage 02 / Tangent core

DuckDB-backed session

SELECT region, sum(order_total) AS revenue
FROM pg_orders
JOIN mysql_customers USING (customer_id)
JOIN regions_file USING (region_id)
WHERE order_date >= current_date - 30
GROUP BY region;
SESSION
sample_tangent_07
ENGINE
DuckDB
ALIASES
04 attached
MODE
Federated

Plan and execute ↓

Stage 03 / output

Sample result set

regionrevenue
North AmericaSample $284,120
EMEASample $179,480
APACSample $94,210

SAMPLE / NO LIVE EXECUTION

3 illustrative rows returned

01 / ATTACH

Selected sources and aliases

02 / PUSHDOWN?

Filters / projections where supported

03 / READ

Columns needed for this query

04 / JOIN

Relations combined in session

DATA READ ON DEMAND / Sources are read during query execution.

CONDITIONAL PUSHDOWN / Filters and projections move toward sources where supported.

Related data often lives in separate systems: operational records in Postgres, orders in MySQL, a local SQLite file, and a working CSV from a teammate. An exploratory join should not always mean building a new pipeline before the question can be tested.

Tangents is a federated query workspace for that work. It attaches selected SyneHQ connections into a DuckDB-backed session so you can inspect their available schemas and write one source-qualified SQL query across them. Read the federated analytics documentation for the supported-source overview.

Start with the question, not a pipeline

Create a Tangent from Tangents, give the session a useful name, and select the connections that contain the records you need. The selected connections are attached to that Tangent session; they are not copied into a new warehouse as a prerequisite for the query.

No prebuilt ETL is required to run a federated query. Data does still move from sources into the query session when the plan needs it for a join, aggregate, sort, or result. Tangents plans the work with DuckDB and can push filters and projections down to sources when the connector and query shape support it, reducing the columns and rows fetched.

The practical boundary remains the sources themselves. A source must be available, its connection must allow the requested objects, and its engine must support the part of the plan assigned to it. These conditions affect what can be read, how current the result is, and how much work the query requires.

Sources that can meet in one session

Use a Tangent to combine sources such as:

  • Postgres, MySQL, SQLite, and DuckDB files.
  • CSV, JSON, and Parquet files for a working comparison.
  • Existing SyneHQ connections that have already been configured for the team.

For connection and session details, see how Tangent Lake works.

Tangents / federated analytics

Follow the question across the systems that hold the answer.

Combine connected databases and working files in a single investigation, while keeping the practical limits of each source visible.

01 / Federation

Join data across engines in one query.

Bring compatible tables into the same analysis when they share a usable key. Join behavior still depends on the connected engines and their available data.

federated query

SELECT o.region, sum(i.amount)
FROM postgres.orders o
JOIN warehouse.invoices i
  ON o.id = i.order_id
GROUP BY o.region

02 / Discovery

See the shape before you write the query.

Browse accessible schemas, tables, and fields to ground an investigation in the sources already connected. Discovery reflects the metadata each connection exposes.

available relations
metadata
postgres
public.orders
warehouse
finance.invoices
files
session.targets

03 / Attachments

Blend a file with the operational record.

Attach CSV, JSON, or Parquet to a session and compare a working file with database data. Attachments remain part of that session’s analysis context.

session attachments3 files
  • +targets.csv
  • +territories.json
  • +budget.parquet

04 / Planning

Send filters and columns to the source when supported.

Tangents can push filters and projections into connectors that support the query shape. Work that cannot be expressed by a source is planned elsewhere.

connector plan

filter: status = paidpushcolumns: region, amountpushjoin: local + remoteplan locally

05 / Working sets

Materialize a result only when it helps the work.

Keep a temporary working set for follow-up exploration instead of rebuilding the same intermediate result. Materialization is optional, not a requirement for every query.

working set

optionalquery resultsession table

06 / Connections

Work from the connections your team already uses.

Query existing governed connections, including local or on-prem routes where they are configured. Tangents does not replace the access policies of those systems.

connection catalog

  • MySQL / financeavailable
  • Postgres / operationsavailable
  • Local / on-prem gatewayavailable

Browse before composing the join

Open a Tangent card and choose Browse & Query. The schema browser shows the attached sources and the schemas, tables, and fields made available through each connection. Check names, types, and join keys before writing a query, especially when similar concepts come from different engines.

Then open the Query Console and qualify each relation with its source and schema. Clear aliases help make the join readable in review and distinguish fields with the same names.

Use the console as an investigation surface rather than assuming every compatible-looking field can be joined safely. Confirm the grain of each relation, the time window represented by the source, and whether the keys are stable enough for the comparison.

Keep source context in the SQL

Source-qualified relations make the plan easier to inspect:

connection_name.schema_name.table_name

That context matters when databases contain similarly named users, orders, or events tables. It also helps another reviewer trace a result back to the connection and objects that supplied it.

Postgres and MySQL in the same query

This official example joins users in Postgres to orders in MySQL:

SELECT u.id, u.name, SUM(o.amount) AS revenue
FROM postgres_db.public.users u
JOIN mysql_db.sales.orders o ON u.id = o.user_id
GROUP BY u.id, u.name
ORDER BY revenue DESC
LIMIT 10;

Start with a small result set while you validate the join and aggregation. The query reads the identifiers, names, order amounts, and other required data according to the plan; it does not assume that every table is transferred in full.

Bring a working file into the investigation

A file can be useful when it contains a temporary mapping, target list, or event extract that needs comparison with a connected database. For example:

SELECT u.email, c.last_login
FROM postgres_db.public.users u
JOIN read_csv_auto('https://example.com/logins.csv') c
  ON u.email = c.email;

The same pattern can apply to JSON or Parquet where the session can access the file. Treat the file location and its contents as part of the query's operating context, not as a replacement for the database's source-of-record rules.

Illustrative interface

Browse & Query

Query Console

SQLcross-source-revenue.sql
Read only sample
SELECT
  u.id,
  u.name,
  SUM(o.amount) AS revenue
FROM postgres_db.public.users u
JOIN mysql_db.sales.orders o ON u.id = o.user_id
GROUP BY u.id, u.name
ORDER BY revenue DESC
LIMIT 10;

Source work

postgres_db.public.users

Read user identifiers and names at the Postgres source.

Source work

mysql_db.sales.orders

Read order totals and user keys at the MySQL source.

Tangent session

Join, aggregate, sort, limit

Combine the bounded result set in the active query session.

● Sample query completeIllustrative elapsed time: sampleSample rows: 4 shown
No live execution

Results

Sample result grid

Illustrative cross-source query results
u.nameu.idrevenue
Sample user 01usr_sample_001Illustrative $12,480.00
Sample user 02usr_sample_002Illustrative $9,840.00
Sample user 03usr_sample_003Illustrative $7,260.00
Sample user 04usr_sample_004Illustrative $5,910.00

Illustrative results only · Materialization is preview-only

Inspect the result, then decide whether to keep it

Use the console to test the logic, inspect the result, and adjust filters or projections. The query plan determines which work can happen at a source and which data must be brought into the Tangent session to complete the operation. A broad join or aggregation can require more source work than a bounded inspection.

Materialization is optional. Create a session working set when the same intermediate result will support follow-up exploration or a repeat job; otherwise, leave the analysis federated and rerun the query when the question changes. See the materialization example for a CREATE TABLE ... AS pattern.

Operating guidance

  • Select only the connections needed for the question, and verify that their schemas and permissions are current.
  • Begin with explicit columns, selective filters, and a LIMIT; expand after checking the result and query behavior.
  • Use source-qualified names and clear aliases so the origin of each field remains visible.
  • Materialize a bounded working set only when reuse justifies it; record the source timing and query assumptions for work that will be revisited.
  • Monitor source availability and connection credentials. Tangents is available in SaaS and enterprise self-hosted deployments; use the deployment that fits the systems you need to reach.

Tangents / operating boundaries

Federation is useful when its boundaries are visible.

Tangents queries connected sources in a DuckDB session. It can push work toward a source where supported or fetch data for local session work; inspect the behavior instead of assuming either path.

  1. 01 / Source load

    A query begins with the sources you connect.

    Tangents works from configured source connections. Confirm the source is available and that its tables, schemas, and aliases are the ones you intend to query before running broader work.

  2. 02 / Network transfer

    Federation still has a network path.

    A result can require data to move between a live source and the DuckDB session. The amount, timing, and route depend on the query, the source, and the configured connection.

  3. 03 / Live-source consistency

    Live sources keep their own clocks.

    When a query spans live systems, each source can expose data at a different point in time. Treat cross-source results as a query-time view, and validate timing when consistency matters.

  4. 04 / Credentials & permissions

    Use the narrowest authority that works.

    Tangents uses the credentials and permissions configured for each connection. Apply least privilege, review who can use a connection, and rotate or revoke access through the source when needed.

  5. 05 / Connectors & versions

    Source behavior is connector-specific.

    Available capabilities can vary with the source, connector, and version. Confirm supported SQL, authentication, networking, and execution behavior for the connection you are operating.

  6. 06 / Materialization lifecycle

    Persist data only on purpose.

    A query may work against live sources or fetch data into the session. If you choose to materialize, make its ownership, refresh, access, and removal part of the operating plan.

  1. 01

    Qualify aliases

    Name the intended source and schema explicitly so the query has a clear target.

  2. 02

    Start small and limit

    Test a narrow slice before expanding the query scope or result set.

  3. 03

    Inspect the plan and results

    Review what the query proposes to do and verify the returned rows match the question.

  4. 04

    Monitor source impact

    Watch source-side load and adjust the query if the work is more expensive than intended.

  5. 05

    Materialize only intentionally

    Create a persisted copy only when its lifecycle and access boundaries are understood.

SaaS

Use Tangents in the SyneHQ workspace.

Tangents is available as a SaaS workspace experience. Configure and review each source connection for the environment where it runs.

Enterprise self-hosted

Bring the workspace closer to your network.

Enterprise self-hosted deployments are also available, including configured local connections through the documented tunnel workflow. Deployment choice does not imply identical connector or network behavior; validate the setup you operate.

Operate with intent

Ask across sources with the query plan, permissions, and lifecycle in view.

Start with a bounded query, inspect what it does, and choose materialization only when a persisted copy is the right operational decision.

Bring the question, the work, and the answer into one governed workspace.