Your deployment is not causing 12,000 transactions. That's causing maybe 5-10 (as there might be multiple block reads, depending on deployment package size).
When you deploy to Windows Azure, you need some way of monitoring your application externally. This is where Windows Azure Diagnostics comes in to play. All of your Windows Azure diagnostic logs, performance counters, trace statements, etc. get written to Table Storage (or blob storage, in the case of IIS logs).
If you accrued 12,000 transactions in, say, 3 days, that's averaging 2-3 per minute. At this rate, you'd accumulate charges of about 12 cents per month.
If you want to reduce the number of transactions, you can set up diagnostics yourself, instead of relying on default values (whatever those might be). For example, here's a very simple setup that would go in your
DiagnosticMonitorConfiguration diag = DiagnosticMonitor.GetDefaultInitialConfiguration();
var perfCounter = new PerformanceCounterConfiguration()
CounterSpecifier = @"\processor(*)\% Processor Time",
SampleRate = TimeSpan.FromSeconds(30)
diag.PerformanceCounters.ScheduledTransferPeriod = TimeSpan.FromMinutes(5);
diag.DiagnosticInfrastructureLogs.ScheduledTransferLogLevelFilter = LogLevel.Error;
diag.DiagnosticInfrastructureLogs.ScheduledTransferPeriod = TimeSpan.FromMinutes(5);
diag.Logs.ScheduledTransferLogLevelFilter = LogLevel.Error;
diag.Logs.ScheduledTransferPeriod = TimeSpan.FromMinutes(5);
While these values are arbitrary, the key point is that transfers to Table (or Blob) storage are now only occurring once every 5 minutes, per object type. Note: If you have multiple instances running, you'll also have multiple uploads to storage.