# 큰 파일과 기능 제한 — Nexa SQL이 크기에 따라 무엇을 끄는가 > 사용자용 설명입니다. 기술 원장(근거 코드 · 실측)은 저장소의 [docs/72](../72-size-limits-and-large-file-constraints.md). Nexa SQL은 SQL 스크립트가 커지면 **탭마다** 단계를 정하고, 그 단계에서 부담이 큰 부가 기능을 자동으로 끕니다. 편집·선택·찾기·실행은 어느 크기에서도 그대로 됩니다 — 꺼지는 것은 "보기 좋게 해 주는" 기능뿐입니다. ## 1. 단계는 이렇게 정해집니다 | 단계 | 기준(둘 중 하나라도 넘으면) | 기본값 | |---|---|---| | 보통 | — | — | | **L1** | 파일 크기 **또는** 줄 수 | **5 MB** / **100,000줄** | | **L2** | 파일 크기 또는 줄 수 | **20 MB** / **300,000줄** | | 열기 전에 묻기 | 파일 크기 | **50 MB** | - 단계는 파일을 **열 때와 저장할 때** 다시 정합니다. 열 때 상태줄에 안내가 뜨고, 그 탭이 활성인 동안 상태줄 오른쪽에 `L1`/`L2` 표식이 늘 보입니다. - 기준 바꾸기: 설정 창 ▸ **Files** ▸ "Large file L1/L2 (MB · lines)" 또는 CLI `nsql config set file.large_l1_mb 10` · `nsql config set file.large_l2_lines 500000` - **이 탭만 전부 켜고 싶으면**: 명령 팔레트(Ctrl+Shift+P) ▸ *Toggle Large File Optimizations (This Tab)* — 상태줄의 `L1`/`L2` 표식이 사라지고 모든 기능이 켜집니다(다음에 열거나 저장할 때까지 유지). ## 2. 단계별로 꺼지는 기능 | 기능 | L1부터 | L2부터 | 바꾸는 설정 | |---|---|---|---| | 미니맵 | 끔 | 끔 | (단계 고정 · 보통 크기에서도 4,000줄까지만 그림) | | 같은 단어 상자(선택어 강조) | 끔 | 끔 | 단계 고정 | | 줄 변경 표시(거터 띠) | 끔 | 끔 | 단계 고정 | | 괄호 색·짝 표시(Rainbow Pairs 확장) | 끔 | 끔 | `file.large_ext_level` = `0`(제한 없음) / `l1` / `l2` · 확장 자체 상한 `rainbowpair.max_kb`(기본 0 = 단계 따름) | | **구문 강조** | 켬 | **끔**(평문) | `file.large_syntax_level` = `0` / `l1` / `l2` | | 재시작 뒤 되돌리기(기록 파일) | 저장 안 함 | 저장 안 함 | 단계 고정(`editor.undo_persist_mb` 4 MB 이하 파일만) | | 외부에서 바뀐 파일 자동 병합 | 고치지 않았으면 그대로 다시 읽음 · 고쳤으면 어떻게 할지 물음 | 같음 | `file.external_merge_max_kb`(2 MB) | ## 3. 크기와 무관하게 늘 걸리는 상한 | 동작 | 상한 | 넘으면 | 설정 | |---|---|---|---| | 큰 선택 위에 타이핑·붙여넣기·삭제 | 한 번에 지우는 글자 **32 MB** | 먼저 안내가 뜨고, 같은 동작을 **한 번 더** 하면 실행 | `editor.undo_giant_mb`(0 = 안 물음) | | 다중 선택 구간 수(Ctrl+D · Alt+F3 · Ctrl+클릭 · Split into Lines · 열 선택) | **10,000개** | 거기서 멈추고 상태줄에 안내 | `editor.max_occurrences` | | 큰 선택 복사/잘라내기(Ctrl+C/X) | **32 MB** | 첫 누름은 안내, 3초 안에 다시 누르면 실행 | `editor.copy_confirm_mb`(0 = 안 물음) | | 되돌리기 메모리 | **64 MB** · 1,000 단계 | 오래된 단계부터 버림 | `editor.undo_budget_mb` · `editor.undo_max` | | 선택 되돌리기(Ctrl+U) | 500 단계 | 오래된 단계부터 버림 | — | | 파일 검색(Find in Files) | 파일 하나 **1 MB** | 그 파일은 건너뜀 | `search.max_file_kb` | | 결과 자동 페치 | **200행**씩 | 스크롤 끝에서 다음 200행 · Σ = 건수 · 전체 조회 버튼 | `grid.max_rows` | | 결과 메모리 | **1 GB** | 페치를 멈추고 안내 | `grid.memory_budget_mb` | | 결과 탭 | **8개** | 고정하지 않은 오래된 탭부터 닫힘 | `grid.result_tabs_max` | | 실행 카드 | **30장**(향상 모드 8) | 끝난 카드부터 사라짐 | `run.toast_max` | | 변수 값 | **1 MB** | 잘라 저장 + 안내 | `vars.max_value_kb` | | 프로젝트 폴더 열거 | 폴더당 **5,000** | "… 더 있음" | `project.scan_max` | | 파일 열기 다중 선택 | **10개** | 초과분은 제외 표시 | `file.open_max` | ## 4. 제한 없이 되는 것(궁금해할 만한 것) - **전체 선택(Ctrl+A)** · 드래그·Shift 선택 · 다중 캐럿 · 열 선택 — 어떤 크기든 즉시. 선택은 "시작·끝" 두 위치일 뿐이고 화면에 보이는 줄만 그리기 때문입니다. 그 선택 위에 편집하면 위 **32 MB 확인**이 한 번 막아 줍니다. - **찾기/바꾸기**(찾기 막대) — 줄 단위로 검색해 65 MB 파일에서도 됩니다. - **실행** — 편집기에 싣지 않고 파일에서 바로 실행(File ▸ *Run SQL File…*)도 있습니다. 다만 이 경로와 CLI `nsql`은 파일을 **통째로 읽어** 문장으로 나누므로(스트리밍 없음) 메모리는 파일 크기의 2~3배가 잠시 필요합니다. ## 5. 50 MB가 넘으면 열기 전에 묻습니다 | 선택 | 뜻 | |---|---| | 그대로 열기 | L2로 엽니다(위 표대로 부가 기능 끔) | | 앞부분만 8 MB | 읽기 전용으로 앞부분만(`file.large_head_mb`) | | 읽기 전용으로 열기 | 실수로 고치지 않게 | | 열지 않고 실행 | 편집기에 싣지 않고 실행만 | 묻지 않게 하려면 `nsql config set file.large_ask_mb 0`. ## 6. 성능 향상 모드와의 차이 설정 ▸ *Performance boost*(`perf.boost`)는 **모든 탭**에서 미니맵·강조·애니메이션 등을 끄는 전역 스위치이고, 위 단계는 **그 파일 하나의 크기**로 정해집니다. 둘 다 켜져 있으면 둘 다 꺼진 상태가 됩니다. ## 7. 메모리 사용량 보기 상태줄 오른쪽의 **`NN MB`** 가 이 앱의 메모리 총량(맥 = 활성 상태 보기의 "메모리" · Windows = Private Bytes)입니다. 클릭하면 **메모리 창**이 열립니다(View ▸ Memory Usage · 팔레트 "Memory Usage"). - 위 막대 = 총량을 100 %로 **데이터 영역(색)** 과 **기타(회색 · 런타임·라이브러리)** 의 비율. - **Data** = 결과 데이터 · 결과 텍스트 캐시 · 편집기 본문 · 되돌리기 기록 · 편집기 그리기 캐시 · 메타(탐색기·완성) · 완성 · 로그 · 창 표면 · 아이콘 캐시. 값은 어림입니다. - **System** = 풋프린트 · 상주 · 익명(힙·스택) · 파일 매핑(라이브러리·글꼴) · 압축 · 힙 사용 중 · 힙 여유(예약·가상). - 창이 열려 있는 동안 **1초마다**(설정 `mem.refresh_ms`) 갱신되고, 닫으면 아무것도 돌지 않습니다. **Top** 스위치 = 다른 창 위에 고정(설정 `mem.always_on_top`). 상태줄 숫자를 끄려면 `mem.statusbar`.