diff --git a/apps/desktop/src/components/grid/DataGrid.vue b/apps/desktop/src/components/grid/DataGrid.vue index 8b823e205..0e50004d4 100644 --- a/apps/desktop/src/components/grid/DataGrid.vue +++ b/apps/desktop/src/components/grid/DataGrid.vue @@ -180,7 +180,7 @@ import { parseFilterValues, } from "@/lib/dataGrid/dataGridColumnFilter"; import { clampSearchSplitWidth } from "@/lib/dataGrid/dataGridSearchSplit"; -import { MAX_RESULT_PAGE_SIZE, MIN_RESULT_PAGE_SIZE, normalizeResultPageSize, resultPageSizeMenuOptions } from "@/lib/dataGrid/paginationPageSize"; +import { MIN_RESULT_PAGE_SIZE, normalizeResultPageSize, resultPageSizeMenuOptions } from "@/lib/dataGrid/paginationPageSize"; import { allNullColumnIndexes, filterColumnVisibilityOptions, hiddenColumnIndexesWithAllNullColumns, invertedHiddenColumnIndexes, nextHiddenColumnIndexes, removeAutoHiddenColumnIndexes, visibleColumnIndexesForFilter } from "@/lib/dataGrid/dataGridColumnVisibility"; import { buildDataGridColumnLookupItems, filterDataGridColumnLookupItems } from "@/lib/dataGrid/dataGridColumnLookup"; import { columnOrderKeysForIndexes, isDefaultColumnOrder, moveVisibleColumnIndex, orderedColumnIndexes, uniqueDataGridColumnOrderKeys } from "@/lib/dataGrid/dataGridColumnOrder"; @@ -11114,7 +11114,6 @@ const gridContextMenuItems = computed(() => { type="number" inputmode="numeric" :min="MIN_RESULT_PAGE_SIZE" - :max="MAX_RESULT_PAGE_SIZE" class="h-6 w-20 px-1.5 text-xs tabular-nums [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none" @keydown.enter.prevent.stop="applyCustomPageSize" /> diff --git a/apps/desktop/src/lib/dataGrid/paginationPageSize.ts b/apps/desktop/src/lib/dataGrid/paginationPageSize.ts index 4228c48e2..a0764c44b 100644 --- a/apps/desktop/src/lib/dataGrid/paginationPageSize.ts +++ b/apps/desktop/src/lib/dataGrid/paginationPageSize.ts @@ -1,15 +1,14 @@ export const RESULT_PAGE_SIZE_OPTIONS = [50, 100, 500, 1000]; export const DEFAULT_RESULT_PAGE_SIZE = 100; export const MIN_RESULT_PAGE_SIZE = 1; -export const MAX_RESULT_PAGE_SIZE = 100000; export function normalizeResultPageSize(value: unknown, fallback = DEFAULT_RESULT_PAGE_SIZE): number { - const fallbackValue = Number.isFinite(fallback) && fallback >= MIN_RESULT_PAGE_SIZE ? Math.min(Math.floor(fallback), MAX_RESULT_PAGE_SIZE) : DEFAULT_RESULT_PAGE_SIZE; + const fallbackValue = Number.isFinite(fallback) && fallback >= MIN_RESULT_PAGE_SIZE ? Math.floor(fallback) : DEFAULT_RESULT_PAGE_SIZE; const parsed = Number(value); if (!Number.isFinite(parsed)) return fallbackValue; const rounded = Math.floor(parsed); if (rounded < MIN_RESULT_PAGE_SIZE) return fallbackValue; - return Math.min(rounded, MAX_RESULT_PAGE_SIZE); + return rounded; } export function resultPageSizeMenuOptions(current: number): number[] { diff --git a/docs/performance/memory-usage-audit.md b/docs/performance/memory-usage-audit.md index fbd1a73aa..febb2c584 100644 --- a/docs/performance/memory-usage-audit.md +++ b/docs/performance/memory-usage-audit.md @@ -87,7 +87,7 @@ Chunk 体积不等于运行时内存,但能提示哪些功能首次打开会 3. 客户端搜索增加上限和渐进式扫描,例如只扫描当前页或前 N 行,超限提示用户改用 SQL 查询。 4. 导出改成 streaming writer,不返回包含全量 rows 的 `QueryResult`。CSV/Excel/JSON 都应边拉边写,避免 `rows.push(...)` 聚合。 5. 缓存落盘时避免 `structuredClone`、row-to-column、encode 同时叠加;可用分块序列化,或在清空原始引用后再进行后台转换。 -6. 对 `MAX_RESULT_PAGE_SIZE` 做产品级收紧。当前最大可到 100,000 行,配合宽表和 DataGrid 派生数组会非常容易冲高内存。 +6. 取消分页条数 100000 硬性上限,支持全量查询场景;超大分页 + 宽表易引发内存暴涨,请按需合理使用。 ## 2. 数据对比 Data Compare diff --git a/packages/app-tests/settingsStore.test.ts b/packages/app-tests/settingsStore.test.ts index 82078f7c4..1b9bdc0d9 100644 --- a/packages/app-tests/settingsStore.test.ts +++ b/packages/app-tests/settingsStore.test.ts @@ -44,7 +44,7 @@ async function withMockLocalStorage(initial: Record, run: () => test("normalizes saved query result page size", () => { assert.equal(DEFAULT_EDITOR_SETTINGS.pageSize, 100); assert.equal(normalizeEditorSettings({ pageSize: 5000 }).pageSize, 5000); - assert.equal(normalizeEditorSettings({ pageSize: 200000 }).pageSize, 100000); + assert.equal(normalizeEditorSettings({ pageSize: 200000 }).pageSize, 200000); assert.equal(normalizeEditorSettings({ pageSize: 0 }).pageSize, 100); });