Muhasebe hesaplama deneyi

Deney özeti

Hareket satırı

5.324.000

Cari hesap

100.000

A, B ve C

A, hareketleri sorgu sırasında toplar. B, önceden hesaplanmış bakiyeleri ve Redis önbelleğini kullanır. C, bağımlılık grafiğinde yalnız etkilenen düğümlere değişim miktarını yayar.

Son ölçüm dosyaları

5000000-C-20261017-004227-9e54c7c94a5dd59181dc07c1.json

5000000-B-20261017-003349-9e54c7c94a5dd59181dc07c1.json

5000000-A-20261017-002503-9e54c7c94a5dd59181dc07c1.json

1000000-C-20261016-232451-e5af45c4e1136815c4fa1687.json

1000000-B-20261016-232015-e5af45c4e1136815c4fa1687.json

1000000-A-20261016-231526-e5af45c4e1136815c4fa1687.json

100000-C-20261016-231233-3c8b8e20929c721e1c9d7627.json

100000-B-20261016-230857-3c8b8e20929c721e1c9d7627.json

100000-A-20261016-230507-3c8b8e20929c721e1c9d7627.json

100000-A-20261016-225128-43e0491f041c58fb814a9953.json

C gerçekten yeni mi?

Sonuç

  1. Kritik sorunun cevabı koşullu evet: C, aynı donanımda toplu yazımda B’ye göre CPU ve sorguyu azaltıyor; bütün işlemlerde üstün değil.
  2. 5M toplu yazım ortalaması C 2036,90 ms, B 4059,43 ms: 1,99×; CPU 726,59 / 1327,49 ms: 1,83×.
  3. Toplu yazım sorgusu C 7.012, B 15.002; C’nin A’nın 7.001 sorgusuna ek bakım maliyeti yalnız +11 sorgu.
  4. Tek fişte C, B’den yavaş: 5M ortalaması 5,72 / 5,13 ms; A 2,62 ms ile en hızlı yazar.
  5. 5M cari bakiye A yaklaşık 1,29 sn, mizan 436 ms; B/C bu okumaları 1 ms altında tutar.
  6. Eşzamanlı yazımda C, B’den yaklaşık 1,66× hızlıdır; A türetilmiş satır kilidi taşımadığı için en hızlıdır.
  7. Seçilen dokuz dosyanın örneklerinde ve son mutabakatlarında fark sıfırdır; bu bütün muhasebe durumlarının ispatı değildir.
  8. C bellek avantajı göstermedi; PostgreSQL backend belleği ölçülemedi, toplam sistem CPU tüketimi ölçülmedi.
  9. C yeni bir hesaplama kuramı değil: bildirimsel grafikte delta yayılımı ve anahtar bazında birleştirme, sadeleştirilmiş işlem içi IVM’dir.
  10. Canlıya geçiş yok; Veridia için önce gölge okuma ve mutabakat, sonra uygun toplu işler değerlendirilebilir.

1. Mevcut muhasebe mimarilerinin analizi

A, Eloquent Line sorgularını fiş başlıklarıyla birleştirip SUM/GROUP BY yapar; temel veri dışında bakım yapmaz. B, satır başına aggregate upsert uygular, mizanı account toplamlarından okur. Redis her okumada PostgreSQL’den doğrulanan bakiyeyle adreslenir; PostgreSQL okumasını ortadan kaldırmaz. Şemadaki materialized view B’nin ölçülen yolunda kullanılmaz ve yenilenmez. C aynı toplamları statik yönlü grafikte üretir, işlem topluluğunda ortak anahtarların deltalarını birleştirir. Okumadaki büyük A/B ve A/C farkı, ön hesaplamanın bilinen kazancıdır; C’ye özgü yenilik kanıtı değildir.

C yeni mi? Kaynaklarla karşılaştırma

Teknik / kaynak Prototiple ilişki ve sınır
DBToaster Yüksek mertebeli delta işleme ile sorgu bakımını araştırır; bu prototip SQL’den delta türetmez, elle yazılmış toplamsal dönüşümler çalıştırır.
PostgreSQL IVM / pg_ivm pg_ivm AFTER trigger ile anında görünüm bakımı yapar. C’nin aynı transaction içinde toplam güncellemesi benzer IVM semantiğidir; senkron tutarlılık tek başına yeni değildir.
Materialize Timely/Differential Dataflow üzerinde artımlı sonuç ve indeks bakımı yapar. C’de dağıtık zaman ilerlemesi, genel join veya iteratif veri akışı yoktur.
Feldera SQL sonuçlarına değişim üzerinden artımlı bakım uygular; C bu fikrin elle tanımlı küçük bir toplama grafiğidir, eşdeğer kapsamda bir motor değildir.
Adapton / Salsa Talep üzerine bağımlılık ve hesaplama yeniden kullanımını ele alırlar. C eager delta push yapar; dinamik bağımlılık keşfi veya genel memoization içermez.
Event sourcing + CQRS Değişmez fiş ve ters kayıt, yeniden üretilebilir okuma projeksiyonlarına uygundur. Outbox yazılır ancak tüketici/teslimat protokolü yoktur; tam olay deposu altyapısı kurulmuş değildir.
Materialized view Saklanan sorgu sonucu ve sonradan refresh bilinen yöntemdir. C aggregate tablolarını delta ile günceller; deney_trial_balance karşılaştırmanın aktif parçası değildir.
Delta propagation / incremental computation Yeni katkıyı ekleme ve ters kaydın karşı katkısını yayma doğrudan bu tekniklere karşılık gelir.

Prototipte yapılan: bildirimsel bağımlılık grafiği üzerinden delta yayılımı + anahtar başına delta birleştirme = IVM/differential dataflow yaklaşımının sadeleştirilmiş, işlem içi bir hâli. Muhasebe semantiğinin birinci sınıf grafiğe alınması bir geliştirme yönüdür; bugün dönem bazı anahtarlardadır, ters kayıt borç/alacak değişimidir, şube/PB bütün düğümlerde boyut değildir. Saf PHP Graph/Node çekirdeğinin ORM’den bağımsızlığı gerçek bir modülerlik özelliğidir; yeni algoritma iddiası değildir. Türkçenin kök + ekler metaforu “hareket + şirket/şube/dönem/PB/cari bağlamı” olarak anahtar tasarımını anlatır. Her ek bir boyut olabilir; mevcut kodda hepsi uygulanmamıştır. Metaforun ayrı bir hesaplama avantajı ölçülmedi; kazanç delta birleştirmeden gelir.

2. Önerilen yeni hesaplama modelinin teknik tasarımı

Graph yapıcı bağımlılıkları topolojik sıralar, döngü/eksik girişleri reddeder. evaluate her düğümün dönüşümünü gelen deltalar üzerinde çalıştırır; aynı anahtarı birleştirir ve anahtarları sıralar. Etkisiz düğümlerin çıktısı boştur fakat statik düğümler yine ziyaret edilir; tüm grafiği ziyaret etmeme optimizasyonu uygulanmış değildir. Borç/alacak kuruş cinsinden tam sayıdır; ters kayıt tarafları değiştirerek denetlenebilir karşı katkı oluşturur.

L satır, K düğüm ve U farklı (düğüm, anahtar) çifti olsun. B’de türetilmiş yazım = Σ(satır × etkilenen düğüm); sabit muhasebe kurallarında O(LK) üst sınırı, fiilen her satırın uygun kuralları kadar upsert. C toplu kipte türetilmiş yazım = |farklı (düğüm, anahtar)| = U; dönüşümleri üretme maliyeti devam eder, sıralama O(Σ Uᵢ log Uᵢ), delta belleği O(L + U) düzeyindedir. Upsert indeks maliyeti aggregate büyüklüğüyle logaritmik olabilir; sıfır maliyet varsayılmaz. Temel fiş ve satır yazımı her iki mimaride de O(L)’dir. Her fişte farklı anahtar varsa U büyür ve C kazancı daralır. Ölçülen batch_1000, 1.000 fiş / 3.000 satırdır, 1.000 satır değildir. Aynı cari/tarih/hesaplara yazılır: B 8.000 aggregate upsert, C 11 upsert ve 5.994 birleşen delta üretir. C tek fişte 11, B 8 upsert yapar; C ayrıca trial düğümünü saklar. Böylece tek fişte daha yavaş, ortak anahtarlı batch’te daha hızlı oluşu algoritmayla uyumludur. B de aynı delta birleştirmeyle optimize edilebilir; üstünlük yalnız grafik kullanımının zorunlu sonucu değildir.

3. Veri modeli ve bağımlılık grafiği

Temel tablolar: deney_companies, branches, periods, currencies, accounts, parties, vouchers, lines. Türetilmiş deney_aggregates anahtarı (architecture,node,key); deney_outbox fiş olayını transaction içinde saklar. Hareketler gerçek kaynaktır; Redis otorite değildir.

lines → party
lines → account → trial → income
lines → daily → monthly
lines → vat

party=[cari]; account/trial=[şirket,dönem,hesap]; income=[dönem]; daily=[tarih]; monthly=[ay]; vat=[dönem,191/391]. Dönem kimlikleri şirketi dolaylı ayırır, cari kimliği şirkete bağlıdır. Günlük/aylık toplamlar şirketler arasında ortaktır; şube ayrımı ve PB bazında rapor bakiyesi yoktur. TRY/EUR yerel tutara çevrilir, yabancı borç/alacak satırda korunur. Bu nedenle tam çok boyutlu üretim ERP desteği iddia edilemez. B trial için account toplamını kullanır; C ayrıca trial saklar.

4. Laravel üzerinde çalışan prototip

app/Deney/Accounting.php post/postBatch, reverse, rapor okumaları, rebuild ve reconcile yollarını; Motor/Graph.php ve Node.php saf çekirdeği; Muhasebe/Definitions.php muhasebe dönüşümlerini içerir. DeneyVeri veri üretir, DeneyOlc ölçüm JSON’unu oluşturur. Yerel /, /olcumler, /dene, /grafik, /mutabakat ekranları vardır; canlı ERP tablolarına entegrasyon yapılmadı. T3 düzeltmesinde /dene tek temel fişi seçilen mimariyle post eder; diğerleri aynı id için project çalıştırır. project temel tablo/outbox yazmaz; B satır bazında, C birleştirilmiş grafikte, A no-op olarak çalışır. Üç yolun süresi ve sorgusu ayrı gösterilir; ters kayıt aynı akışı izler. B/C toplamlarının başlangıçta uyumlu olması gerekir; eski ölçümlerden kalan uyumsuzluk yalnız /mutabakat üzerindeki açık yeniden oluşturma düğmesiyle giderilir. A okumaları büyük veride hâlâ pahalıdır; düzeltme ekranın tümünü sabit süreli yapmaz. project çağrı sözleşmesi, daha önce o mimariye uygulanmamış bir fişi bir kez uygulamaktır; bağımsız idempotent tüketici değildir. Ekran yeni fiş ve projeksiyonları tek dış transaction içinde çalıştırır; tekrar oynatılacak harici tüketici için kalıcı mimari×fiş checkpoint’i gerekir. Mevcut post idempotency koruması project için geçerli değildir. T3 kod değişiklikleri eski performans dosyalarından sonra yapıldı; burada verilen sayılar önceki ölçümlerdir, düzeltilmiş ekranın yeni ölçümü değildir. Görev gereği test/artisan çalıştırılmadı.

5. PostgreSQL şema ve indeks önerileri

Şema bigint kuruş, numeric(20,8) kur, foreign key, pozitif tutar, tek taraflı satır, benzersiz idempotency_key/reversal_of ve deferred fiş denge trigger’ı kullanır. Kesinleşmiş başlık ve satır değişimi/silme engellenir; dönem/şirket/şube/cari uyumu doğrulanır. Writer ortak advisory lock, rebuild/reconcile özel lock alır; B ayrıca bütün writer’ları tek advisory lock ile seri hale getirir. C sıralı anahtar upsert ve PostgreSQL satır kilitleriyle toplar. Outbox vardır; yayıncı/yeniden teslim mekanizması yoktur. Mevcut gerçek indeks listesi (seçilen JSON’larda aynı):

Öneriler (uygulanmadı): JSON metin key yerine tipli şirket/şube/dönem/PB/cari/hesap boyutları ve uygun benzersiz anahtarlar; mizan filtresi için (architecture,node,company_id,period_id,account); tarihsel cari okumaları için EXPLAIN ile doğrulanmış kapsayıcı party/voucher indeksi; büyüyen hareketlerde dönem bazında bölümleme ve posted fiş erişim yolu. INCLUDE(debit,credit) ancak indeks boyutu/yazma maliyetiyle ölçülerek seçilmeli. Outbox tüketimi eklenirse işlenme durumu ve bekleyen kayıt indeksi, project tekrar teslimi için mimari×fiş benzersiz checkpoint’i gerekir. Kur farkı fişi, kapanış yetkilendirmesi ve toplam taşma sınırları üretim öncesi ayrıca tasarlanmalıdır.

6. Tutarlılık ve muhasebe doğruluk testleri

Mevcut testlerin kapsamı (bu görevde çalıştırılmadılar):

7. Gerçek performans karşılaştırmaları

Koşullar ve ölçüm sınırları

Tohum 42; 100.000 cari, 100k/1M/5M temel hareket satırı, dört satırlı veri üretici fişleri; iki şirket, dört şube, dört dönem (2024/2025), TRY+EUR (kur 35). Ölçüm fişleri seçilen tek cari/şube/dönem/tarih üzerinde TRY satışıdır; çok boyutlu veya dağınık anahtarlı yük ölçümü değildir. Her işlem bir atılan ısınma + beş tekrar; sıcak önbellek korunur. p95 beş örnekte sıralı en yüksek örnektir, sağlam kuyruk gecikmesi tahmini değildir. Donanım JSON beyanı: AMD EPYC 9454P, 16 vCPU, 31 GB RAM; PostgreSQL uygulamayla aynı makinede. PHP CPU getrusage user+system; eşzamanlıda worker’lar dahil. PostgreSQL CPU/IO ve toplam makine CPU’su ölçülmedi. PHP tepe bellek allocation değeridir; eşzamanlı bellek sekiz worker tepesinin toplamıdır, aynı andaki RSS değildir. PostgreSQL backend belleği ölçülemedi. Sorgu sayısı DB::listen; transaction kontrol komutları dahil değildir. Redis çağrıları PostgreSQL sorgu sayısına dahil değildir. sequential_1000 her biri commit eden 1.000 post; batch_1000 tek transaction içinde 1.000 fiş. Eşzamanlı 8×250=2.000 fiş, batch birleştirme olmadan ayrı post çağrıları. historical_reversal kaynak fişi süre dışında hazırlar, sadece ters kaydı ölçer. Standart işlemler/batch rollback ile geri alınır. sequential/eşzamanlı işlemler karşı fişlerle geri alınır, denetim izi ve ısınma kayıtları kalır. Bu nedenle baz bakiye korunur ama fiziksel satır sayısı korunmaz. A→B→C sırası randomize edilmemiştir; cache ve artan veri karıştırıcı etkendir.

PostgreSQL: PostgreSQL 16.15 (Ubuntu 16.15-0ubuntu0.24.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0, 64-bit.

Temel boyut Mimari Başlangıç satır Bitiş satır Fiş Cari Dosya

| 100000 | A | 100000 | 208000 | 61000 | 100000 | 100000-A-20261016-230507-3c8b8e20929c721e1c9d7627.json |

| 100000 | B | 208000 | 316000 | 97000 | 100000 | 100000-B-20261016-230857-3c8b8e20929c721e1c9d7627.json |

| 100000 | C | 316000 | 424000 | 133000 | 100000 | 100000-C-20261016-231233-3c8b8e20929c721e1c9d7627.json |

| 1000000 | A | 1000000 | 1108000 | 286000 | 100000 | 1000000-A-20261016-231526-e5af45c4e1136815c4fa1687.json |

| 1000000 | B | 1108000 | 1216000 | 322000 | 100000 | 1000000-B-20261016-232015-e5af45c4e1136815c4fa1687.json |

| 1000000 | C | 1216000 | 1324000 | 358000 | 100000 | 1000000-C-20261016-232451-e5af45c4e1136815c4fa1687.json |

| 5000000 | A | 5000000 | 5108000 | 1286000 | 100000 | 5000000-A-20261017-002503-9e54c7c94a5dd59181dc07c1.json |

| 5000000 | B | 5108000 | 5216000 | 1322000 | 100000 | 5000000-B-20261017-003349-9e54c7c94a5dd59181dc07c1.json |

| 5000000 | C | 5216000 | 5324000 | 1358000 | 100000 | 5000000-C-20261017-004227-9e54c7c94a5dd59181dc07c1.json |

Bu dokuz dosya her boyut/mimari için dosya adı zaman damgasına göre en sondur; eski 100k A dosyası dışlandı. Sayılar .gorevler/olcum-ozet.txt ile iki ondalık düzeyinde uyumludur. Her mimari ölçüme kendi rebuild/reconcile kontrolünden sonra başlar; mimariler aynı baz tablosunu paylaşır, diğer mimarilerin türetilmiş toplamları ölçüm sırasında senkron tutulmaz.

100.000 temel hareket: ham özetler

İşlem Mimari Ort ms Medyan ms p95 ms CPU ort ms Sorgu medyan PHP tepe MiB Reconcile farkı

| new_voucher | A | 2.63 | 2.44 | 3.06 | 0.90 | 8 | 26 | 0 |

| new_voucher | B | 4.97 | 4.93 | 5.17 | 1.79 | 17 | 30 | 0 |

| new_voucher | C | 5.58 | 5.55 | 5.85 | 1.99 | 19 | 32 | 0 |

| party_balance | A | 0.49 | 0.49 | 0.53 | 0.22 | 1 | 28 | 0 |

| party_balance | B | 0.62 | 0.60 | 0.67 | 0.31 | 1 | 30 | 0 |

| party_balance | C | 0.44 | 0.44 | 0.45 | 0.21 | 1 | 32 | 0 |

| sequential_1000 | A | 2593.00 | 2634.22 | 2652.95 | 877.55 | 8000 | 28 | 0 |

| sequential_1000 | B | 4679.08 | 4709.79 | 4727.79 | 1592.04 | 17000 | 30 | 0 |

| sequential_1000 | C | 5189.37 | 5237.69 | 5280.25 | 1759.29 | 19000 | 32 | 0 |

| batch_1000 | A | 2038.54 | 2036.76 | 2056.21 | 729.90 | 7001 | 30 | 0 |

| batch_1000 | B | 3946.45 | 3907.24 | 4054.20 | 1333.27 | 15002 | 32 | 0 |

| batch_1000 | C | 2050.47 | 2047.97 | 2062.24 | 736.17 | 7012 | 32 | 0 |

| trial_balance | A | 21.29 | 21.11 | 21.93 | 0.38 | 1 | 30 | 0 |

| trial_balance | B | 0.61 | 0.62 | 0.64 | 0.21 | 1 | 32 | 0 |

| trial_balance | C | 0.49 | 0.50 | 0.50 | 0.22 | 1 | 32 | 0 |

| historical_reversal | A | 2.64 | 2.61 | 2.71 | 1.00 | 10 | 30 | 0 |

| historical_reversal | B | 5.18 | 5.12 | 5.42 | 1.92 | 19 | 32 | 0 |

| historical_reversal | C | 5.72 | 5.73 | 5.77 | 2.06 | 21 | 32 | 0 |

| concurrent_8x250 | A | 769.32 | 760.56 | 795.61 | 2021.89 | 16000 | 240 | 0 |

| concurrent_8x250 | B | 9591.52 | 9658.73 | 9712.25 | 3564.38 | 34000 | 256 | 0 |

| concurrent_8x250 | C | 5763.26 | 5761.12 | 5807.59 | 3813.14 | 38000 | 256 | 0 |

A/B/C oranları

Oranlar pay/payda maliyetidir: >1 paydadaki mimari daha az maliyetli, <1 paydaki daha az maliyetli. Süre/CPU ortalama; sorgu medyan; bellek ortalama PHP tepesidir. Kalın değerler tam sayıda ≥2,000 veya ≤0,500 farktır; yuvarlama eşik yaratmaz. Reconcile her mimaride 0 olduğundan 0/0 oranı tanımsızdır.

İşlem Metrik A/B A/C B/C

| new_voucher | Süre | 0.529× | 0.472× | 0.892× |

| new_voucher | PHP CPU | 0.505× | 0.454× | 0.898× |

| new_voucher | Sorgu | 0.471× | 0.421× | 0.895× |

| new_voucher | PHP tepe | 0.867× | 0.812× | 0.938× |

| party_balance | Süre | 0.792× | 1.126× | 1.421× |

| party_balance | PHP CPU | 0.727× | 1.068× | 1.468× |

| party_balance | Sorgu | 1.000× | 1.000× | 1.000× |

| party_balance | PHP tepe | 0.933× | 0.875× | 0.938× |

| sequential_1000 | Süre | 0.554× | 0.500× | 0.902× |

| sequential_1000 | PHP CPU | 0.551× | 0.499× | 0.905× |

| sequential_1000 | Sorgu | 0.471× | 0.421× | 0.895× |

| sequential_1000 | PHP tepe | 0.933× | 0.875× | 0.938× |

| batch_1000 | Süre | 0.517× | 0.994× | 1.925× |

| batch_1000 | PHP CPU | 0.547× | 0.991× | 1.811× |

| batch_1000 | Sorgu | 0.467× | 0.998× | 2.139× |

| batch_1000 | PHP tepe | 0.938× | 0.938× | 1.000× |

| trial_balance | Süre | 34.641× | 43.210× | 1.247× |

| trial_balance | PHP CPU | 1.796× | 1.715× | 0.955× |

| trial_balance | Sorgu | 1.000× | 1.000× | 1.000× |

| trial_balance | PHP tepe | 0.938× | 0.938× | 1.000× |

| historical_reversal | Süre | 0.509× | 0.461× | 0.906× |

| historical_reversal | PHP CPU | 0.522× | 0.487× | 0.935× |

| historical_reversal | Sorgu | 0.526× | 0.476× | 0.905× |

| historical_reversal | PHP tepe | 0.938× | 0.938× | 1.000× |

| concurrent_8x250 | Süre | 0.080× | 0.133× | 1.664× |

| concurrent_8x250 | PHP CPU | 0.567× | 0.530× | 0.935× |

| concurrent_8x250 | Sorgu | 0.471× | 0.421× | 0.895× |

| concurrent_8x250 | PHP tepe | 0.938× | 0.938× | 1.000× |

1.000.000 temel hareket: ham özetler

İşlem Mimari Ort ms Medyan ms p95 ms CPU ort ms Sorgu medyan PHP tepe MiB Reconcile farkı

| new_voucher | A | 2.61 | 2.43 | 3.01 | 0.89 | 8 | 26 | 0 |

| new_voucher | B | 4.99 | 4.98 | 5.10 | 1.76 | 17 | 30 | 0 |

| new_voucher | C | 5.73 | 5.74 | 6.11 | 1.89 | 19 | 32 | 0 |

| party_balance | A | 60.12 | 58.93 | 63.12 | 0.43 | 1 | 28 | 0 |

| party_balance | B | 0.61 | 0.61 | 0.67 | 0.30 | 1 | 30 | 0 |

| party_balance | C | 0.44 | 0.44 | 0.50 | 0.20 | 1 | 32 | 0 |

| sequential_1000 | A | 2694.07 | 2697.26 | 2728.47 | 896.64 | 8000 | 28 | 0 |

| sequential_1000 | B | 4711.23 | 4739.16 | 4780.45 | 1605.19 | 17000 | 30 | 0 |

| sequential_1000 | C | 5287.02 | 5285.39 | 5302.02 | 1790.70 | 19000 | 32 | 0 |

| batch_1000 | A | 2053.36 | 2056.02 | 2077.80 | 731.25 | 7001 | 30 | 0 |

| batch_1000 | B | 4067.60 | 4082.84 | 4134.34 | 1332.97 | 15002 | 32 | 0 |

| batch_1000 | C | 2064.59 | 2064.59 | 2068.84 | 738.77 | 7012 | 32 | 0 |

| trial_balance | A | 78.83 | 79.48 | 80.15 | 0.53 | 1 | 30 | 0 |

| trial_balance | B | 0.63 | 0.62 | 0.66 | 0.21 | 1 | 32 | 0 |

| trial_balance | C | 0.50 | 0.50 | 0.52 | 0.22 | 1 | 32 | 0 |

| historical_reversal | A | 3.07 | 2.98 | 3.42 | 1.12 | 10 | 30 | 0 |

| historical_reversal | B | 5.08 | 5.06 | 5.16 | 1.85 | 19 | 32 | 0 |

| historical_reversal | C | 5.38 | 5.64 | 5.66 | 1.93 | 21 | 32 | 0 |

| concurrent_8x250 | A | 771.28 | 766.96 | 796.86 | 2000.55 | 16000 | 240 | 0 |

| concurrent_8x250 | B | 9487.32 | 9478.77 | 9626.74 | 3549.35 | 34000 | 256 | 0 |

| concurrent_8x250 | C | 5678.34 | 5687.37 | 5711.35 | 3800.40 | 38000 | 256 | 0 |

A/B/C oranları

Oranlar pay/payda maliyetidir: >1 paydadaki mimari daha az maliyetli, <1 paydaki daha az maliyetli. Süre/CPU ortalama; sorgu medyan; bellek ortalama PHP tepesidir. Kalın değerler tam sayıda ≥2,000 veya ≤0,500 farktır; yuvarlama eşik yaratmaz. Reconcile her mimaride 0 olduğundan 0/0 oranı tanımsızdır.

İşlem Metrik A/B A/C B/C

| new_voucher | Süre | 0.523× | 0.456× | 0.872× |

| new_voucher | PHP CPU | 0.509× | 0.474× | 0.930× |

| new_voucher | Sorgu | 0.471× | 0.421× | 0.895× |

| new_voucher | PHP tepe | 0.867× | 0.812× | 0.938× |

| party_balance | Süre | 98.706× | 135.830× | 1.376× |

| party_balance | PHP CPU | 1.429× | 2.172× | 1.520× |

| party_balance | Sorgu | 1.000× | 1.000× | 1.000× |

| party_balance | PHP tepe | 0.933× | 0.875× | 0.938× |

| sequential_1000 | Süre | 0.572× | 0.510× | 0.891× |

| sequential_1000 | PHP CPU | 0.559× | 0.501× | 0.896× |

| sequential_1000 | Sorgu | 0.471× | 0.421× | 0.895× |

| sequential_1000 | PHP tepe | 0.933× | 0.875× | 0.938× |

| batch_1000 | Süre | 0.505× | 0.995× | 1.970× |

| batch_1000 | PHP CPU | 0.549× | 0.990× | 1.804× |

| batch_1000 | Sorgu | 0.467× | 0.998× | 2.139× |

| batch_1000 | PHP tepe | 0.938× | 0.938× | 1.000× |

| trial_balance | Süre | 125.858× | 157.384× | 1.250× |

| trial_balance | PHP CPU | 2.473× | 2.395× | 0.968× |

| trial_balance | Sorgu | 1.000× | 1.000× | 1.000× |

| trial_balance | PHP tepe | 0.938× | 0.938× | 1.000× |

| historical_reversal | Süre | 0.604× | 0.571× | 0.945× |

| historical_reversal | PHP CPU | 0.607× | 0.582× | 0.959× |

| historical_reversal | Sorgu | 0.526× | 0.476× | 0.905× |

| historical_reversal | PHP tepe | 0.938× | 0.938× | 1.000× |

| concurrent_8x250 | Süre | 0.081× | 0.136× | 1.671× |

| concurrent_8x250 | PHP CPU | 0.564× | 0.526× | 0.934× |

| concurrent_8x250 | Sorgu | 0.471× | 0.421× | 0.895× |

| concurrent_8x250 | PHP tepe | 0.938× | 0.938× | 1.000× |

5.000.000 temel hareket: ham özetler

İşlem Mimari Ort ms Medyan ms p95 ms CPU ort ms Sorgu medyan PHP tepe MiB Reconcile farkı

| new_voucher | A | 2.62 | 2.42 | 3.05 | 0.89 | 8 | 26 | 0 |

| new_voucher | B | 5.13 | 5.14 | 5.25 | 1.76 | 17 | 30 | 0 |

| new_voucher | C | 5.72 | 5.71 | 5.85 | 1.93 | 19 | 32 | 0 |

| party_balance | A | 1286.04 | 1273.22 | 1338.39 | 0.55 | 1 | 28 | 0 |

| party_balance | B | 0.67 | 0.66 | 0.75 | 0.31 | 1 | 30 | 0 |

| party_balance | C | 0.50 | 0.50 | 0.50 | 0.21 | 1 | 32 | 0 |

| sequential_1000 | A | 2663.74 | 2674.11 | 2699.12 | 902.78 | 8000 | 28 | 0 |

| sequential_1000 | B | 4717.74 | 4725.35 | 4738.07 | 1599.49 | 17000 | 30 | 0 |

| sequential_1000 | C | 5260.44 | 5266.37 | 5278.55 | 1774.30 | 19000 | 32 | 0 |

| batch_1000 | A | 2057.42 | 2060.31 | 2067.20 | 727.12 | 7001 | 30 | 0 |

| batch_1000 | B | 4059.43 | 4080.49 | 4164.69 | 1327.49 | 15002 | 32 | 0 |

| batch_1000 | C | 2036.90 | 2057.10 | 2063.23 | 726.59 | 7012 | 32 | 0 |

| trial_balance | A | 436.09 | 435.86 | 438.38 | 0.57 | 1 | 30 | 0 |

| trial_balance | B | 0.70 | 0.70 | 0.72 | 0.22 | 1 | 32 | 0 |

| trial_balance | C | 0.52 | 0.49 | 0.57 | 0.21 | 1 | 32 | 0 |

| historical_reversal | A | 3.01 | 3.01 | 3.04 | 1.16 | 10 | 30 | 0 |

| historical_reversal | B | 5.13 | 5.10 | 5.28 | 1.85 | 19 | 32 | 0 |

| historical_reversal | C | 5.67 | 5.63 | 5.79 | 2.06 | 21 | 32 | 0 |

| concurrent_8x250 | A | 750.03 | 751.49 | 755.48 | 1946.90 | 16000 | 240 | 0 |

| concurrent_8x250 | B | 9524.16 | 9545.44 | 9593.02 | 3562.22 | 34000 | 256 | 0 |

| concurrent_8x250 | C | 5743.44 | 5733.44 | 5792.20 | 3816.34 | 38000 | 256 | 0 |

A/B/C oranları

Oranlar pay/payda maliyetidir: >1 paydadaki mimari daha az maliyetli, <1 paydaki daha az maliyetli. Süre/CPU ortalama; sorgu medyan; bellek ortalama PHP tepesidir. Kalın değerler tam sayıda ≥2,000 veya ≤0,500 farktır; yuvarlama eşik yaratmaz. Reconcile her mimaride 0 olduğundan 0/0 oranı tanımsızdır.

İşlem Metrik A/B A/C B/C

| new_voucher | Süre | 0.511× | 0.458× | 0.896× |

| new_voucher | PHP CPU | 0.504× | 0.461× | 0.914× |

| new_voucher | Sorgu | 0.471× | 0.421× | 0.895× |

| new_voucher | PHP tepe | 0.867× | 0.812× | 0.938× |

| party_balance | Süre | 1927.289× | 2592.991× | 1.345× |

| party_balance | PHP CPU | 1.777× | 2.562× | 1.442× |

| party_balance | Sorgu | 1.000× | 1.000× | 1.000× |

| party_balance | PHP tepe | 0.933× | 0.875× | 0.938× |

| sequential_1000 | Süre | 0.565× | 0.506× | 0.897× |

| sequential_1000 | PHP CPU | 0.564× | 0.509× | 0.901× |

| sequential_1000 | Sorgu | 0.471× | 0.421× | 0.895× |

| sequential_1000 | PHP tepe | 0.933× | 0.875× | 0.938× |

| batch_1000 | Süre | 0.507× | 1.010× | 1.993× |

| batch_1000 | PHP CPU | 0.548× | 1.001× | 1.827× |

| batch_1000 | Sorgu | 0.467× | 0.998× | 2.139× |

| batch_1000 | PHP tepe | 0.938× | 0.938× | 1.000× |

| trial_balance | Süre | 623.976× | 846.765× | 1.357× |

| trial_balance | PHP CPU | 2.595× | 2.688× | 1.036× |

| trial_balance | Sorgu | 1.000× | 1.000× | 1.000× |

| trial_balance | PHP tepe | 0.938× | 0.938× | 1.000× |

| historical_reversal | Süre | 0.587× | 0.531× | 0.904× |

| historical_reversal | PHP CPU | 0.628× | 0.562× | 0.895× |

| historical_reversal | Sorgu | 0.526× | 0.476× | 0.905× |

| historical_reversal | PHP tepe | 0.938× | 0.938× | 1.000× |

| concurrent_8x250 | Süre | 0.079× | 0.131× | 1.658× |

| concurrent_8x250 | PHP CPU | 0.547× | 0.510× | 0.933× |

| concurrent_8x250 | Sorgu | 0.471× | 0.421× | 0.895× |

| concurrent_8x250 | PHP tepe | 0.938× | 0.938× | 1.000× |

En az 2× süre farklarının ayrıca listesi

Aşağıdakiler ortalama süre üzerinden tam hassasiyetle seçildi; hızlanan mimari önce yazılır.

Bulguların yorumu

5M tek fişte C 5,72 ms, B 5,13 ms, A 2,62 ms; sequential_1000’da da C, B’den yavaştır. 100k cari bakiyede A 0,49 ms ve B 0,62 ms olduğundan A’nın her okumada kaybettiği söylenemez. B/C okuma süreleri bu boyutlarda <1 ms kalır; anahtar lookup ve küçük aggregate üzerinden okuma büyük tabloyu toplama maliyetini önler, mutlak O(1) garantisi değildir. C’nin B’ye karşı yaklaşık 2× kazancı yalnız batch_1000’dadır: ortalama B/C oranları 100k’da 1,925×, 1M’de 1,970×, 5M’de 1,993×; tam hassasiyetle hiçbiri ≥2 değildir. 5M medyan oranı 1,984×’tür. Sorgu azalması 15002/7012=2,140×; B 8.000, C 11 aggregate upsert yapar. A’ya göre +11 sorgu türetilmiş bakımın sorgu bakımından neredeyse sıfır olduğunu gösterir, gerçek zaman/bellek maliyetinin sıfır olduğunu göstermez. Eşzamanlıda 5M A 750,03 ms, B 9524,16 ms, C 5743,44 ms. A türetilmiş satır yazmaz; ortak cari/hesap toplamlarında satır kilidi çekişmez. B küresel writer kilidiyle seri çalışır; C küresel B kilidini almaz ama aynı aggregate anahtarlarında satır kilidi bekler. C’nin B’ye yaklaşık 1,66× kazancı vardır, A’dan hâlâ çok yavaştır. Kilit açıklaması kod ve ortak anahtar yükünden çıkarımdır; ayrı bekleme süresi/profilleme ölçülmedi. Bu sonuç grafik algoritmasıyla kilit politikasının etkisini ayıramaz. CPU açısından 5M eşzamanlıda C 3816,3 ms ile B’nin 3562,2 ms değerinden yüksektir; duvar süresinin düşmesi CPU’nun da düşmesi değildir. PHP RAM tek fişte A/B/C 26/30/32 MiB, batch’te 30/32/32 MiB, eşzamanlıda 240/256/256 MiB; C lehine bellek kazancı yoktur. PostgreSQL belleği ve sunucu CPU’su eksik olduğundan kritik sorunun “toplam CPU ve RAM daha az” kısmı doğrulanmış değildir. Bütün seçili örneklerin reconcile, varsa cleanup reconcile ve final reconcile farkları sıfırdır. Reconcile ölçüm süresinin dışında çalışır. Tek cari ve sıcak yük, sabit mimari sırası, artan denetim izi, yalnız beş tekrar ve B/C’nin farklı kilit/türetilmiş düğüm yapısı genellemeyi sınırlar.

8. Yeni modelin avantajları ve dezavantajları

Artılar: ortak anahtarların toplu delta birleştirmesiyle daha az türetilmiş SQL; dönüşüm tanımlarının tek grafikte görünmesi; saf PHP çekirdeği; atomik ve yeniden oluşturulabilir türetilmiş sonuçlar; Redis kaybına dayanıklılık. Avantaj ölçülen toplu işte somuttur. Eksiler: tek fişte ek düğüm/yazım yükü; PHP delta belleği; sıcak anahtar kilitleri; graph/rebuild SQL tanımlarının ayrı tutulmasıyla sapma riski; yalnız toplamsal dönüşümler; eksik şube/PB boyutları; idempotent project checkpoint’i bulunmaması. Nonlinear hesaplar, silmeler, kur farkı ve kapanış süreçleri için ilave tasarım gerekir. B aynı birleştirme tekniğiyle bu farkı kapatabilir. Yeni adlandırma yeni mimari icadı değildir.

9. ERP sistemine aşamalı entegrasyon planı

  1. Veridia’da mevcut yazma yolunu koru; hesap boyutlarını, dönem/şube/PB kurallarını ve ters kayıt semantiğini tanımla. Deney tablolarını canlıya taşımadan gölge okuma projeksiyonu ve idempotent olay checkpoint’i tasarla.
  2. İzole gölge tabloları temel hareketlerden oluştur; işlem sonrası veya kapanışlarda reconcile ile mevcut ERP sonuçlarına karşılaştır. Her farkı durdurucu kabul et; cache değil temel hareket otorite olsun.
  3. Önce okuma tarafını sınırlı şirket/dönemde dene; geri dönüşte mevcut sorgulara dön. Outbox tüketimi varsa transaction ve tekrar teslim davranışı ayrıca doğrulansın.
  4. Sonra e-fatura içe aktarma, açılış fişi, kur farkı gibi ortak anahtarlı toplu işlerde C’yi değerlendir; fiş boyutu/anahtar dağılımına göre sınırla. Kur farkı prototipte tamamlanmış değildir. Tek fiş yolunda B kalabilir.
  5. Eşzamanlı yük, soğuk/sıcak cache, farklı anahtar dağılımı, tam boyut izolasyonu, yetki ve kapanış/yuvarlama testleri ile karar ver. Bu plan bir öneridir; bu görev hiçbir canlı değişiklik veya dağıtım yapmaz.

10. Mimariyi diğer ERP modüllerinde yeniden kullanma imkânı

Stokta kök hareketin anahtarı şirket×depo×ürün×lot olabilir; giriş/çıkış deltaları miktar, rezervasyon ve kullanılabilir stoğa yayılır. Negatif stok, seri numarası, FIFO/ağırlıklı maliyet gibi sıra bağımlı hesaplar basit toplama grafiğine indirgenemez; yeniden hesaplanacak sınır ayrıca tanımlanmalıdır. Bordroda çalışan×dönem×kazanç/kesinti anahtarları ortak toplamları besleyebilir; kümülatif matrah, dilim eşikleri ve geçmiş dönem düzeltmesi saf toplamsal değildir. Graph/Node yeniden kullanılabilir; muhasebe Definitions doğrudan taşınmaz. Bu modüller için performans veya doğruluk ölçümü yapılmadı.