尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

KingbaseES数据迁移实战:从MySQL/Oracle导入导出与性能优化指南

KingbaseES数据迁移实战:从MySQL/Oracle导入导出与性能优化指南 1. 从一次数据迁移的“翻车”经历说起上周我接手了一个内部系统的数据库迁移任务源库是大家熟悉的MySQL目标库是客户指定的KingbaseES。任务听起来很简单把几十张表、几百万条数据加上视图和函数完整地搬过去。我心想这不就是mysqldump导出再用ksql导入的事儿吗结果第一个坑就来得猝不及防。直接用MySQL的SQL文件导入KingbaseES语法错误报了一屏幕从AUTO_INCREMENT到ENGINEInnoDB再到日期函数几乎步步是雷。这让我意识到虽然同属关系型数据库但KingbaseES作为一款源自PostgreSQL内核的国产数据库在语法、数据类型、系统函数乃至工具链上都有其独特的“脾气”。盲目套用其他数据库的经验只会事倍功半。因此我花了几天时间系统地梳理和测试了KingbaseES的各种数据导入导出方法。这篇文章就是这次“踩坑”与“填坑”过程的完整复盘。无论你是需要做数据库迁移、备份恢复还是日常的数据交换我希望这份结合了官方文档与实战经验的指南能帮你绕过我走过的弯路高效、准确地在KingbaseES与其他数据源之间架起桥梁。我们将不仅讨论“怎么做”更会深入“为什么这么做”以及在不同场景下“哪种做法更好”。2. 核心工具链解析官方“三板斧”与外部利器工欲善其事必先利其器。KingbaseES的数据搬运主要依赖以下几类工具理解它们的分工是成功的第一步。2.1 官方命令行工具sys_dump与sys_restore这是KingbaseES数据迁移的“瑞士军刀”地位等同于PostgreSQL的pg_dump/pg_restore。它们直接与数据库服务通信生成或读取自定义格式的归档文件是备份、迁移的首选。sys_dump 灵活的导出引擎它的强大之处在于无与伦比的灵活性。你可以通过丰富的参数精确控制导出的内容。# 导出整个数据库自定义格式支持并行和压缩 sys_dump -h 127.0.0.1 -p 54321 -U system -d mydb -F c -Z 6 -j 4 -f mydb.dump # 仅导出表结构-s sys_dump -h 127.0.0.1 -p 54321 -U system -d mydb -s -f schema.sql # 仅导出特定表的数据-a和表结构 sys_dump -h 127.0.0.1 -p 54321 -U system -d mydb -t public.employee -t public.department -f tables.dump # 导出为纯SQL脚本格式-F p兼容性最好但恢复时无法并行 sys_dump -h 127.0.0.1 -p 54321 -U system -d mydb -F p -f mydb.sql关键参数解读-F c 指定导出为“自定义”格式。这是强烈推荐的格式因为它支持压缩-Z、并行恢复-j、选择性恢复对象且恢复速度通常比纯SQL格式快。-Z 0-9 压缩级别。-Z 6是一个在压缩比和速度之间不错的平衡点。对于网络传输或存储空间紧张的场景这个参数非常有用。-j N 并行导出的作业数。这能显著加快导出大量表的速度但需要配合自定义格式-F c使用。-t schema.table 指定要导出的表。支持通配符如-t ‘public.temp_*’对于处理特定数据集非常方便。注意sys_dump默认导出的是逻辑备份即SQL语句的集合。它不直接复制物理文件因此可以在不同架构如x86到ARM、不同小版本之间迁移但恢复速度通常比物理备份慢。sys_restore 强大的恢复工具它与sys_dump生成的自定义格式.dump文件配对使用提供了比直接执行SQL脚本更强大的恢复能力。# 恢复整个数据库到新库先创建空数据库 createdb -h 127.0.0.1 -p 54321 -U system newdb sys_restore -h 127.0.0.1 -p 54321 -U system -d newdb -j 4 mydb.dump # 仅恢复表结构-s sys_restore -h 127.0.0.1 -p 54321 -U system -d newdb -s mydb.dump # 仅恢复数据-a假设表结构已存在 sys_restore -h 127.0.0.1 -p 54321 -U system -d newdb -a mydb.dump # 恢复时重命名模式schema-n old_schema -N new_schema sys_restore -h 127.0.0.1 -p 54321 -U system -d newdb -n public -N new_public mydb.dump关键参数解读-j N并行恢复。这是恢复大数据量时提升性能最关键的特性能将恢复时间缩短数倍。同样仅支持自定义格式。-l 列出归档文件中的内容。在恢复前先用sys_restore -l file.dump list.txt查看内容是个好习惯。-L list_file 根据列表文件仅恢复指定的对象。这在从完整备份中提取部分数据时非常有用。实战心得对于生产环境的全量备份和迁移我的标准流程是使用sys_dump -F c -Z 6 -j [cpu核心数]进行导出。恢复时先在新环境创建数据库然后使用sys_restore -j [cpu核心数]进行恢复。这能在保证数据完整性的前提下最大化利用硬件资源缩短停机时间窗口。2.2 SQL命令COPY与\copy当需要与外部文本文件CSV TXT进行高效数据交换时COPY命令是性能之王。它在数据库服务端直接读写文件速度极快。-- 将表数据导出到服务器本地CSV文件需要超级用户权限或具有该目录写权限的用户 COPY employee TO ‘/var/lib/kingbase/data/employee.csv‘ WITH CSV HEADER; -- 从服务器本地CSV文件导入数据到表 COPY employee FROM ‘/var/lib/kingbase/data/employee.csv‘ WITH CSV HEADER;COPY的限制与\copy的替代COPY命令要求输入/输出文件位于数据库服务器的文件系统上并且执行用户有相应的文件系统权限。这在很多管理严格的场景下不方便。这时可以使用ksql元命令\copy。它在功能上与COPY类似但文件路径是相对于客户端的数据流通过客户端连接传输因此不要求服务器端的文件权限。# 在ksql命令行中执行 \copy (SELECT * FROM employee WHERE dept_id10) TO ‘./dept10_employees.csv‘ WITH CSV HEADER \copy department FROM ‘./new_departments.csv‘ WITH CSV DELIMITER ‘|‘ NULL ‘NULL‘COPY/\copy的关键WITH选项FORMAT csv/WITH CSV 指定CSV格式。HEADER 文件第一行是列名。DELIMITER ‘|’ 指定分隔符默认为逗号。NULL ‘NULL’ 指定文件中表示NULL值的字符串。ENCODING ‘UTF8’ 指定文件编码处理中文等非ASCII字符时至关重要。踩坑记录我曾遇到用COPY导入数据时所有中文字符都变成了乱码。原因是源文件是GBK编码而数据库和COPY命令默认使用UTF8。解决方案是在COPY命令中明确指定源文件编码COPY ... FROM ... WITH (FORMAT csv, HEADER true, ENCODING ‘GBK‘);。这是一个非常典型的字符集问题在跨环境数据交换时务必优先检查。2.3 图形化工具KStudio 与 DBeaver对于不习惯命令行的开发者或DBA图形化工具提供了更直观的操作界面。KingbaseES KStudio这是金仓官方的集成管理开发环境。其“导入/导出”向导功能非常直观支持从SQL脚本、CSV/Excel文件导入也能将数据导出为多种格式。它的优点是与KingbaseES兼容性最好能自动处理一些数据类型映射。对于一次性、小批量的数据操作或者需要预览数据再操作的情况KStudio非常方便。但处理超大规模数据时其稳定性和性能可能不如命令行工具。DBeaver社区版这是一款功能强大且免费的通用数据库工具。通过安装KingbaseES的JDBC驱动可以完美连接并管理KingbaseES。DBeaver的“数据传输”和“数据导出”功能极其强大数据传输 可以在不同数据库之间如MySQL - KingbaseES Oracle - KingbaseES直接迁移表和数据。DBeaver会在内部进行数据类型映射、SQL语法转换虽然不完美但能解决大部分基础表的迁移问题是异构数据库迁移的“第一块敲门砖”。数据导出 可以将查询结果或整表数据导出为CSV、JSON、SQL、Excel、XML等多种格式且支持复杂的导出设置如分页、编码、日期格式。工具选型建议大规模备份/迁移/异构迁移首选sys_dump/sys_restore。与应用程序或外部系统进行文本文件交换首选COPY/\copy命令。快速查看、编辑、小批量导入导出数据首选DBeaver。简单的日常管理或初学者可以使用KStudio。3. 实战迁移场景从其他数据库到KingbaseES这是最具挑战性也是最常见的场景。我们不能直接使用源数据库的备份文件必须经过“转译”过程。3.1 从 MySQL / MariaDB 迁移这是国内非常常见的迁移路径。两者语法差异较大需要系统性地处理。步骤一使用 mysqldump 进行“兼容模式”导出目标是生成尽可能接近标准SQL减少MySQL特有语法的文件。mysqldump -h [mysql_host] -u [user] -p[password] \ --compatiblepostgresql \ --no-create-db \ --no-set-names \ --skip-lock-tables \ --skip-quote-names \ --skip-tz-utc \ --complete-insert \ --routines \ [database_name] mysql_dump.sql参数解析--compatiblepostgresql 尝试生成对PostgreSQL及KingbaseES更友好的语法。--no-create-db 不生成创建数据库的语句。--no-set-names/--skip-tz-utc 避免生成设置字符集、时区的语句这些在KingbaseES中可能不适用或语法不同。--complete-insert 在INSERT语句中包含列名提高可读性和容错性。--routines 导出存储过程和函数这部分转换最麻烦。步骤二手动修正SQL脚本导出的SQL文件必须经过人工审查和修正。这是一个繁琐但无法完全避免的步骤。主要修正点包括**反引号()** MySQL使用反引号引用标识符KingbaseES使用双引号(”)。需要全局替换。sed -i “s//“/g“ mysql_dump.sqlAUTO_INCREMENT 替换为KingbaseES的序列SERIAL或IDENTITY。将INT AUTO_INCREMENT PRIMARY KEY改为SERIAL PRIMARY KEY。或者更现代的方式是使用GENERATED BY DEFAULT AS IDENTITY(兼容SQL:2003标准)。引擎声明 删除ENGINEInnoDB、CHARSETutf8mb4等MySQL特有的表选项。注释语法 MySQL的#注释需改为--。函数与类型DATETIME-TIMESTAMPLONGTEXT-TEXT(KingbaseES的TEXT类型容量足够)UNSIGNED属性 KingbaseES没有需要移除并考虑用CHECK约束确保非负。ON UPDATE CURRENT_TIMESTAMP KingbaseES的触发器机制不同需要手动创建触发器来实现。-- KingbaseES中实现自动更新时间的触发器示例 CREATE OR REPLACE FUNCTION update_modified_column() RETURNS TRIGGER AS $$ BEGIN NEW.update_time CURRENT_TIMESTAMP; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER update_employee_modtime BEFORE UPDATE ON employee FOR EACH ROW EXECUTE FUNCTION update_modified_column();存储过程/函数 这是重灾区。MySQL的语法DELIMITER,BEGIN ... END块与KingbaseES的PL/SQL或PL/pgSQL差异很大几乎需要重写。建议先迁移结构和数据函数逻辑后续根据业务重写。步骤三在KingbaseES中创建数据库并导入# 使用ksql连接到KingbaseES创建数据库和用户 ksql -h 127.0.0.1 -p 54321 -U system -d test CREATE DATABASE target_db OWNER target_user; \q # 使用ksql执行修正后的脚本 ksql -h 127.0.0.1 -p 54321 -U target_user -d target_db -f corrected_mysql_dump.sql3.2 从 Oracle 迁移Oracle到KingbaseES的迁移通常在企业去“O”过程中发生。两者都是功能强大的大型数据库但架构和语法迥异。核心工具Oracle 的 exp/imp 或 expdp/impdp 并不直接适用。主流方法是使用 Oracle 的 SQL Developer 或第三方工具 Oracle SQL Developer 提供了“迁移工作台”可以连接到Oracle自动将表结构、数据、视图、序列等转换为兼容KingbaseES通过PostgreSQL网关的SQL脚本并进行初步的数据类型映射。这是官方推荐的起点。通过 CSV 文件中转 这是最“笨”但最可靠的方法。在Oracle中使用UTL_FILE包或SQL*Plus的SPOOL命令将每张表的数据以CSV格式导出。在KingbaseES中创建对应的表结构注意数据类型映射如NUMBER-NUMERIC/INTEGER,VARCHAR2-VARCHAR,DATE-TIMESTAMP。使用KingbaseES的COPY命令导入CSV文件。使用专业的ETL/数据同步工具 如Apache NiFi,Talend, 或者一些商业的数据集成平台。这些工具提供了可视化的数据流设计界面和丰富的处理器可以处理复杂的数据转换、清洗和加载任务适合大规模、定期的数据迁移。数据类型映射表示例常见类型Oracle 数据类型KingbaseES 数据类型注意事项NUMBERNUMERIC精度和标度需对应。NUMBER(10)可映射为INTEGER。VARCHAR2(n)VARCHAR(n)注意字符集。DATETIMESTAMP(0)Oracle的DATE包含时分秒KingbaseES的DATE只含年月日。TIMESTAMPTIMESTAMPCLOBTEXTBLOBBYTEAROWID无直接对应通常需要业务逻辑改造用主键替代。序列和自增主键Oracle使用SEQUENCETRIGGER模拟自增。KingbaseES可以直接使用SERIAL或IDENTITY列迁移时需要将Oracle的序列当前值设置到KingbaseES的序列中。-- 在KingbaseES中获取并设置序列值 SELECT setval(‘employee_id_seq‘, (SELECT MAX(id) FROM employee));3.3 从 PostgreSQL 迁移由于KingbaseES与PostgreSQL高度兼容这是最简单的迁移场景。理论上可以直接使用pg_dump导出的文件用sys_restore导入。但为了确保万无一失建议使用pg_dump -Fc导出自定义格式备份。在目标KingbaseES环境中使用相同或更高版本的sys_restore进行导入。检查是否有使用到PostgreSQL特有但KingbaseES未内置的扩展Extension如PostGIS,uuid-ossp等。需要在KingbaseES中寻找对应的兼容扩展或实现方案。4. 日常数据交换CSV、Excel与应用程序集成除了完整的数据库迁移开发运维中更常见的是表级别或数据子集的外部交换。4.1 高效处理 CSV 文件CSV是数据交换的“世界语”。COPY命令是性能最优解但需要注意细节。导出为CSV-- 导出查询结果 COPY (SELECT id, name, salary FROM employee WHERE salary 10000 ORDER BY id) TO ‘/tmp/high_salary.csv‘ WITH (FORMAT csv, HEADER true, DELIMITER ‘,‘, ENCODING ‘UTF8‘); -- 使用\copy避免服务器文件权限问题在ksql中 \copy (SELECT * FROM department) TO ‘departments.csv‘ CSV HEADER从CSV导入-- 假设有一个与表结构匹配的CSV文件 CREATE TABLE employee_staging (LIKE employee INCLUDING DEFAULTS INCLUDING CONSTRAINTS); COPY employee_staging FROM ‘/tmp/new_employees.csv‘ WITH (FORMAT csv, HEADER true, NULL ‘‘); -- 使用INSERT ... SELECT 进行去重或转换后插入正式表 INSERT INTO employee SELECT * FROM employee_staging ON CONFLICT (id) DO UPDATE SET name EXCLUDED.name, salary EXCLUDED.salary; -- 清理临时表 DROP TABLE employee_staging;为什么使用临时表Staging Table这是一个非常重要的最佳实践。直接COPY到生产表如果文件格式错误、数据有问题会污染生产表。先导入到结构相同的临时表可以进行数据验证、清洗、去重然后再通过一条SQL语句将干净的数据合并到生产表整个过程更可控、更安全。处理导入错误COPY命令默认是事务性的一条记录失败会导致整个导入回滚。如果文件中有少量“脏数据”可以使用LOG ERRORS子句如果KingbaseES版本支持将错误记录到特定表中而不中断整个导入。-- 假设存在一个错误记录表 err_log COPY employee FROM ‘/tmp/data.csv‘ WITH (FORMAT csv, HEADER) LOG ERRORS INTO err_log SEGMENT REJECT LIMIT 10;如果不支持此语法则需先确保CSV文件的清洁或编写脚本进行预处理。4.2 与 Excel 文件交互数据库工具通常不直接读写Excel文件.xlsx因为它是复杂的二进制格式。标准流程是从Excel导出 在Excel中将工作表“另存为”CSV (逗号分隔) (*.csv)格式。处理数据 检查CSV文件的编码建议保存为UTF-8 BOM或UTF-8、分隔符、特殊字符如包含逗号的字段需要用引号括起来。使用COPY或\copy导入。如果需要频繁、自动化地与Excel交互可以考虑使用Python脚本 利用pandas库的read_excel和to_sql函数可以非常灵活地读取Excel文件并进行必要的数据处理然后通过KingbaseES的Python驱动如psycopg2或kingbase写入数据库。使用ODBC连接 配置KingbaseES的ODBC驱动在Excel的“数据”-“获取数据”-“从其他源”-“从ODBC”中连接可以直接将数据库表作为数据源查询或写入。这更适合数据分析师进行即席查询和报表制作。4.3 在应用程序中实现导入导出在Java、Python等应用中实现数据的导入导出是常见需求。Java (使用JDBC) 导出为CSV// 简化示例使用原生JDBC String sql “SELECT * FROM employee“; try (Connection conn DriverManager.getConnection(url, user, pass); Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(sql)) { // 使用StringBuilder或CSV写入库如OpenCSV生成CSV内容 StringBuilder csv new StringBuilder(); // 写入列头 ResultSetMetaData meta rs.getMetaData(); for (int i 1; i meta.getColumnCount(); i) { csv.append(meta.getColumnName(i)).append(“,“); } csv.deleteCharAt(csv.length() - 1).append(“\n“); // 写入数据 while (rs.next()) { for (int i 1; i meta.getColumnCount(); i) { csv.append(rs.getObject(i) ! null ? rs.getObject(i).toString() : ““).append(“,“); } csv.deleteCharAt(csv.length() - 1).append(“\n“); } // 将csv.toString()写入HTTP响应流或文件 Files.write(Paths.get(“employee.csv“), csv.toString().getBytes(StandardCharsets.UTF_8)); }Python (使用psycopg2) 从CSV导入import psycopg2 import psycopg2.extras import csv conn psycopg2.connect(“host127.0.0.1 dbnamemydb usersystem passwordxxx“) cur conn.cursor() # 方法1 使用COPY命令最快 with open(‘data.csv‘, ‘r‘, encoding‘utf-8‘) as f: # 注意copy_expert 需要表已存在且结构匹配 cur.copy_expert(“COPY employee FROM STDIN WITH (FORMAT csv, HEADER true)“, f) # 方法2 逐行INSERT更灵活可进行数据清洗 with open(‘data.csv‘, ‘r‘, encoding‘utf-8‘) as f: reader csv.DictReader(f) for row in reader: # 在这里可以对row进行清洗和转换 cur.execute(“““ INSERT INTO employee (id, name, dept_id) VALUES (%(id)s, %(name)s, %(dept_id)s) ON CONFLICT (id) DO NOTHING “““, row) conn.commit() cur.close() conn.close()性能抉择对于大批量数据导入COPY命令的性能比逐条INSERT高出几个数量级。因此如果数据清洗要求不复杂应优先使用COPY。如果清洗逻辑复杂可以先用Python的pandas进行清洗再将清洗后的DataFrame利用to_sql方法配合method‘multi‘或生成临时CSV用COPY命令导入。5. 高级技巧与避坑指南掌握了基本方法后一些高级技巧和常见“坑点”能让你在实战中更加游刃有余。5.1 大规模数据迁移的性能优化当面对TB级数据时每一个细节的优化都能节省大量时间。并行化是王道 如前所述sys_dump和sys_restore的-j参数是提升速度最有效的手段。通常设置为目标服务器CPU核心数的70%-80%。关闭索引和约束 在导入数据前先导入表结构但暂时删除外键约束和索引除唯一约束和主键外。数据导入完成后再重新创建它们。这是因为在插入每一行时维护索引和检查外键会带来巨大的开销。-- 导入前在目标库执行需根据实际情况生成脚本 ALTER TABLE employee DROP CONSTRAINT IF EXISTS employee_dept_id_fkey; DROP INDEX IF EXISTS idx_employee_name; -- 使用sys_restore导入数据... -- 导入后重新创建 CREATE INDEX idx_employee_name ON employee(name); ALTER TABLE employee ADD CONSTRAINT employee_dept_id_fkey FOREIGN KEY (dept_id) REFERENCES department(id);调整WALWrite-Ahead Logging配置 对于一次性的大批量数据导入可以临时调整KingbaseES的配置以减少WAL日志开销加速导入。但务必注意这会影响数据安全性仅用于迁移期间完成后必须改回。# 在kingbase.conf中临时设置 fsync off # 危险仅用于迁移完成后必须设为on full_page_writes off # 危险同上 max_wal_size 4GB # 增大WAL尺寸减少检查点 checkpoint_timeout 30min # 延长检查点间隔重要警告将fsync设为off意味着操作系统崩溃可能导致数据库损坏。只有在你可以接受迁移失败并从头开始且迁移期间服务器电力、系统绝对稳定的情况下才考虑此操作。迁移完成后必须将其设回on并重启数据库。使用管道Pipe避免中间文件 如果源和目标数据库网络通畅可以直接通过管道传输节省磁盘I/O和时间。# 从源PostgreSQL直接迁移到目标KingbaseES pg_dump -h source_host -U source_user -d source_db -Fc | \ sys_restore -h target_host -U system -d target_db -j 45.2 确保数据一致性与完整性迁移不只是搬数据更要保证搬过去的数据是对的。记录迁移前校验和 在源库对关键表计算行数、甚至对重要字段计算MD5校验和。-- 在源库如MySQL SELECT COUNT(*) AS row_count, MD5(GROUP_CONCAT(CONCAT(id,name) ORDER BY id)) AS data_hash FROM employee;在目标库KingbaseES导入后执行同样的计算对比结果。对于非文本字段需要小心处理。使用事务 在应用程序或脚本中执行多个相关的导入步骤时将其包裹在一个数据库事务中。这样任何一个步骤失败所有更改都会回滚避免数据处于不一致的状态。验证外键和唯一约束 数据导入后特别是分批导入或关闭了约束导入后应验证数据的参照完整性。-- 查找违反外键约束的数据 SELECT * FROM employee e WHERE NOT EXISTS (SELECT 1 FROM department d WHERE d.id e.dept_id); -- 重新启用约束并检查如果约束是NOT VALID创建的需要验证 ALTER TABLE employee VALIDATE CONSTRAINT employee_dept_id_fkey;5.3 字符集与编码的“隐形杀手”这是跨平台、跨数据库迁移中最常见的问题之一。乱码通常源于源文件、客户端会话、数据库服务器三者的编码不一致。黄金法则统一使用 UTF-8。在导出、传输、导入的整个链条中尽可能强制使用UTF-8编码。在KingbaseES中创建数据库时指定编码CREATE DATABASE mydb ENCODING ‘UTF8‘;。在使用COPY命令时显式指定ENCODING ‘UTF8‘。在应用程序连接字符串中也可以指定编码参数如JDBC中的characterEncodingutf8。如果源数据是GBK等编码在导入KingbaseESUTF8时需要在COPY命令或应用程序读取文件时进行转码。5.4 处理自增主键SERIAL/IDENTITY的冲突从其他数据库迁移时目标表已有的自增序列可能和导入的数据产生冲突。在导入数据后需要将表的自增序列值更新到当前最大值以上。-- 方法1 使用setval对于SERIAL类型 SELECT setval(‘employee_id_seq‘, (SELECT MAX(id) FROM employee)); -- 方法2 使用ALTER SEQUENCE更通用 SELECT setval(‘employee_id_seq‘, (SELECT MAX(id) FROM employee)); -- 或者直接修改序列 ALTER SEQUENCE employee_id_seq RESTART WITH [新的起始值];如果导入的数据ID是手动指定的且后续希望继续使用自增务必确保序列的当前值大于任何已存在的ID。5.5 空间数据、JSON等特殊类型的迁移如果表中包含PostGIS几何类型、JSONB、数组等复杂类型使用sys_dump通常是安全的因为它会以文本形式导出这些数据的内部表达。但在异构迁移如从MySQL的JSON到KingbaseES的JSONB时需要仔细测试。对于空间数据确保KingbaseES安装了对应的空间扩展如PostGIS的兼容扩展并且坐标系SRID定义正确。迁移完成后针对包含特殊类型的列执行一些样例查询来验证数据的完整性和准确性是必不可少的步骤。例如对几何列计算面积、长度对JSONB列进行路径查询确保结果符合预期。
返回列表