AirMettle Select — Faster queries without a data warehouse
High-performance object queries · no warehouse required

Query faster.
Skip the warehouse.

AirMettle Select prepares data in object storage once, then runs parallel SQL queries where the data already lives—built to outperform mainstream query engines without loading a separate data warehouse first.

Request access
Measured performance: real operational workloads from a focused filter to a 90-day history.
select.airmettle / workspace connected
{{ demoLabel }}{{ demoObject }}
{{ ln.no }} {{ ln.text }}
{{ demoStatus }}{{ demoFoot }} {{ demoTime }}
REST APICLICSV · JSON/JSONL · GZIPObject storage
{{ s.big }}
{{ s.label }}
Why AirMettle Select is faster

The fastest query path is the one without the warehouse detour.

Mainstream stacks copy, transform, load, and rescan data before returning an answer. AirMettle Select prepares compact metadata once, analyzes the source data in place, and streams only the selected output.

The usual warehouse path MORE HOPS

Stage first. Query later.

OBJECTSsource
ETL / LOADstage
WAREHOUSEload
QUERYscan
DATA COPIED PIPELINE REQUIRED EXTRA COMPUTE
The AirMettle Select fast path DIRECT

Prepare once. Query directly.

OBJECT + METADATAprepare once
PARALLEL SQLselect
RESULTselected only
NO WAREHOUSE PARALLEL READS ANALYZE IN PLACE
Built to outrun mainstream query engines. Measured wall time: from 1.008 seconds for a focused filter to 226.872 seconds across a full 90-day history.
Performance by architecture

High performance without another data platform.

{{ st.no }}
{{ st.title }}
{{ st.body }}
Why AirMettle Select wins

A faster query engine, without the warehouse overhead.

{{ c.k }}
{{ c.t }}
{{ c.d }}
Supported input formats

Query more of what is already in object storage.

Query CSV, JSON, and JSON Lines directly, including GZIP-compressed CSV and JSON inputs.

{{ f.kind }} {{ f.availability }}

{{ f.title }}

{{ f.description }}

Coming soon

More data formats.
The same in-place advantage.

We’re extending AirMettle Select to new data formats while keeping the query path direct and warehouse-free.

{{ f.icon }}

{{ f.title }}

COMING SOON

{{ f.description }}

See the advantage

Query faster.
Leave the warehouse out.

Bring a representative object and query. We’ll show the AirMettle Select path and compare it with the alternatives you use today.

Start an evaluation ↗
How it works

A selection layer between stored objects and useful answers.

Keep source data in object storage. AirMettle Select creates compact metadata—typically less than 0.5% of the source size—then analyzes the original data in place and returns only the records your application needs. The exact footprint varies by data type and can be slightly higher for compressed inputs.

{{ a.k }}
{{ a.t }}
{{ a.d }}
Customer storage boundaryOnly selected output continues downstream
AirMettle Select quickstart

Run your first query in five minutes.

Our quickstart walks through a typical workflow and shows how to get started quickly.

Need help? Request support
AirMettle Select quickstart

Run your first query in five minutes.

AirMettle Select lets you run SQL queries directly against your CSV and JSON blobs in object storage. This quickstart walks through a typical workflow and shows how to get started quickly.

First-time workspace setup

  • Install the Python package and utilities.
  • Save your subscription credentials.
  • Link your storage account using the API.

Development workflow

  • Before querying a blob for the first time, call the API to prepare metadata for fast queries.
  • Run a query on the blob using the Python client.

1. Pick a blob to query

Pick a CSV or JSON blob in your object storage account that you want to query. You need the object URL plus the account name and key.

2. Install the Python package

Use the Python client in this quickstart and install httpx for API calls.

pip install pyamselect httpx

3. Save your credentials

Add your subscription ID, API key, and storage account key as environment variables so credentials stay out of source code.

Linux / macOS / WSL / Git Bash
export AIRMETTLE_SUBSCRIPTION_ID="YOUR_SUBSCRIPTION_ID"
export AIRMETTLE_API_KEY="YOUR_API_KEY"
export STORAGE_ACCOUNT_KEY="YOUR_STORAGE_ACCOUNT_KEY"
PowerShell
$env:AIRMETTLE_SUBSCRIPTION_ID="YOUR_SUBSCRIPTION_ID"
$env:AIRMETTLE_API_KEY="YOUR_API_KEY"
$env:STORAGE_ACCOUNT_KEY="YOUR_STORAGE_ACCOUNT_KEY"
Command Prompt
set AIRMETTLE_SUBSCRIPTION_ID=YOUR_SUBSCRIPTION_ID
set AIRMETTLE_API_KEY=YOUR_API_KEY
set STORAGE_ACCOUNT_KEY=YOUR_STORAGE_ACCOUNT_KEY

4. Link your storage account using the API

Link your object storage account to AirMettle Select. This is a one-time step per account.

import os
import httpx

# Include your subscription credentials in the request headers
headers = {
    "x-subscription-id": os.getenv("AIRMETTLE_SUBSCRIPTION_ID"),
    "x-api-key": os.getenv("AIRMETTLE_API_KEY"),
}

# Create the request body with the storage account name and key
request = {
    "storage_account": "yourstorageaccount",
    "account_key": os.getenv("STORAGE_ACCOUNT_KEY")
}

response = httpx.post("https://api.airmettle.com/api/v1/buckets", json=request, headers=headers)
print(response.status_code, response.text)

A 201 Created response means the account was linked successfully.

5. Create metadata for the blob using the API

Before querying a blob, AirMettle Select generates a small sidecar metadata file. These sidecars live in a hidden directory alongside your data and enable parallel high-performance reads.

You can generate a sidecar on demand. The original blob is never modified, and you can delete and regenerate the sidecar at any time.

import os
import httpx

# Specify the blob URL and your subscription credentials in the request body
request = {
    "subscription_id": os.getenv("AIRMETTLE_SUBSCRIPTION_ID"),
    "api_key": os.getenv("AIRMETTLE_API_KEY"),
    "blob_url": "https://yourstore.blob.core.windows.net/container/yourblob.csv",
    "account_key": os.getenv("STORAGE_ACCOUNT_KEY")
}

response = httpx.post("https://api.airmettle.com/v1/prepare", json=request)
print(response.status_code, response.text)

A 200 OK response means the metadata object is ready and queryable. A 202 Accepted response means generation is asynchronous and includes a status_url for polling.

Status values:
ready means the sidecar is available.
pending means generation is still in progress.
failed means metadata generation failed; review error details in the response body.

6. Run a query

In step 5, you prepared a blob using its full blob_url. In this step, identify the same blob by storage_account, container, and blob. The response is a stream of selected rows in the requested format.

import os
from pyamselect import AMSelectClient, SelectRequest, CSVInputOptions, CSVOutputOptions

# Specify which blob to query, the SQL, and input/output options
request = SelectRequest(
    subscription_id=os.getenv("AIRMETTLE_SUBSCRIPTION_ID"),
    api_key=os.getenv("AIRMETTLE_API_KEY"),
    storage_account="yourstorageaccount",
    container="yourcontainer",
    blob="yourblob.csv",
    expression="SELECT * FROM s3object", # Your SQL query
    input_options=CSVInputOptions(csv_header_config="use",csv_field_delimiter=","), # input as CSV
    output_options=CSVOutputOptions(), # output as CSV
)

# Create the client to connect to AirMettle Select
with AMSelectClient("api.airmettle.com/query", 8443) as client:

    # Run the query and collect the results as a string
    result = client.select_to_string(request)
    print(result)

    # Alternatively, write results directly to a file
    # client.select_to_file(request, "output.csv")

    # Or write results to a binary stream, such as a BytesIO object
    # client.select_to_stream(request, stream)
Next step

Start by linking one storage account, prepare metadata for a few sample blobs, and run your first query.

Request quickstart help ↗
Supported formats

Supported file formats for AirMettle Select.

AirMettle Select runs SQL directly against objects in object storage. The current query surface supports CSV, JSON, and GZIP-compressed variants of these formats.

Currently supported
Format
Description
Notes
{{ f.name }}
{{ f.description }}
{{ f.notes }}
Input and output options

Choose how data is parsed and returned.

When creating a request, set input options for parsing and output options for the stream format returned to your application.

  • CSV input options include header handling and delimiter controls.
  • Equivalent JSON options apply to JSON and NDJSON objects.
  • CSV output options return selected rows in CSV stream form.
from pyamselect import SelectRequest, CSVInputOptions, CSVOutputOptions

request = SelectRequest(
    ...
    expression="SELECT * FROM s3object",
    input_options=CSVInputOptions(
        csv_header_config="use",
        csv_field_delimiter=","
    ),
    output_options=CSVOutputOptions(),
)
Coming soon
{{ u }}
Prepare and query workflow

Same three-step path for every supported format.

  1. Link the storage account once.
  2. Call prepare on the blob URL to generate sidecar metadata.
  3. Issue the SQL query with storage account, container, and blob.
If you need an additional format or compression scheme evaluated, run prepare on a sample object. Unsupported types return a clear prepare error response.
SQL support

Familiar SQL support for object storage queries.

AirMettle Select runs familiar SQL against CSV and JSON objects in object storage. Built on the same SQL surface as Amazon S3 Select, it provides a fast way to filter, project, and aggregate data in place.

Sidecar metadata is generated once per blob so subsequent queries run in parallel and return results quickly.

Supported data types
Type
Description
Example
{{ t.type }}
{{ t.description }}
{{ t.example }}
Built-in functions
Conversion
CAST(expr AS type)
Temporal
{{ f }}
Pattern matching
regexp_contains(string, pattern)
Aggregate functions

Aggregate functions ignore MISSING values and return a single summary row.

Function
Description
{{ f.fn }}
{{ f.description }}
Supported query structure

AirMettle Select implements a focused SQL subset optimized for object storage. The core statement structure is shown below. Currently, explicit JOINs are not supported.

SELECT [projections]
FROM [relation]
WHERE [condition]
LIMIT [number]
SELECT list

Project specific columns, expressions, or function results and use aliases with AS.

SELECT column1, column2
SELECT *
FROM clause

Query a single object relation.

FROM S3Object
WHERE clause

Filter rows with boolean expressions.

WHERE amount > 100
WHERE status = 'active' AND region IS NOT MISSING
WHERE regexp_contains(email, '@company\\.com')
LIMIT clause

Cap returned records for sampling and preview.

LIMIT 100
Working with CSV

Reference CSV columns by position (_1, _2, and so on) or by header name when headers are present. Header names are case-insensitive unless wrapped in double quotes.

SELECT _1, _3 FROM S3Object WHERE _2 > 50
SELECT email FROM S3Object WHERE status = 'active'
JSON notation and identifiers

Use dot notation for nested fields and zero-based indexes for arrays. Start from S3Object[*] when JSON is treated as an array of root values.

SELECT s.projects[0].project_name FROM S3Object s
SELECT s."CAST", s."Name" FROM S3Object s
Why AirMettle Select
Familiar SQL syntax for filtering, projection, and aggregation.
No data movement required before querying.
Parallel execution enabled by sidecar metadata.
S3 Select compatible surface with minor query adjustments.
Use cases

Two workloads. Measurable performance.

Explore measured AirMettle Select performance across operational investigations and the ClickBench query suite.

Operational event investigation · AirMettle Select vs. Synapse

From a one-hour alert to a 90-day history.

Three queries across a 332.7 million-event source show how AirMettle Select handles an urgent filter, a day-long investigation, and a complete 90-day history without loading the data into a warehouse.

{{ f.value }} {{ f.label }}
{{ c.k }}

{{ c.title }}

“{{ c.question }}”

{{ c.story }}

Scope{{ c.scale }}
Returned{{ c.matches }}
Performance comparison
AirMettle Select {{ c.amRuntime }}s
Synapse {{ c.synRuntime }}s
Measured speedup {{ c.speedup }}× faster
Whole-data setup

Prepare once. Store only compact metadata.

See the one-time preparation total and ongoing metadata storage cost for the complete source.

{{ s.label }} {{ s.value }}

Monthly storage is estimated using East US 2 Hot LRS at $0.0184/GB-month. Actual storage costs vary.

Analytical performance benchmark

AirMettle Select on ClickBench.

Compare AirMettle Select and Synapse across the same ClickBench query suite using the recorded 6.6% CSV results.

{{ m.label }} {{ m.value }}
CB

ClickBench results are on the way.

AirMettle Select and Synapse measurements will be published side by side with the workload and test details.

AirMettle Select vs. Synapse

Runtime by benchmark query.

{{ clickBenchSuiteSpeedupLabel }}× faster across all 42 queries
AirMettle Select Synapse Log scale · lower is better
Recorded runtime · logarithmic scale
{{ p.synapseLabel }} {{ p.selectLabel }}
Benchmark queries in source order · 42 total
{{ m.label }} {{ m.value }} {{ m.note }}
Bring your own query

See how AirMettle Select performs on your data.

Start an evaluation ↗
Security and trust

Designed around the data boundary you already trust.

Keep source data in object storage and limit each query to the storage scope your application is allowed to use.

{{ s.icon }}

{{ s.t }}

{{ s.d }}

FAQ

Questions, answered.

The essentials for evaluating AirMettle Select, from supported data to deployment and pricing.

{{ f.a }}