Deney özeti
5.324.000
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
C gerçekten yeni mi?
Sonuç
- 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.
- 5M toplu yazım ortalaması C 2036,90 ms, B 4059,43 ms: 1,99×; CPU 726,59 / 1327,49 ms: 1,83×.
- 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.
- Tek fişte C, B’den yavaş: 5M ortalaması 5,72 / 5,13 ms; A 2,62 ms ile en hızlı yazar.
- 5M cari bakiye A yaklaşık 1,29 sn, mizan 436 ms; B/C bu okumaları 1 ms altında tutar.
- 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.
- 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.
- C bellek avantajı göstermedi; PostgreSQL backend belleği ölçülemedi, toplam sistem CPU tüketimi ölçülmedi.
- 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.
- 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ı):
-
CREATE UNIQUE INDEX deney_accounts_pkey ON public.deney_accounts USING btree (code) -
CREATE UNIQUE INDEX deney_aggregates_pkey ON public.deney_aggregates USING btree (architecture, node, key) -
CREATE UNIQUE INDEX deney_branches_pkey ON public.deney_branches USING btree (id) -
CREATE UNIQUE INDEX deney_companies_pkey ON public.deney_companies USING btree (id) -
CREATE UNIQUE INDEX deney_currencies_pkey ON public.deney_currencies USING btree (code) -
CREATE INDEX deney_lines_account_voucher ON public.deney_lines USING btree (account, voucher_id) -
CREATE INDEX deney_lines_party_voucher ON public.deney_lines USING btree (party_id, voucher_id) WHERE (party_id IS NOT NULL) -
CREATE UNIQUE INDEX deney_lines_pkey ON public.deney_lines USING btree (id) -
CREATE INDEX deney_lines_voucher ON public.deney_lines USING btree (voucher_id) -
CREATE UNIQUE INDEX deney_outbox_pkey ON public.deney_outbox USING btree (id) -
CREATE INDEX deney_parties_company ON public.deney_parties USING btree (company_id) -
CREATE UNIQUE INDEX deney_parties_pkey ON public.deney_parties USING btree (id) -
CREATE UNIQUE INDEX deney_periods_pkey ON public.deney_periods USING btree (id) -
CREATE UNIQUE INDEX deney_trial_balance_key ON public.deney_trial_balance USING btree (company_id, period_id, account) -
CREATE INDEX deney_vouchers_company_period_date ON public.deney_vouchers USING btree (company_id, period_id, date) WHERE ((status)::text = 'posted'::text) -
CREATE INDEX deney_vouchers_date ON public.deney_vouchers USING btree (date) WHERE ((status)::text = 'posted'::text) -
CREATE UNIQUE INDEX deney_vouchers_idempotency_key_key ON public.deney_vouchers USING btree (idempotency_key) -
CREATE UNIQUE INDEX deney_vouchers_pkey ON public.deney_vouchers USING btree (id) -
CREATE UNIQUE INDEX deney_vouchers_reversal_of_key ON public.deney_vouchers USING btree (reversal_of)
Ö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):
- tests/Feature/Deney/AccountingTest.php: A/B/C satış sonuçları, dengesiz fişin atomik reddi, kapalı dönem, idempotency, geçmiş dönem ters kayıt/yenileme, EUR half-up yuvarlama, yeniden oluşturma, doğrudan SQL denge koruması, bozulma tespiti/onarımı, kesinleşmiş satır değişim/silme engeli, Redis kaybı, etkisiz düğüm ve batch birleştirme, B’nin MV yenilememesi ve account toplamından mizan.
- tests/Feature/Deney/ConcurrencyTest.php: dört süreç aynı cariye yazar; kayıp güncelleme, sonuç ve reconcile kontrol edilir; pcntl gerektirir.
- tests/Feature/Deney/MeasurementTest.php: ölçüm filtresi, ısınma/ilerleme, ölçülemeyen PG belleği, mutabakat ve geçersiz filtre.
- tests/Feature/DeneyEkran/EkranTest.php: beş sayfa 200, tek satış/ters kayıt, A/B/C eşit bakiye, varsayılan akışta en fazla dört karar (üç işaretli alan).
- T3 için yazılan ek testler: her başlangıç mimarisinden post + diğerlerine project, temel satır/fiş/outbox tekrar yazılmaması, ters kayıt sonrası sıfır bakiye ve tüm reconcile farklarının sıfır olması; /dene ve ters kayıtta rebuild olmaması, üç ayrı ölçümün sonuçta gösterilmesi. Özellikle istenen post(B)+project(C)+project(A) veri sağlayıcısında kapsanır. Test izolasyonu DeneyTestCase içinde muhasebe_deney_test PostgreSQL veritabanını zorunlu kılar. Test tanımı varlığı geçme sonucu değildir. Dönem kapanışı reddi sınanır; kur farkı iş akışı, tam bilanço, yetkili düzeltme ve bütün çok boyutlu rapor senaryoları uygulanmış/test edilmiş sayılmaz.
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.
-
100000 / new_voucher: A, C karşısında 2.117× hızlı.
-
100000 / sequential_1000: A, C karşısında 2.001× hızlı.
-
100000 / trial_balance: B, A karşısında 34.641× hızlı.
-
100000 / trial_balance: C, A karşısında 43.210× hızlı.
-
100000 / historical_reversal: A, C karşısında 2.169× hızlı.
-
100000 / concurrent_8x250: A, B karşısında 12.467× hızlı.
-
100000 / concurrent_8x250: A, C karşısında 7.491× hızlı.
-
1000000 / new_voucher: A, C karşısında 2.194× hızlı.
-
1000000 / party_balance: B, A karşısında 98.706× hızlı.
-
1000000 / party_balance: C, A karşısında 135.830× hızlı.
-
1000000 / trial_balance: B, A karşısında 125.858× hızlı.
-
1000000 / trial_balance: C, A karşısında 157.384× hızlı.
-
1000000 / concurrent_8x250: A, B karşısında 12.301× hızlı.
-
1000000 / concurrent_8x250: A, C karşısında 7.362× hızlı.
-
5000000 / new_voucher: A, C karşısında 2.185× hızlı.
-
5000000 / party_balance: B, A karşısında 1927.289× hızlı.
-
5000000 / party_balance: C, A karşısında 2592.991× hızlı.
-
5000000 / trial_balance: B, A karşısında 623.976× hızlı.
-
5000000 / trial_balance: C, A karşısında 846.765× hızlı.
-
5000000 / concurrent_8x250: A, B karşısında 12.698× hızlı.
-
5000000 / concurrent_8x250: A, C karşısında 7.658× hızlı.
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ı
- 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.
- İ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.
- Ö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.
- 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.
- 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ı.