在PostgreSQL 9.0中优化转义JSON

在PostgreSQL 9.0中优化转义JSON,第1张

概述我目前在PostgreSQL中使用这个 JSON转义函数作为未来原生 JSON支持的代表.虽然它有效,但它也限制了我们的系统性能.我该如何进行优化呢?也许某种查找数组? CREATE OR REPLACE FUNCTION escape_json(i_text TEXT) RETURNS TEXT AS$body$ 我目前在Postgresql中使用这个 JSON转义函数作为未来原生 JSON支持的代表.虽然它有效,但它也限制了我们的系统性能.我该如何进行优化呢?也许某种查找数组?
CREATE OR REPLACE FUNCTION escape_Json(i_text TEXT) RETURNS TEXT AS$body$                                                 DECLARE  IDx INTEGER;  text_len INTEGER;     cur_char_unicode INTEGER;  rtn_value TEXT := i_text;BEGIN  -- $Rev: $--  text_len = LENGTH(rtn_value);  IDx = 1;   WHILE (IDx <= text_len) LOOP    cur_char_unicode = ASCII(SUBSTR(rtn_value,IDx,1));    IF cur_char_unicode > 255 THEN      rtn_value = OVERLAY(rtn_value PLACING (E'\u' || LPAD(UPPER(TO_HEX(cur_char_unicode)),4,'0')) FROM IDx FOR 1);      IDx = IDx + 5;      text_len = text_len + 5;    ELSE      /* is the current character one of the following: " \ / bs ff nl cr tab */      IF cur_char_unicode IN (34,92,47,8,12,10,13,9) THEN        rtn_value = OVERLAY(rtn_value PLACING (E'\' || (CASE cur_char_unicode                                                         WHEN 34 THEN '"'                                                         WHEN 92 THEN E'\'                                                         WHEN 47 THEN '/'                                                         WHEN  8 THEN 'b'                                                         WHEN 12 THEN 'f'                                                         WHEN 10 THEN 'n'                                                         WHEN 13 THEN 'r'                                                         WHEN  9 THEN 't'                                                          END)                                        )                                FROM IDx FOR 1);        IDx = IDx + 1;        text_len = text_len + 1;      END IF;    END IF;    IDx = IDx + 1;  END LOOP;                     RETURN rtn_value;END;$body$LANGUAGE plpgsql;
我所有的方法归结为“以其他方式做”:

>用其他语言写,例如使用pl / perl,pl / python,pl / ruby
>编写一个用C编写的外部JsON库的包装器
> JsON是否在客户端而不是在查询中转义(假设您的客户端具有一些良好的JsON转义支持)

根据我的经验,pl / pgsql在这种情况下并不快 – 它的优势在于它与数据库交换数据的整体支持,而不是作为通用编程语言.

例:

create or replace function escape_Json_perl(text) returns text   strict immutable  language plperlu as $$    use JsON;    return JsON->new->allow_nonref->encode($_[0]);  $$;

快速测试表明这比plpgsql函数快15倍(虽然它返回你可能想要剥离的值的引号)

总结

以上是内存溢出为你收集整理的在PostgreSQL 9.0中优化转义JSON全部内容,希望文章能够帮你解决在PostgreSQL 9.0中优化转义JSON所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1181728.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存