PostgreSQL 字符集下区域设置对性能的影响改进办法
阿弟(陈爱生)测试发现,UTF-8下 locale 选用 C 和 zh_CN 性能差距非常大: 以前修改过这个字符类型比较的部分,当时遇到的问题是,依赖于操作系统实现不同,字母排序可能会出现: 此方法也同样可以解决性能问题,虽然有些特殊情形可能反而带来额外开销,相对而言,个人认为总体结果还是提升的。 字符串比较函数varstr_cmp 定义在 src/backend/utils/adt/varlena.c 中,我们挑几部分来看: 对于简体汉字,根据编码规则,所有汉字(包括全角字符)的 UTF-8 编码下每个字节都是大于127,也就是首位为1。对于一个以 ascii字符开始的字符串,我们很容易就能判断出他们之间的大小关系,根本不必去进行转换,除非缀前缀完全一样。在转换编码之前,如果编码是 PG_UTF8,我们逐个字符对比,如果ascii 码根据其大小就知道返回结果,不需要再继续;如果不是,那就不得不调用 strcoll 比较;所有 ascii码,认为他们都小于汉字。具体逻辑不写在这里了,大致思路如此。 这样的改动,我想一个应用系统,相当一部分的字符比较,可以不通过编码转换来完成,性能自然也就提高不少。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |