Research Hub  

AI-Generated SQL vs Human SQL: Accuracy, Performance, and Database Cost

AI coding assistants can now generate SQL from natural-language requirements in seconds. A developer can describe a report, ask for a query, or provide a database schema and receive a working SQL statement almost immediately.

That does not mean AI-generated SQL is automatically equivalent to SQL written by an experienced database developer.

A query can return the correct result while still being inefficient, difficult to maintain, expensive to execute, or unsafe for a production database.

This makes AI-generated SQL vs human-written SQL a useful engineering comparison. Instead of asking which approach is universally better, teams should evaluate the two approaches using measurable criteria such as correctness, execution performance, resource consumption, maintainability, and cost.

For .NET applications using SQL databases, this evaluation is particularly relevant because generated queries often become part of repository methods, APIs, reporting services, and background jobs.

What Should Be Compared?

A useful comparison should evaluate more than whether a query executes successfully.

Consider these dimensions:

MetricWhat It Measures
AccuracyDoes the query return the intended result?
Execution timeHow long does the database take to execute it?
CPU usageHow much database CPU does it consume?
Logical readsHow much data does it read?
ScalabilityHow does it behave as data grows?
MaintainabilityCan developers understand and modify it?
SecurityDoes it avoid unsafe input handling?
CostWhat database resources does the query consume?

The same query can perform well on a small development database and poorly after the production dataset grows.

A Simple Example

Suppose an application needs to find customers who placed orders during the previous 30 days.

An AI assistant might generate:

SELECT DISTINCT c.Id, c.Name
FROM Customers c
JOIN Orders o ON c.Id = o.CustomerId
WHERE o.OrderDate >= CURRENT_DATE - INTERVAL '30 days';

A developer may produce a similar query:

SELECT c.Id, c.Name
FROM Customers c
WHERE EXISTS
(
    SELECT 1
    FROM Orders o
    WHERE o.CustomerId = c.Id
      AND o.OrderDate >= CURRENT_DATE - INTERVAL '30 days'
);

Both can produce the expected result.

The interesting question is not:

Which query looks better?

It is:

Which query performs better for the actual data distribution and indexes?

That requires measurement.

Accuracy Testing

The first test should verify correctness.

Create a known dataset:

INSERT INTO Customers (Id, Name)
VALUES
    (1, 'Alice'),
    (2, 'Bob'),
    (3, 'Charlie');

Then add controlled orders:

INSERT INTO Orders (CustomerId, OrderDate)
VALUES
    (1, CURRENT_DATE),
    (2, CURRENT_DATE - INTERVAL '60 days');

The expected result is:

Alice

Run both queries and compare their results.

A simple test strategy is:

Test Data
    ↓
Human SQL ──────┐
                ├── Compare Results
AI SQL ─────────┘

If the result sets differ, investigate the query before considering performance.

Accuracy Is More Than Matching Rows

A query can return the correct rows for one dataset and still be logically incomplete.

For example:

WHERE OrderDate >= CURRENT_DATE - INTERVAL '30 days'

might satisfy a simple requirement.

But production requirements could also include:

Time zone
Cancelled orders
Soft-deleted records
Tenant isolation
Status filters
Date boundary behavior

AI-generated SQL should therefore be evaluated against the complete business requirement, not just a sample output.

Testing Query Performance

Once correctness is established, measure execution performance.

PostgreSQL provides:

EXPLAIN ANALYZE

For example:

EXPLAIN ANALYZE
SELECT c.Id, c.Name
FROM Customers c
WHERE EXISTS
(
    SELECT 1
    FROM Orders o
    WHERE o.CustomerId = c.Id
      AND o.OrderDate >= CURRENT_DATE - INTERVAL '30 days'
);

The execution plan can reveal:

  • Sequential scans

  • Index scans

  • Join strategies

  • Sort operations

  • Estimated vs actual rows

  • Execution time

Do not compare queries using execution time alone.

A query that happens to be faster once may not be faster consistently.

Use the Same Test Conditions

A fair benchmark requires controlled conditions.

Use:

Same database
Same schema
Same data
Same indexes
Same database configuration
Same query parameters
Same concurrency
Same measurement method

For example:

AI SQL
  ↓
10 executions
  ↓
Record results

Human SQL
  ↓
10 executions
  ↓
Record results

Warm and cold cache behavior should also be considered when relevant.

Benchmark With Realistic Data

A database containing:

100 customers
1,000 orders

does not represent a system containing:

10 million customers
500 million orders

A query plan that works well on a small dataset may become inefficient at production scale.

A better benchmark includes multiple dataset sizes:

DatasetPurpose
SmallBasic correctness
MediumTypical workload
LargeScalability
Production-likeRealistic behavior

This helps identify queries that degrade as data volume increases.

Indexes Can Change Everything

Consider:

CREATE INDEX idx_orders_customer_date
ON Orders(CustomerId, OrderDate);

The same SQL can behave very differently with and without this index.

Therefore, the benchmark should document the schema and indexes.

Otherwise, comparing AI and human SQL can become misleading.

The real comparison may actually be:

Query
+
Schema
+
Indexes
+
Statistics
+
Data Distribution

rather than SQL text alone.

AI SQL Can Be Correct but Expensive

Consider a generated query:

SELECT *
FROM Orders
WHERE CustomerId IN
(
    SELECT Id
    FROM Customers
);

It might produce the expected result.

But if the application only needs:

OrderId
OrderDate
Total

then selecting every column creates unnecessary data transfer.

A more focused query is:

SELECT Id, OrderDate, Total
FROM Orders
WHERE CustomerId IN
(
    SELECT Id
    FROM Customers
);

The important lesson is:

Correctness does not automatically mean efficiency.

Measuring Logical Reads and Resource Usage

Execution time is affected by the environment.

Database resource consumption can provide additional information.

For example, PostgreSQL's execution plan can expose buffer activity when requested:

EXPLAIN (ANALYZE, BUFFERS)
SELECT ...

This can help identify queries that perform excessive reads.

For SQL Server, developers can use execution plans and statistics such as logical reads.

The benchmark should use the measurement tools appropriate for the database engine rather than trying to apply one universal metric to every database.

AI SQL and Database Cost

Database cost is rarely determined directly by the SQL text.

It depends on factors such as:

Query execution
+
CPU
+
Memory
+
Storage I/O
+
Data transfer
+
Concurrency
+
Database service pricing

A query that consumes twice as many resources can become significantly more expensive when executed thousands of times per hour.

For example:

10 executions/hour

may make a difference that is barely noticeable.

But:

100,000 executions/hour

can make inefficient SQL a serious operational problem.

This is why production query frequency matters.

Testing SQL From a .NET Application

A query should also be tested through the application's data-access layer.

For example, with Npgsql:

const string sql = """
    SELECT id, name
    FROM customers
    WHERE id = @id;
    """;

await using var command =
    new NpgsqlCommand(sql, connection);

command.Parameters.AddWithValue("id", customerId);

await using var reader =
    await command.ExecuteReaderAsync(
        cancellationToken);

This is important because the database benchmark may not capture application-level behavior such as:

  • Parameter handling

  • Connection pooling

  • Result materialization

  • Serialization

  • Network transfer

  • ORM-generated SQL

The final test should represent how the application actually executes the query.

AI SQL and Parameterization

One major security consideration is SQL injection.

Unsafe code:

var sql =
    $"SELECT * FROM Customers WHERE Name = '{name}'";

If name contains malicious SQL syntax, the query can become dangerous.

Parameterized SQL is safer:

const string sql = """
    SELECT id, name
    FROM customers
    WHERE name = @name;
    """;

await using var command =
    new NpgsqlCommand(sql, connection);

command.Parameters.AddWithValue("name", name);

AI-generated code should be reviewed for parameterization just like human-written code.

Do not assume generated code is secure simply because it came from an AI assistant.

Maintainability Comparison

Performance is not the only consideration.

Compare:

SELECT *
FROM Orders
WHERE CustomerId IN
(
    SELECT Id
    FROM Customers
    WHERE Status = 'Active'
);

with a more explicit query:

SELECT o.Id, o.OrderDate, o.Total
FROM Orders o
JOIN Customers c
    ON c.Id = o.CustomerId
WHERE c.Status = 'Active';

The better query depends on the schema, indexes, database engine, and team's conventions.

The important evaluation criteria are:

Readable
Understandable
Testable
Consistent
Maintainable

A slightly faster query may not be worth introducing unnecessary complexity into a frequently modified part of the application.

Testing AI SQL With Edge Cases

A serious benchmark should include edge cases.

For example:

Empty table
NULL values
Duplicate values
Very large result sets
Boundary dates
Missing relationships
Deleted records
Unicode text
Large numeric values

Consider a date filter:

WHERE CreatedAt >= @startDate
  AND CreatedAt < @endDate

Testing the exact boundary can reveal errors that normal sample data does not expose.

Human Review Still Matters

AI can generate SQL quickly, but database expertise remains important.

A developer or database specialist should review:

Query logic
Execution plan
Indexes
Security
Transaction behavior
Locking
Concurrency
Data volume
Business rules

The role of AI can therefore be:

Requirement
   ↓
AI-generated candidate SQL
   ↓
Human review
   ↓
Automated tests
   ↓
Performance benchmark
   ↓
Production

This is generally safer than treating generated SQL as production-ready without verification.

A Practical Benchmark Framework

A repeatable comparison can use the following process.

Step 1: Define the Requirement

Write the expected behavior in plain language.

Step 2: Prepare Test Data

Use controlled and production-like datasets.

Step 3: Generate SQL

Create one candidate using AI.

Step 4: Write the Human Version

Have a developer independently implement the same requirement.

Step 5: Validate Results

Compare result sets.

Step 6: Inspect Execution Plans

Use the database's execution-plan tooling.

Step 7: Measure Resource Usage

Capture execution time and relevant database resource metrics.

Step 8: Test Edge Cases

Include NULLs, duplicates, boundaries, and large datasets.

Step 9: Review Security

Check parameterization, permissions, data access, and injection risks.

Step 10: Evaluate Maintainability

Have developers review readability and future modification requirements.

Example Scorecard

A team can record results using a simple scorecard:

CategoryAI SQLHuman SQL
Correctness
Execution time
Logical reads
CPU usage
Scalability
Security
Maintainability
Complexity

Avoid assigning arbitrary scores without defining how each metric is measured.

For example, correctness should be based on a known test suite rather than a subjective impression.

Common Mistakes

Comparing Only Execution Time

A single execution does not provide enough evidence.

Using Tiny Test Data

Small datasets can hide scalability problems.

Ignoring Indexes

Query performance depends heavily on indexing.

Comparing Different Requirements

The AI and human queries must solve exactly the same problem.

Ignoring Application Behavior

A database benchmark alone does not measure ORM, network, or serialization overhead.

Trusting AI-Generated SQL Without Review

Generated SQL can contain logical, performance, and security problems.

Using Production Data for Experiments

Benchmarks should use sanitized or synthetic data where appropriate.

Best Practices

  1. Validate correctness before measuring performance.

  2. Benchmark with realistic data volumes.

  3. Use identical database environments.

  4. Inspect execution plans rather than relying only on elapsed time.

  5. Measure resource consumption where practical.

  6. Test parameterization and SQL injection defenses.

  7. Include edge cases and boundary conditions.

  8. Evaluate maintainability alongside performance.

  9. Test AI-generated SQL through the actual application path.

  10. Require human review for production database queries.

Advantages and Disadvantages

Advantages of AI-Generated SQL

  • Produces query candidates quickly.

  • Helps developers explore unfamiliar SQL syntax.

  • Can reduce time spent writing routine queries.

  • Can provide alternative query approaches.

  • Useful for learning and prototyping.

Disadvantages of AI-Generated SQL

  • May misunderstand business requirements.

  • Can produce inefficient queries.

  • May miss important indexes or constraints.

  • Can generate unsafe SQL if not reviewed.

  • May use database-specific syntax incorrectly.

  • Requires validation before production use.

Advantages of Human-Written SQL

  • Developers can apply domain knowledge.

  • Experienced database developers can reason about workload characteristics.

  • Easier to align with established database conventions.

  • Human review can identify business and security requirements that are not obvious from a prompt.

Disadvantages of Human-Written SQL

  • Takes more development time.

  • Quality depends on the developer's database expertise.

  • Developers can also write inefficient or insecure queries.

  • Manual development does not eliminate performance testing.

Conclusion

AI-generated SQL should not be evaluated by asking whether it can produce a query that executes successfully.

The more useful question is:

How does the generated query perform and behave compared with a human-written alternative under the same conditions?

A meaningful evaluation looks like:

AI SQL
   +
Human SQL
   ↓
Same Schema
   ↓
Same Data
   ↓
Same Workload
   ↓
Correctness Tests
   ↓
Execution Plans
   ↓
Resource Measurements
   ↓
Security Review
   ↓
Maintainability Review

The results will depend on the database engine, schema, workload, indexing strategy, and quality of the generated query. There is no reliable basis for claiming that AI-generated SQL is universally faster or cheaper than human-written SQL.

For .NET developers, the practical approach is to use AI as a query-generation and exploration tool while keeping database testing, security review, performance analysis, and production approval firmly within the engineering workflow.

The best SQL is not the query that was written by AI or by a human. It is the query that is correct, secure, measurable, maintainable, and appropriate for the workload it serves.