使用淘宝Str2varlist与str2numlist 代替 in/exist ,提升性能(Oracle)

本文介绍了一种通过创建自定义函数和类型来优化数据库中IN列表查询的方法,这种方法能有效减少硬解析与共享池SQL碎片的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

在实际使用中,经常会有带in的子查询,如where id in (1,2,3)这样的情况,但是如果很多这样的语句在数据库中出现,将引起数据库的大量硬解析与共享池SQL碎片。所以,在实际应用中,可以采用其他方法,将这些in list给绑定起来。

如果需要绑定in list,首先,需要创建两个类型(type):

针对数据类型的:

CREATE OR REPLACE TYPE NUMTABLETYPE as table of number;
 

针对字符串类型的(每个list的单元大小不要超过1000字节)

create or replace type vartabletype as table of varchar2(1000);
 

然后创建两个相关的函数

数字列表函数

create or replace function str2numList( p_string in varchar2 ) return numTableType
as
    v_str long default p_string || ',';
    v_n number;
    v_data numTableType := numTableType();
begin
    loop
    v_n := to_number(instr( v_str, ',' ));
    exit when (nvl(v_n,0) = 0);
    v_data.extend;
    v_data( v_data.count ) := ltrim(rtrim(substr(v_str,1,v_n-1)));
    v_str := substr( v_str, v_n+1 );
    end loop;
    return v_data;
end;
 

字符列表函数

create or replace function str2varList( p_string in varchar2 ) return VarTableType
 as
 v_str long default p_string || ',';
 v_n varchar2(2000);
 v_data VarTableType := VarTableType();
 begin
    loop
       v_n :=instr( v_str, ',' );
    exit when (nvl(v_n,0) = 0);
    v_data.extend;
    v_data( v_data.count ) := ltrim(rtrim(substr(v_str,1,v_n-1)));
    v_str := substr( v_str, v_n+1 );
    end loop;
    return v_data;
end;
 

 

 

创建之后,我们就可以采用如下的方式来使用in list的绑定了。如可以采用如下的三种方案

 

SELECT /*+ ordered use_nl(a,u) */ id, user_id, BITAND(promoted_type,4) busauth
     from table(STR2NUMLIST(:bind0)) a,
     bmw_users u
     where u.user_id = a.column_value;
SELECT  /*+ leading(a) */ id, user_id, BITAND(promoted_type,4) busauth
     from bmw_users u where user_id in
     (select * from table(STR2NUMLIST(:bind0)) a);
SELECT  /*+ index(bmw_users UK_BMW_USERS_USERID) */ id, user_id
     from bmw_users where user_id in
     (SELECT * FROM THE (SELECT CAST(STR2NUMLIST(:bind0) AS NUMTABLETYPE)
     FROM dual) WHERE rownum<1000);
 

在如上的方案中,以上语句中的hint提示,是为了稳定执行计划,防止Oracle对in list的错误估计而导致走hash连接。一般建议采用第一种方法,比较简单可靠并且可以指定稳定的计划。但是要求数据库的版本比较高,在老版本中(8i),可能只能采用第三种方法。总的来说,1、2两种方法比3要少6个逻辑读左右。如:

SQL> SELECT /*+ ordered use_nl(a,u) */ id, user_id  from table(STR2NUMLIST('1,2,3')) a,   
bmw_users u  where u.user_id = a.column_value
 
Execution Plan
----------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=3279 Card=8168 Bytes =334888)
   1    0   NESTED LOOPS (Cost=3279 Card=8168 Bytes=334888)
   2    1     COLLECTION ITERATOR (PICKLER FETCH) OF 'STR2NUMLIST'
   3    1     TABLE ACCESS (BY INDEX ROWID) OF 'BMW_USERS' (Cost=1 Card=1 Bytes=39)
   4    3       INDEX (UNIQUE SCAN) OF 'UK_BMW_USERS_USERID' (UNIQUE)
Statistics
----------------------------------
          0  recursive calls
          0  db block gets
         10  consistent gets
          0  physical reads
          0  redo size
……   
/*###################*/
SQL> SELECT  /*+ index(bmw_users UK_BMW_USERS_USERID) */ id, user_id
    from bmw_users where user_id in
      (SELECT * FROM THE (SELECT CAST(STR2NUMLIST('1,2,3') AS NUMTABLETYPE)
    FROM dual) WHERE rownum<1000)
 
Execution Plan
----------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=430 Card=999 Bytes=51948)
   1    0   NESTED LOOPS (Cost=430 Card=999 Bytes=51948)
   2    1     VIEW OF 'VW_NSO_1' (Cost=11 Card=999 Bytes=12987)
   3    2       SORT (UNIQUE)
   4    3         COUNT (STOPKEY)
   5    4           COLLECTION ITERATOR (PICKLER FETCH) OF 'STR2NUMLIST'
   6    5             TABLE ACCESS (FULL) OF 'DUAL' (Cost=2 Card=82)
   7    1     TABLE ACCESS (BY INDEX ROWID) OF 'BMW_USERS' (Cost=1 Card=1 Bytes=39)
   8    7       INDEX (UNIQUE SCAN) OF 'UK_BMW_USERS_USERID' (UNIQUE)
Statistics
----------------------------------
          0  recursive calls
          0  db block gets
          16  consistent gets
          0  physical reads
          0  redo size
……
<think>好的,我需要帮助用户在Vue2项目中集成和使用TinyMCE富文本编辑器。首先,我得回忆一下之前提供的引用内容,看看有哪些具体的步骤和需要注意的地方。 根据引用[4],用户需要先安装tinymce-vue和tinymce包,然后创建组件。引用[1]和[2]提到vue-element-admin使用tinymce的例子,以及需要参考官方文档进行更多配置。可能需要注意的步骤包括安装依赖、初始化编辑器配置、处理样式和静态资源,以及在父组件中的使用方式。 然后,引用[3]指出在弹窗中使用时可能出现的z-index问题,需要调整CSS样式。还有媒体插入的问题,可能存在重复video标签的情况,可能需要检查配置或插件是否正确。 接下来,我需要将步骤分解,确保用户能够按照流程操作。首先安装npm包,然后创建组件并引入。需要配置tinymce.init,包括选择器、高度、插件列表和工具栏。静态资源方面,可能需要复制node_modules中的文件到public目录下,或者通过别名配置,如引用[4]中的例子。 在组件创建后,父组件中引入,并通过v-model绑定数据。同时,注意在弹窗中使用时的z-index问题,需要添加CSS样式覆盖。此外,处理媒体插件的问题可能需要检查是否启用了正确的插件,或者是否有冲突的配置。 最后,生成相关问题时要覆盖常见的使用场景和问题,比如配置优化、样式问题、插件使用等。确保用户能够通过这些问题进一步解决可能遇到的困难。</think>### 在 Vue2 中集成和使用 TinyMCE 富文本编辑器的步骤 #### 1. 安装依赖 ```bash npm install tinymce@5.10.7 @tinymce/tinymce-vue@3.2.8 --save ``` > 注意:Vue2使用兼容版本,`@tinymce/tinymce-vue@3.x`为Vue2适配版本[^4]。 --- #### 2. 创建 TinyMCE 组件 在 `components/tinymce/index.vue` 中定义组件: ```vue <template> <div class="tinymce-container"> <editor v-model="content" :init="initConfig" :id="id" ></editor> </div> </template> <script> import tinymce from 'tinymce/tinymce' import Editor from '@tinymce/tinymce-vue' import 'tinymce/themes/silver/theme' // 必须引入基础主题 import 'tinymce/icons/default/icons' // 引入图标库 export default { components: { Editor }, props: { value: String, id: { type: String, default: 'tinymceId' } }, data() { return { initConfig: { language_url: '/tinymce/langs/zh_CN.js', // 语言包路径 language: 'zh_CN', skin_url: '/tinymce/skins/ui/oxide', // 皮肤路径 height: 500, plugins: 'link lists image code table media', // 常用插件 toolbar: 'undo redo | formatselect | bold italic | alignleft aligncenter alignright | bullist numlist | image media | code', images_upload_handler: (blobInfo, success) => { // 自定义图片上传逻辑 } }, content: this.value } }, watch: { value(newVal) { this.content = newVal } } } </script> ``` --- #### 3. 处理静态资源 复制 TinyMCE 资源文件到项目: ```bash cp -r node_modules/tinymce/skins public/tinymce/ cp -r node_modules/tinymce/plugins public/tinymce/ cp node_modules/tinymce/langs/zh_CN.js public/tinymce/langs/ ``` 或在 `vue.config.js` 中配置别名: ```javascript module.exports = { chainWebpack: config => { config.resolve.alias.set('tinymce', path.resolve(__dirname, 'node_modules/tinymce')) } } ``` --- #### 4. 在父组件中使用 ```vue <template> <div> <tinymce v-model="content" id="editor1"></tinymce> </div> </template> <script> import Tinymce from '@/components/tinymce/index.vue' export default { components: { Tinymce }, data() { return { content: '<p>初始内容</p>' } } } </script> ``` --- #### 5. 解决常见问题 - **弹窗层级问题**(如Element UI的Dialog): ```css /* 全局样式文件 */ .tox-tinymce-aux { z-index: 10000 !important; } ``` - **视频重复问题**:检查是否重复加载`media`插件,或升级到新版TinyMCE[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值