8.8 KiB
Analiza parametru pMaxFileSize dla DATA_EXPORTER.EXPORT_TABLE_DATA_TO_CSV_BY_DATE
Pytanie
Jaki maksymalnie można ustawić parametr pMaxFileSize przy pParallelDegree => 1 w procedurze CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_TO_CSV_BY_DATE?
Odpowiedź
Limity Oracle DBMS_CLOUD.EXPORT_DATA
UWAGA: Komentarz w kodzie źródłowym (DATA_EXPORTER.pkb, linia 444-449) zawiera BŁĘDNĄ informację o maksymalnym limicie 1GB.
-- Oracle maxfilesize: min 10MB (10485760), max 1GB (1073741824), default 10MB -- NIEPRAWIDŁOWE!
-- NOTE: maxfilesize must be NUMBER (bytes), not string like '1000M'
-- Using 100MB (104857600) to avoid PGA memory issues with large files
Rzeczywiste limity Oracle (zweryfikowane testami 2026-02-05):
- Minimum: 10 MB (10,485,760 bajtów)
- Maksimum: 4,294,967,295 bajtów (4 GB - 1 bajt) = 2^32 - 1 (unsigned 32-bit integer max)
- Wartość = 4GB (4,294,967,296): ORA-01426 numeric overflow
Test Environment
- Oracle Database: Oracle AI Database 26ai Enterprise Edition Release 23.26.1.1.0
- PGA Configuration:
- pga_aggregate_target: 3000M (3GB)
- pga_aggregate_limit: 6000M (6GB) - hard limit
- Test Dataset: OU_CSDB.LEGACY_DEBT table (1,014,078 rows)
- OCI Object Storage: eu-frankfurt-1 region
Wartości graniczne
| Parametr | Wartość (bajty) | Wartość (MB/GB) | Status |
|---|---|---|---|
| Minimum | 10,485,760 | 10 MB | Oracle minimum |
| Aktualny standard | 104,857,600 | 100 MB | Używane w kodzie |
| Zalecane bezpieczne (parallel) | 524,288,000 | 500 MB | Dla pParallelDegree > 1 |
| Zalecane bezpieczne (sequential) | 1,073,741,824 | 1 GB | Dla pParallelDegree = 1 |
| Maksimum Oracle | 4,294,967,295 | ~4 GB | 2^32 - 1 (unsigned 32-bit max) |
| Błąd numeric overflow | 4,294,967,296 | 4 GB | ORA-01426 (dokładnie 2^32) |
Odpowiedź na pytanie
Maksymalna wartość pMaxFileSize przy pParallelDegree => 1:
pMaxFileSize => 1073741824 -- 1 GB (1,073,741,824 bajtów)
Przykład użycia z maksymalną wartością
BEGIN
CT_MRDS.DATA_EXPORTER.EXPORT_TABLE_DATA_TO_CSV_BY_DATE(
pSchemaName => 'OU_CSDB',
pTableName => 'LEGACY_DEBT',
pKeyColumnName => 'A_ETL_LOAD_SET_FK',
pBucketArea => 'DATA',
pFolderName => 'ODS/CSDB/CSDB_DEBT',
pMinDate => DATE '2024-01-01',
pMaxDate => SYSDATE,
pParallelDegree => 1, -- Sequential processing
pTemplateTableName => 'CT_ET_TEMPLATES.CSDB_DEBT',
pMaxFileSize => 1073741824 -- 1GB - MAXIMUM możliwa wartość
);
END;
/
Rekomendacje
Dla pParallelDegree => 1 (przetwarzanie sekwencyjne)
-
Maksimum bezwzględne: 1 GB (1,073,741,824 bajtów)
- To jest twardy limit Oracle DBMS_CLOUD.EXPORT_DATA
- Wartości powyżej 1GB spowodują błąd Oracle
-
Zalecane wartości w zależności od scenariusza:
- Małe tabele (< 1M rekordów): 100 MB (104,857,600) - aktualny standard
- Średnie tabele (1-10M rekordów): 250 MB (262,144,000)
- Duże tabele (> 10M rekordów): 500 MB (524,288,000)
- Bardzo duże tabele z dużą ilością RAM: 1 GB (1,073,741,824)
-
Kwestie pamięciowe (PGA):
- W komentarzu kodu widoczne jest ostrzeżenie: "avoid PGA memory issues"
- Przy
pParallelDegree => 1(brak równoległości), ryzyko błędu ORA-04036 jest niższe - Można bezpiecznie używać wyższych wartości niż przy przetwarzaniu równoległym
Dla pParallelDegree > 1 (przetwarzanie równoległe)
- Maksimum techniczne: nadal 1 GB
- Zalecane: 100-200 MB z powodu pamięci PGA
- Aktualny standard: 100 MB (bezpieczna wartość)
Różnice względem przetwarzania równoległego
| Aspekt | pParallelDegree = 1 | pParallelDegree > 1 |
|---|---|---|
| Maksimum Oracle | 1 GB | 1 GB |
| Zalecane max | 500 MB - 1 GB | 100-200 MB |
| Ryzyko ORA-04036 | Niskie | Wysokie (wiele procesów) |
| Użycie PGA | Pojedynczy proces | Wielokrotne procesy |
Skrypty testowe
Przygotowano dwa skrypty testowe:
1. Pełny test (7 scenariuszy)
Plik: MARS_Packages/tests/test_maxfilesize_parameter.sql
- Test z wartościami: 10MB, 100MB, 250MB, 500MB, 750MB, 1GB, 1.5GB
- Automatyczne czyszczenie testowych plików
- Szczegółowe logowanie wyników
2. Szybki test (maksimum)
Plik: MARS_Packages/tests/test_maxfilesize_quick.sql
- Jednorazowy test z maksymalną wartością 1GB
- Szybka weryfikacja poprawności konfiguracji
Uruchomienie testów
# Pełny test wszystkich wartości
Get-Content "MARS_Packages\tests\test_maxfilesize_parameter.sql" | sql "CT_MRDS/Cloudpass#34@ggmichalski_high"
# Szybki test maksymalnej wartości
Get-Content "MARS_Packages\tests\test_maxfilesize_quick.sql" | sql "CT_MRDS/Cloudpass#34@ggmichalski_high"
Wnioski (zaktualizowane 2026-02-05)
-
Maksymalna wartość Oracle dla
pMaxFileSizewynosi 4,294,967,295 bajtów (4 GB - 1 bajt)- To jest 2^32 - 1 = maksymalna wartość unsigned 32-bit integer
- Wartość >= 4,294,967,296 (dokładnie 4GB) powoduje ORA-01426 numeric overflow
- Komentarz w kodzie źródłowym o limicie 1GB jest NIEPRAWIDŁOWY
-
Zalecana wartość dla pParallelDegree = 1 (sequential): 1-2 GB
- Niskie ry~4GB można używać dla bardzo dużych tabel (teoretycznie)cyjnym
- Maksimum 3GB można używać dla bardzo dużych tabel
-
Zalecana wartość dla pParallelDegree > 1 (parallel): 100-500 MB
- Wysokie ryzyko ORA-04036 przy wielu wątkach i dużych wartościach
- Aktualny standard 100MB jest bezpieczny ale konserwatywny
-
Weryfikacja testowa (2026-02-05):
- 1GB (1,073,741,824): ✅ DZIAŁA
- 2GB (2,147,483,648): ✅ DZIAŁA
- 3GB (3,221,225,472): ✅ DZIAŁA
- 3.5GB (3,758,096,384): ✅ DZIAŁA
- 3.9GB (4,187,593,113): ✅ DZIAŁA
- 3.99GB (4,284,481,126): ✅ DZIAŁA
- 4GB - 1 bajt (4,294,967,295): ✅ DZIAŁA - MAKSIMUM ORACLE (2^32 - 1)
- 4GB (4,294,967,296): ❌ ORA-01426 numeric overflow (2^32)
- 5GB+: ❌ ORA-01426 numeric overflow
-
Test z pojedynczym wątkiem (2026-02-05):
- pMaxFileSize = 4,294,967,295, pParallelDegree = 1, 60 partycji
- Result: ❌ ORA-04036 (PGA memory exceeded - limit 6GB)
- Wniosek: Parametr jest akceptowany, ale sekwencyjne przetwarzanie wielu partycji przekracza limit PGA
- Dla 60+ partycji używaj pParallelDegree=4 zamiast 1
Kod źródłowy - fragment kluczowy
Z pliku DATA_EXPORTER.pkb, procedura EXPORT_SINGLE_PARTITION:
-- Use json_object() for CSV export with maxfilesize in bytes (Oracle requirement)
-- Oracle maxfilesize: min 10MB (10485760), max 1GB (1073741824), default 10MB
-- NOTE: maxfilesize must be NUMBER (bytes), not string like '1000M'
-- Using 100MB (104857600) to avoid PGA memory issues with large files
DBMS_CLOUD.EXPORT_DATA(
credential_name => pCredentialName,
file_uri_list => vUri,
query => vQuery,
format => json_object(
'type' VALUE 'CSV',
'header' VALUE true,
'quote' VALUE CHR(34),
'delimiter' VALUE ',',
'escape' VALUE true,
'recorddelimiter' VALUE CHR(13)||CHR(10),
'maxfilesize' VALUE pMaxFileSize -- Dynamic maxfilesize in bytes
)
);
(1,073,741,824): ✅ Sukces
- Test 2GB (2,147,483,648): ✅ Sukces - komentarz w kodzie BŁĘDNY
- Test 3GB (3,221,225,472): ✅ Sukces
- Test 3.5GB (3,758,096,384): ✅ Sukces
- Test 3.75GB (4,026,531,840): ✅ Sukces
- Test 3.9GB (4,187,593,113): ✅ Sukces
- Test 3.99GB (4,284,481,126): ✅ Sukces
- Test 4GB - 1 bajt (4,294,967,295): ✅ Sukces - MAKSIMUM = 2^32 - 1
- Test 4GB (4,294,967,296): ❌ ORA-01426 numeric overflow (dokładnie 2^32)
- Test 5GB+: ❌ ORA-01426 numeric overflow
- Test 4GB-1 + parallel=1 + 60 partycji: ❌ ORA-04036 PGA memory exceeded
Konkluzja: Komentarz w DATA_EXPORTER.pkb o maksymalnym limicie 1GB był nieprawidłowy. Rzeczywiste maksimum Oracle DBMS_CLOUD.EXPORT_DATA to 4,294,967,295 bajtów (4 GB - 1 bajt), co odpowiada maksymalnej wartości unsigned 32-bit integer (2^32 - 1). Jednakże, w środowisku Autonomous Database z limitami PGA (pga_aggregate_limit=6GB), sekwencyjne przetwarzanie dużej liczby partycji (60+) może przekroczyć limit pamięci nawet z poprawną wartością parametru
- Test 3GB: ✅ Sukces - rzeczywiste maksimum Oracle
- Test 4GB: ❌ ORA-01426 numeric overflow
- Test 5GB+: ❌ ORA-01426 numeric overflow
Konkluzja: Komentarz w DATA_EXPORTER.pkb o maksymalnym limicie 1GB był nieprawidłowy. Rzeczywiste maksimum Oracle DBMS_CLOUD.EXPORT_DATA to 3 GB.
2026-02-04 - Analiza początkowa
Pierwsza wersja dokumentacji oparta na komentarzach w kodzie źródłowym.