By the end of this module, you'll:
Batch Processing: Use Split in Batches (25-100 items) for large datasets Parallel Execution: Split independent tasks into parallel branches Memory Management: Clear unnecessary data between nodes
// Optimized data processing
const items = $input.all();
const BATCH_SIZE = 50;
// Process efficiently
const results = items.slice(0, BATCH_SIZE).map(item => ({
id: item.json.id,
processed: true,
// Only keep essential data
summary: {
score: calculateScore(item.json),
category: item.json.category
}
}));
return results.map(r => ({ json: r }));
Use Indexes: Add indexes on frequently queried fields Limit Results: Always use LIMIT clauses Batch Updates: Update multiple records in single queries
-- Optimized customer update
UPDATE customers
SET last_contact_date = CURRENT_TIMESTAMP,
email_sequence_stage = 'engaged'
WHERE email IN (
SELECT email FROM email_opens
WHERE opened_at >= CURRENT_DATE - INTERVAL '7 days'
)
LIMIT 1000;
Execution History: Track success/failure rates Node Performance: Identify bottleneck nodes Error Patterns: Monitor common failure points
// Function node for performance tracking
const startTime = Date.now();
const nodeStartTimes = global.nodeStartTimes || {};
// Track node execution time
nodeStartTimes[$node.name] = startTime;
// Performance metrics
const metrics = {
workflow_id: $workflow.id,
execution_id: $execution.id,
node_name: $node.name,
execution_time: Date.now() - startTime,
memory_usage: process.memoryUsage(),
items_processed: $input.all().length,
timestamp: new Date().toISOString()
};
// Log to monitoring system
return [{ json: { ...input, performance_metrics: metrics } }];