华为云用户手册

  • 搜索表 在不使用索引的情况下也可以进行全文检索。 一个简单查询:将body字段中包含america的每一行打印出来。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 gaussdb=# DROP SCHEMA IF EXISTS tsearch CASCADE; gaussdb=# CREATE SCHEMA tsearch; gaussdb=# CREATE TABLE tsearch.pgweb(id int, body text, title text, last_mod_date date); gaussdb=# INSERT INTO tsearch.pgweb VALUES(1, 'China, officially the People''s Republic of China (PRC), located in Asia, is the world''s most populous state.', 'China', '2010-1-1'); gaussdb=# INSERT INTO tsearch.pgweb VALUES(2, 'America is a rock band, formed in England in 1970 by multi-instrumentalists Dewey Bunnell, Dan Peek, and Gerry Beckley.', 'America', '2010-1-1'); gaussdb=# INSERT INTO tsearch.pgweb VALUES(3, 'England is a country that is part of the United Kingdom. It shares land borders with Scotland to the north and Wales to the west.', 'England', '2010-1-1'); gaussdb=# INSERT INTO tsearch.pgweb VALUES(4, 'Australia, officially the Commonwealth of Australia, is a country comprising the mainland of the Australian continent, the island of Tasmania, and numerous smaller islands.', 'Australia', '2010-1-1'); gaussdb=# INSERT INTO tsearch.pgweb VALUES(6, 'Japan is an island country in East Asia.', 'Japan', '2010-1-1'); gaussdb=# INSERT INTO tsearch.pgweb VALUES(7, 'Germany, officially the Federal Republic of Germany, is a sovereign state and federal parliamentary republic in central-western Europe.', 'Germany', '2010-1-1'); gaussdb=# INSERT INTO tsearch.pgweb VALUES(8, 'France, is a sovereign state comprising territory in western Europe and several overseas regions and territories.', 'France', '2010-1-1'); gaussdb=# INSERT INTO tsearch.pgweb VALUES(9, 'Italy officially the Italian Republic, is a unitary parliamentary republic in Europe.', 'Italy', '2010-1-1'); gaussdb=# INSERT INTO tsearch.pgweb VALUES(10, 'India, officially the Republic of India, is a country in South Asia.', 'India', '2010-1-1'); gaussdb=# INSERT INTO tsearch.pgweb VALUES(11, 'Brazil, officially the Federative Republic of Brazil, is the largest country in both South America and Latin America.', 'Brazil', '2010-1-1'); gaussdb=# INSERT INTO tsearch.pgweb VALUES(12, 'Canada is a country in the northern half of North America.', 'Canada', '2010-1-1'); gaussdb=# INSERT INTO tsearch.pgweb VALUES(13, 'Mexico, officially the United Mexican States, is a federal republic in the southern part of North America.', 'Mexico', '2010-1-1'); gaussdb=# SELECT id, body, title FROM tsearch.pgweb WHERE to_tsvector('english', body) @@ to_tsquery('english', 'america'); id | body | title ----+-------------------------------------------------------------------------------------------------------------------------+--------- 2 | America is a rock band, formed in England in 1970 by multi-instrumentalists Dewey Bunnell, Dan Peek, and Gerry Beckley. | America 12 | Canada is a country in the northern half of North America. | Canada 13 | Mexico, officially the United Mexican States, is a federal republic in the southern part of North America. | Mexico 11 | Brazil, officially the Federative Republic of Brazil, is the largest country in both South America and Latin America. | Brazil (4 rows) 像America这样的相关词也会被找到,因为这些词都被处理成了相同标准的词条。 上面的查询指定english配置来解析和规范化字符串。当然也可以省略此配置,通过default_text_search_config进行配置设置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 gaussdb=# SHOW default_text_search_config; default_text_search_config ---------------------------- pg_catalog.english (1 row) gaussdb=# SELECT id, body, title FROM tsearch.pgweb WHERE to_tsvector(body) @@ to_tsquery('america'); id | body | title ----+-------------------------------------------------------------------------------------------------------------------------+--------- 11 | Brazil, officially the Federative Republic of Brazil, is the largest country in both South America and Latin America. | Brazil 2 | America is a rock band, formed in England in 1970 by multi-instrumentalists Dewey Bunnell, Dan Peek, and Gerry Beckley. | America 12 | Canada is a country in the northern half of North America. | Canada 13 | Mexico, officially the United Mexican States, is a federal republic in the southern part of North America. | Mexico (4 rows) 一个复杂查询:检索出在title或者body字段中包含north和america的最近10篇文档: 1 2 3 4 5 6 gaussdb=# SELECT title FROM tsearch.pgweb WHERE to_tsvector(title || ' ' || body) @@ to_tsquery('north & america') ORDER BY last_mod_date DESC LIMIT 10; title -------- Mexico Canada (2 rows) 为了清晰,举例中没有调用coalesce函数在两个字段中查找包含NULL的行。 以上例子均在没有索引的情况下进行查询。对于大多数应用程序来说,这个方法很慢。因此除了偶尔的特定搜索,文本搜索在实际使用中通常需要创建索引。 父主题: 表和索引
  • 自动寻主场景 某客户存在一套集中式数据库实例,包含1主2备三个节点{node1,node2,node3},其中node1为主节点,node2、node3为备节点。 客户希望应用连接能建立在主DN上,并在发生主备切换时,自动选择新的主节点建连,则url可参考如下配置: jdbc:postgresql://node1,node2,node3/database?targetServerType=master
  • 高性能场景 某客户对于相同sql可能多次执行,仅是传参不同,为了提升执行效率,可开启prepareThreshold参数,避免重复生成执行计划,url可参考如下配置。 jdbc:postgresql://node1/database?prepareThreshold=5 某客户一次查询1000万数据,为避免同时返回造成内存溢出,可使用defaultRowFetchSize,url可参考如下配置。 jdbc:postgresql://node1/database?defaultRowFetchSize=50000 某客户需要批量插入1000万数据,为提升效率,可使用batchMode,url可参考如下配置。 jdbc:postgresql://node1/database?batchMode=true
  • 背景信息 当用户对数据库中的一张或者多张表的某些字段的组合感兴趣,而又不想每次键入这些查询时,用户就可以定义一个视图,以便解决这个问题。 视图与基本表不同,不是物理上实际存在的,是一个虚表。数据库中仅存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。若基本表中的数据发生变化,从视图中查询出的数据也随之改变。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据及变化。视图每次被引用的时候都会运行一次。
  • 语法格式 修改策略描述: 1 ALTER MASKING POLICY policy_name COMMENTS policy_comments; 修改脱敏方式: 1 2 3 ALTER MASKING POLICY policy_name [ADD | REMOVE | MODIFY] masking_actions[, ...]; 其中masking_action: masking_function ON LABEL(label_name[, ...]) 修改脱敏策略生效场景: 1 ALTER MASKING POLICY policy_name MODIFY(FILTER ON FILTER_TYPE(filter_value[, ...])[, ...]); 移除脱敏策略生效场景,使策略对所用场景生效: 1 ALTER MASKING POLICY policy_name DROP FILTER; 修改脱敏策略开启/关闭: 1 ALTER MASKING POLICY policy_name [ENABLE | DISABLE];
  • 参数说明 policy_name 脱敏策略名称,需要唯一,不可重复。 取值范围:字符串,要符合标识符命名规范。 policy_comments 需要为脱敏策略添加或修改的描述信息。 masking_function 指的是预置的八种脱敏方式或者用户自定义的函数,支持模式。 maskall不是预置函数,硬编码在代码中,不支持\df展示。 预置时脱敏方式如下: maskall | randommasking | creditcardmasking | basicemailmasking | fullemailmasking | shufflemasking | alldigitsmasking | regexpmasking label_name 资源标签名称。 FILTER_TYPE 指定脱敏策略的过滤信息,过滤类型包括:IP、ROLES、APP。 filter_value 指具体过滤信息内容,例如具体的IP,具体的APP名称,具体的用户名。 ENABLE|DISABLE 可以打开或关闭脱敏策略。若不指定ENABLE|DISABLE,语句默认为ENABLE。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 --创建dev_mask和bob_mask用户。 gaussdb=# CREATE USER dev_mask PASSWORD '********'; gaussdb=# CREATE USER bob_mask PASSWORD '********'; --创建一个表tb_for_masking。 gaussdb=# CREATE TABLE tb_for_masking(col1 text, col2 text, col3 text); --创建资源标签标记敏感列col1。 gaussdb=# CREATE RESOURCE LABEL mask_lb1 ADD COLUMN(tb_for_masking.col1); --创建资源标签标记敏感列col2。 gaussdb=# CREATE RESOURCE LABEL mask_lb2 ADD COLUMN(tb_for_masking.col2); --对访问敏感列col1的操作创建脱敏策略。 gaussdb=# CREATE MASKING POLICY maskpol1 maskall ON LABEL(mask_lb1); --为脱敏策略maskpol1添加描述。 gaussdb=# ALTER MASKING POLICY maskpol1 COMMENTS 'masking policy for tb_for_masking.col1'; --修改脱敏策略maskpol1,新增一项脱敏方式。 gaussdb=# ALTER MASKING POLICY maskpol1 ADD randommasking ON LABEL(mask_lb2); --修改脱敏策略maskpol1,移除一项脱敏方式。 gaussdb=# ALTER MASKING POLICY maskpol1 REMOVE randommasking ON LABEL(mask_lb2); --修改脱敏策略maskpol1,修改一项脱敏方式。 gaussdb=# ALTER MASKING POLICY maskpol1 MODIFY randommasking ON LABEL(mask_lb1); --修改脱敏策略maskpol1使之仅对用户dev_mask和bob_mask,客户端工具为gsql,IP地址为'10.20.30.40', '127.0.0.0/24'场景生效。 gaussdb=# ALTER MASKING POLICY maskpol1 MODIFY (FILTER ON ROLES(dev_mask, bob_mask), APP(gsql), IP('10.20.30.40', '127.0.0.0/24')); --修改脱敏策略maskpol1,使之对所有用户场景生效。 gaussdb=# ALTER MASKING POLICY maskpol1 DROP FILTER; --禁用脱敏策略maskpol1。 gaussdb=# ALTER MASKING POLICY maskpol1 DISABLE; --删除脱敏策略。 gaussdb=# DROP MASKING POLICY maskpol1; -删除资源标签。 gaussdb=# DROP RESOURCE LABEL mask_lb1, mask_lb2; -删除表tb_for_masking。 gaussdb=# DROP TABLE tb_for_masking; --删除用户dev_mask和bob_mask。 gaussdb=# DROP USER dev_mask, bob_mask;
  • 排序查询结果 排序试图针对特定查询衡量文档的相关度,从而将众多的匹配文档中相关度最高的文档排在最前。 GaussDB 提供了两个预置的排序函数。函数考虑了词法,距离,和结构信息;也就是,他们考虑查询词在文档中出现的频率、紧密程度、以及他们出现的地方在文档中的重要性。然而,相关性的概念是模糊的,并且是跟应用强相关的。不同的应用程序可能需要额外的信息来排序,比如,文档的修改时间,内置的排序函数等。也可以开发自己的排序函数或者采用附加因素组合这些排序函数的结果来满足特定需求。 两个预置的排序函数: 1 ts_rank([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4 基于词素匹配率对vector进行排序: 1 ts_rank_cd([ weights float4[], ] vector tsvector, query tsquery [, normalization integer ]) returns float4 该函数需要位置信息的输入。因此它不能在“剥离”tsvector值的情况下运行—它将总是返回零。 对于这两个函数,可选的weights参数提供给词加权重的能力,词的权重大小取决于所加的权值。权重阵列指定在排序时为每类词汇加多大的权重。 {D-weight, C-weight, B-weight, A-weight} 如果没有提供weights,则使用缺省值:{0.1, 0.2, 0.4, 1.0}。 通常的权重是用来标记文档特殊领域的词,如标题或最初的摘要,所以相对于文章主体中的词它们有着更高或更低的重要性。 由于较长的文档有更多的机会包含查询词,因此有必要考虑文档的大小。例如,包含有5个搜索词的一百字文档比包含有5个搜索词的一千字文档相关性更高。两个预置的排序函数都采用了一个整型的标准化选项来定义文档长度是否影响排序及如何影响。这个整型选项控制多个行为,所以它是一个屏蔽字:可以使用|指定一个或多个行为(例如,2|4)。 0(缺省)表示:跟长度大小没有关系 1 表示:排名(rank)除以(文档长度的对数+1) 2表示:排名除以文档的长度 4表示:排名除以两个扩展词间的调和平均距离。只能使用ts_rank_cd实现 8表示:排名除以文档中单独词的数量 16表示:排名除以单独词数量的对数+1 32表示:排名除以排名本身+1 当指定多个标志位时,会按照所列的顺序依次进行转换。 需要特别注意的是,排序函数不使用任何全局信息,所以不可能产生一个某些情况下需要的1%或100%的理想标准值。标准化选项32 (rank/(rank+1))可用于所有规模的从零到一之间的排序,当然,这只是一个表面变化;它不会影响搜索结果的排序。 下面是一个例子,仅选择排名前十的匹配: 1 2 3 4 5 6 7 8 9 10 11 12 gaussdb=# SELECT id, title, ts_rank_cd(to_tsvector(body), query) AS rank FROM tsearch.pgweb, to_tsquery('america') query WHERE query @@ to_tsvector(body) ORDER BY rank DESC LIMIT 10; id | title | rank ----+---------+------ 2 | America | .1 11 | Brazil | .2 12 | Canada | .1 13 | Mexico | .1 (4 rows) 这是使用标准化排序的相同例子: 1 2 3 4 5 6 7 8 9 10 11 12 gaussdb=# SELECT id, title, ts_rank_cd(to_tsvector(body), query, 32 /* rank/(rank+1) */ ) AS rank FROM tsearch.pgweb, to_tsquery('america') query WHERE query @@ to_tsvector(body) ORDER BY rank DESC LIMIT 10; id | title | rank ----+---------+---------- 2 | America | .0909091 11 | Brazil | .166667 12 | Canada | .0909091 13 | Mexico | .0909091 (4 rows) 下面是使用中文分词法排序查询的例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 gaussdb=# CREATE TABLE tsearch.ts_ngram(id int, body text); gaussdb=# INSERT INTO tsearch.ts_ngram VALUES(1, '中文'); gaussdb=# INSERT INTO tsearch.ts_ngram VALUES(2, '中文检索'); gaussdb=# INSERT INTO tsearch.ts_ngram VALUES(3, '检索中文'); --精确匹配 gaussdb=# SELECT id, body, ts_rank_cd(to_tsvector('ngram',body), query) AS rank FROM tsearch.ts_ngram, to_tsquery('中文') query WHERE query @@ to_tsvector(body); id | body | rank ----+------+------ 1 | 中文 | .1 (1 row) --模糊匹配 gaussdb=# SELECT id, body, ts_rank_cd(to_tsvector('ngram',body), query) AS rank FROM tsearch.ts_ngram, to_tsquery('中文') query WHERE query @@ to_tsvector('ngram',body); id | body | rank ----+----------+------ 1 | 中文 | .1 2 | 中文检索 | .1 3 | 检索中文 | .1 (3 rows) 排序要遍历每个匹配的tsvector,因此资源消耗多,可能会因为I/O限制导致排序慢。可是这是很难避免的,因为实际查询中通常会有大量的匹配。 父主题: 控制文本搜索
  • 参数说明 name 已存在的词典名(可指定模式名,否则默认在当前模式下)。 取值范围:已存在的词典名。 option 要修改的参数名。与template对应,不同的词典类型具有不同的参数列表,且与指定顺序无关。详细参数说明请见option。 不支持修改词典的TEMPLATE参数值。 不支持仅修改FILEPATH参数而不修改对应的词典定义文件参数。 词典定义文件的文件名仅支持小写字母、数据、下划线混合。 value 要修改的参数值。如果省略等号(=)和value,则表示删除该option的先前设置,使用默认值。 取值范围:对应option定义。 new_name 词典的新名称。 取值范围:符合标识符命名规范的字符串,且最大长度不超过63个字符。 new_owner 词典新的所有者。 取值范围:已存在的用户。 new_schema 词典的新模式。 取值范围:已存在的模式。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 12 13 14 --创建字典my_dict。 gaussdb=# CREATE TEXT SEARCH DICTIONARY my_dict ( TEMPLATE = Simple ); --更改Simple类型字典,将非停用词设置为已识别,其他参数保持不变。 gaussdb=# ALTER TEXT SEARCH DICTIONARY my_dict ( Accept = true ); --更改Simple类型字典,重置Accept参数。 gaussdb=# ALTER TEXT SEARCH DICTIONARY my_dict ( Accept ); --更新词典定义,不实际更改任何内容。 gaussdb=# ALTER TEXT SEARCH DICTIONARY my_dict ( dummy ); --删除字典my_dict。 gaussdb=# DROP TEXT SEARCH DICTIONARY my_dict;
  • 操作步骤 获取词典定义文件和词缀文件。 用户可以使用开源词典(OpenOffice上可以获取),直接获取的开源词典后缀名可能为.aff和.dic,此时需要将扩展名改为.affix和.dict。此外,对于某些词典文件,还需要使用下面的命令把字符转换成UTF-8编码,比如挪威语词典: 1 2 iconv -f ISO_8859-1 -t UTF-8 -o nn_no.affix nn_NO.aff iconv -f ISO_8859-1 -t UTF-8 -o nn_no.dict nn_NO.dic 创建Ispell词典。 1 2 3 4 5 6 gaussdb=# CREATE TEXT SEARCH DICTIONARY norwegian_ispell ( TEMPLATE = ispell, DictFile = nn_no, AffFile = nn_no, FilePath = 'file:///home/dicts' ); 其中,词典文件全名为nn_no.dict和nn_no.affix,所在目录为当前连接CN节点的/home/dicts/下。关于创建词典的语法和更多参数,请参见CREATE TEXT SEARCH DICTIONARY。 使用Ispell词典进行复合词拆分。 1 2 3 4 5 gaussdb=# SELECT ts_lexize('norwegian_ispell', 'sjokoladefabrikk'); ts_lexize --------------------- {sjokolade,fabrikk} (1 row) MySpell不支持复合词,Hunspell对复合词有较好的支持。GaussDB仅支持Hunspell中基本的复合词操作。通常情况下,Ispell词典能够识别的词是一个有限集合,其后应该配置一个更广义的词典,例如一个可以识别所有词的Snowball词典。
  • 执行批处理 用一条预处理语句处理多条相似的数据,数据库只创建一次执行计划,节省了语句的编译和优化时间。可以按如下步骤执行: 调用Connection的prepareStatement方法创建预编译语句对象。 1 2 3 4 5 6 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn = DriverManager.getConnection("url",userName,password); PreparedStatement pstmt = conn.prepareStatement("INSERT INTO customer_t1 VALUES (?)"); 针对每条数据都要调用setShort设置参数,以及调用addBatch确认该条设置完毕。 1 2 pstmt.setShort(1, (short)2); pstmt.addBatch(); 调用PreparedStatement的executeBatch方法执行批处理。 1 int[] rowcount = pstmt.executeBatch(); 调用PreparedStatement的close方法关闭预编译语句对象。 1 pstmt.close(); 在实际的批处理过程中,通常不终止批处理程序的执行,否则会降低数据库的性能。因此在批处理程序时,应该关闭自动提交功能,每几行提交一次。关闭自动提交功能的语句为: conn.setAutoCommit(false);
  • 调用存储过程 GaussDB支持通过JDBC直接调用事先创建的存储过程,步骤如下: 调用Connection的prepareCall方法创建调用语句对象。 1 2 3 4 5 6 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection myConn = DriverManager.getConnection("url",userName,password); CallableStatement cstmt = myConn.prepareCall("{? = CALL TESTPROC(?,?,?)}"); 调用CallableStatement的setInt方法设置参数。 1 2 3 cstmt.setInt(2, 50); cstmt.setInt(1, 20); cstmt.setInt(3, 90); 调用CallableStatement的registerOutParameter方法注册输出参数。 1 cstmt.registerOutParameter(4, Types.INTEGER); //注册out类型的参数,类型为整型。 调用CallableStatement的execute执行方法调用。 1 cstmt.execute(); 调用CallableStatement的getInt方法获取输出参数。 1 int out = cstmt.getInt(4); //获取out参数 示例: 1 2 3 4 5 6 7 8 9 10 11 12 //在数据库中已创建了如下存储过程,它带有out参数。 create or replace procedure testproc ( psv_in1 in integer, psv_in2 in integer, psv_inout in out integer ) as begin psv_inout := psv_in1 + psv_in2 + psv_inout; end; / 调用CallableStatement的close方法关闭调用语句。 1 cstmt.close(); 很多的数据库类如Connection、Statement和ResultSet都有close()方法,在使用完对象后应把它们关闭。要注意的是,Connection的关闭将间接关闭所有与它关联的Statement,Statement的关闭间接关闭了ResultSet。 一些JDBC驱动程序还提供命名参数的方法来设置参数。命名参数的方法允许根据名称而不是顺序来设置参数,若参数有默认值,则可以不用指定参数值就可以使用此参数的默认值。即使存储过程中参数的顺序发生了变更,也不必修改应用程序。目前 GaussDB数据库 的JDBC驱动程序不支持此方法。 GaussDB数据库不支持带有输出参数的函数,也不支持存储过程和函数参数默认值。 myConn.prepareCall("{? = CALL TESTPROC(?,?,?)}"),执行存储过程绑定参数时,可以按照占位符的顺序绑定参数,注册第一个参数为出参,也可以按照存储过程中的参数顺序绑定参数,注册第四个参数为出参,上述用例为此场景,注册第四个参数为出参。 当游标作为存储过程的返回值时,如果使用JDBC调用该存储过程,返回的游标将不可用。 存储过程不能和普通SQL在同一条语句中执行。 存储过程中inout类型参数必需注册出参。
  • 执行预编译SQL语句 预编译语句是只编译和优化一次,然后可以通过设置不同的参数值多次使用。由于已经预先编译好,后续使用会减少执行时间。因此,如果多次执行一条语句,请选择使用预编译语句。可以按以下步骤执行: 调用Connection的prepareStatement方法创建预编译语句对象。 1 PreparedStatement pstmt = con.prepareStatement("UPDATE customer_t1 SET c_customer_name = ? WHERE c_customer_sk = 1"); 调用PreparedStatement的setShort设置参数。 1 pstmt.setShort(1, (short)2); PrepareStatement设置绑定参数后,最终会构建成一个B报文或U报文,在下一步执行SQL语句时发给服务端。但是B报文或U报文有最大长度限制(不能超过1023MB),如果一次绑定数据过大,可能因报文过长导致异常。因此PrepareStatement设置绑定参数时需要注意评估和控制绑定数据的大小,避免出现超出报文上限要求的现象。 调用PreparedStatement的executeUpdate方法执行预编译SQL语句。 1 int rowcount = pstmt.executeUpdate(); 调用PreparedStatement的close方法关闭预编译语句对象。 1 pstmt.close();
  • Oracle兼容模式启用重载时,调用存储过程 打开参数behavior_compat_options='proc_outparam_override'后,JDBC调用事先创建的存储过程,步骤如下: 调用Connection的prepareCall方法创建调用语句对象。 1 2 3 4 5 6 // 认证用的用户名和密码直接写到代码中有很大的安全风险,建议在配置文件或者环境变量中存放(密码应密文存放,使用时解密),确保安全; // 本示例以用户名和密码保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量(环境变量名称请根据自身情况进行设置)EXAMPLE_USERNAME_ENV和EXAMPLE_PASSWORD_ENV。 String userName = System.getenv("EXAMPLE_USERNAME_ENV"); String password = System.getenv("EXAMPLE_PASSWORD_ENV"); Connection conn = DriverManager.getConnection("url",userName,password); CallableStatement cs = conn.prepareCall("{ CALL TEST_PROC(?,?,?) }"); 调用CallableStatement的setInt方法设置参数。 1 2 3 4 PGobject pGobject = new PGobject(); pGobject.setType("public.compfoo"); // 设置复合类型名,格式为“schema.typename”。 pGobject.setValue("(1,demo)"); // 绑定复合类型值,格式为“(value1,value2)”。 cs.setObject(1, pGobject); 调用CallableStatement的registerOutParameter方法注册输出参数。 1 2 3 4 // 注册out类型的参数,类型为复合类型,格式为“schema.typename”。 cs.registerOutParameter(2, Types.STRUCT, "public.compfoo"); // 注册out类型的参数,类型为Table类型,格式为“schema.typename”。 cs.registerOutParameter(3, Types.ARRAY, "public.compfoo_table"); 调用CallableStatement的execute执行方法调用。 1 cs.execute(); 调用CallableStatement的getObject方法获取输出参数。 1 2 3 4 5 6 7 8 9 10 11 12 // 返回结构是自定义类型 PGobject result = (PGobject)cs.getObject(2); // 获取out参数 result.getValue(); // 获取复合类型字符串形式值。 result.getArrayValue(); //获取复合类型数组形式值,以复合数据类型字段顺序排序。 result.getStruct(); //获取复合类型子类型名,按创建顺序排序。 result.getAttributes(); //返回自定义类型每列组成类型的对象,对于array类型和table类型返回的是PgArray,对于自定义类型,封装的是PGobject,对于其他类型数据存储方式为字符串类型。 // 返回结果是Table类型 PgArray pgArray = (PgArray) cs.getObject(3); ResultSet rs = pgArray.getResultSet(); while (rs.next()) { rs.getObject(2);// table类型每行的数据构建成的对象 } 如果出参的table类型组成为自定义类型,例如create type compfooTable is table of compfoo,此时接收到的返回对象为PgArray,在通过rs.getObject(2)遍历获取到的组成对象也为PgArray,此时无法获取到组成它的compfoo类型对应的每列数据,需要通过getPGobject()获取到PgObject在操作获取。 调用CallableStatement的close方法关闭调用语句。 1 cs.close(); oracle兼容模式开启参数后,调用存储过程必须使用{call proc_name(?,?,?)}形式调用,调用函数必须使用{? = call func_name(?,?)}形式调用(等号左侧的“?”为函数返回值的占位符,用于注册函数返回值)。 参数behavior_compat_options='proc_outparam_override'行为变更后,业务需要重新建立连接,否则无法正确调用存储过程和函数。 函数和存储过程中包含复合类型时,参数的绑定与注册需要使用schema.typename形式。 示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 // 在数据库创建复合数据类型。 CREATE TYPE compfoo AS (f1 int, f3 text); // 在数据库中已创建了如下存储过程,它带有out参数。 create or replace procedure test_proc ( psv_in in compfoo, psv_out out compfoo, table_out out compfoo_table ) as begin psv_out := psv_in; table_out:=compfoo_table(); table_out.extend(2); table_out(1):=psv_out; table_out(2):=psv_out; end; / // 在数据库中创建table类型。 create type compfoo_table is table of compfoo;
  • 词典概述 词典用于定义停用词(stop words),即全文检索时不搜索哪些词。 词典还可以用于对同一词的不同形式进行规范化,这样同一个词的不同派生形式都可以进行匹配。规范化后的词称为词位(lexeme)。 除了提高检索质量外,词的规范化和删除停用词可以减少文档tsvector格式的大小, 从而提高性能。词的规范化和删除停用词并不总是具有语言学意义,用户可以根据应用环境在词典定义文件中自定义规范化和删除规则。 一个词典是一个程序,接收标记(token)作为输入,并返回: 如果token在词典中已知,返回对应lexeme数组(注意,一个标记可能对应多个lexeme)。 一个lexeme。(该lexeme为设置了TSL_FILTER标志的lexeme,TSL_FILTER标志为过滤词典内部自动设置,用户不感知。)一个新token会代替输入token被传递给后继词典(当前词典可被称为过滤词典)。 如果token在词典中已知,但它是一个停用词,返回空数组。 如果词典不能识别输入的token,返回NULL。 GaussDB提供了多种语言的预定义字典,同时提供了五种预定义的词典模板,分别是Simple,Synonym,Thesaurus,Ispell,和Snowball,可用于创建自定义参数的新词典。 在使用全文检索时,建议用户: 可以在文本搜索配置中定义一个解析器,以及一组用于处理该解析器的输出标记词典。对于解析器返回的每个标记类型,可以在配置中指定不同的词典列表进行处理。当解析器输出一种类型的标记后,在对应列表的每个字典中会查阅该标记,直到某个词典识别它。如果它被识别为一个停用词, 或者没有任何词典识别,该token将被丢弃,即不被索引或检索到。通常情况下,第一个返回非空结果的词典决定了最终结果,后继词典将不会继续处理。但是一个过滤类型的词典可以依据规则替换输入token,然后将替换后的token传递给后继词典进行处理。 配置字典列表的一般规则是,第一个位置放置一个应用范围最小的、最具体化定义的词典,其次是更一般化定义的词典, 最后是一个普适定义的词典,比如Snowball词干词典或Simple词典。在下面例子中,对于一个针对天文学的文本搜索配置astro_en,可以定义标记类型asciiword(ASCII词)对应的词典列表为:天文术语的Synonym同义词词典, Ispell英语词典和Snowball 英语词干词典。 1 2 gaussdb=# ALTER TEXT SEARCH CONFIGURATION astro_en ADD MAPPING FOR asciiword WITH astro_syn, english_ispell, english_stem; 过滤类型的词典可以放置在词典列表中除去末尾的任何地方,放置在末尾时是无效的。使用这些词典对标记进行部分规范化,可以有效简化后继词典的处理。 父主题: 词典
  • 接口介绍 高级功能包DBE_MATCH支持的所有接口请参见表1。 表1 DBE_MATCH 接口名称 描述 DBE_MATCH.EDIT_DISTANCE_SIMILARITY 比较两个字符串的差距(删除、新增、变换的最小步骤),并归一化到0-100(100表示完全一致,0表示完全不一致)。 DBE_MATCH.EDIT_DISTANCE_SIMILARITY 比较两个字符串的差距(删除、新增、变换的最小步骤),并归一化到0-100(100表示完全一致,0表示完全不一致),DBE_MATCH.EDIT_DISTANCE_SIMILARITY函数原型为: 1 2 3 4 DBE_MATCH.EDIT_DISTANCE_SIMILARITY( str1 IN text, str2 IN text )returns integer ; 表2 DBE_MATCH.EDIT_DISTANCE_SIMILARITY接口参数说明 参数 描述 str1 第一个字符串,如果为null,直接输出0。 str2 第二个字符串,如果为null,直接输出0。
  • enable_cgroup_switch 参数说明:是否控制数据库执行语句时根据类型自动切换到TopWD组。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示控制数据库执行语句时根据类型自动切换到TopWD组。 off表示控制数据库执行语句时根据类型不自动切换到TopWD组。 默认值:off 该参数开启后,还依赖参数enable_control_group打开才能生效。
  • transaction_pending_time 参数说明:事务块语句和存储过程语句排队的最大时间。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,-1 ~ INT_MAX/2,单位为秒。 值为-1或0:事务块语句和存储过程语句无超时判断,排队至资源满足可执行条件。 值大于0:事务块语句和存储过程语句排队超过所设数值的时间后,无视当前资源情况强制执行。 默认值:0
  • resilience_ctrlstmt_control_iopslimit 参数说明:正常SQL语句被标记为慢SQL后,慢SQL可使用的最大IOPS上限。仅对非sysadmin/monitoradmin用户执行的select类型的语句生效。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符串,只能取如下几种类型的值:Low,Medium,High,None,0-INT_MAX。 默认值:None,表示关闭慢SQL逻辑IO管控功能。
  • session_respool 参数说明:当前的session关联的resource pool。 该参数属于USERSET类型参数,请参考表1中对应类型的设置方法进行设置。 即如果先设置cgroup_name,再设置session_respool,那么session_respool关联的控制组起作用,如果再切换cgroup_name,那么新切换的cgroup_name起作用。 切换cgroup_name的过程中如果指定到Workload控制组级别,数据库不对级别进行验证。级别的范围只要在1-10范围内都可以。 建议尽量不要混合使用cgroup_name和session_respool。 取值范围:string类型,通过create resource pool所设置的资源池。 默认值:invalid_pool
  • bbox_blanklist_items 参数说明:黑匣子core文件的脱敏数据选项。此参数只有当enable_bbox_dump为on时才生效。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:字符型,以逗号分隔的敏感数据选项的字符串。 默认值:空。表示bbox生成的core文件脱敏所有支持的敏感数据项。 目前支持脱敏的数据项: SHARED_BUFFER:buffer数据缓冲区 X LOG _BUFFER:redo日志缓冲区 DW_BUFFER:双写数据缓冲区 XLOG_MESSAGE_SEND:主备日复制日志发送缓冲区 WALRECIVER_CTL_BLOCK:主备复制日志接收缓冲区 DATA_MESSAGE_SEND:主备复制数据发送缓冲区 DATA_WRITER_QUEUE:主备复制数据接收缓冲区
  • enable_vacuum_control 参数说明:是否控制数据库常驻线程autoVacuumWorker到Vacuum控制组。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示控制数据库常驻线程autoVacuumWorker到Vacuum控制组。 off表示不控制数据库常驻线程autoVacuumWorker到Vacuum控制组。 默认值:off 该参数默认关闭,开启后会开启后台vacuum线程CPU管控功能,在vacuum线程消耗CPU高的场景下可以开启该参数来限制vacuum线程的CPU使用。 该参数开启后,还依赖参数enable_control_group打开才能生效。
  • enable_backend_control 参数说明:是否控制数据库常驻线程到DefaultBackend控制组。 该参数属于POSTMASTER类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示控制常驻线程到DefaultBackend控制组。 off表示不控制常驻线程到DefaultBackend控制组。 默认值:off 该参数默认关闭,开启后会开启后台线程CPU管控功能,在后台线程消耗CPU高的场景下可以开启该参数来限制后台线程的CPU使用。 该参数开启后,还依赖参数enable_control_group打开才能生效。
  • enable_control_group 参数说明:是否开启Cgroups功能。此参数需在CN和DN同时应用。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示打开Cgroups管理。 off表示关闭Cgroups管理。 默认值:off 当使用表1中的方式二来修改参数值时,需要重启节点才能生效内核CPU资源管理功能。 该参数默认关闭,开启后会开启用户CPU管控功能,会降低用户执行的作业的性能。
  • resilience_ctrlstmt_detect_timelimit 参数说明:正常SQL语句被标记为慢SQL的执行时间,0不做慢SQL识别,大于0表示执行的SQL执行时间超过该时间后备标记为慢SQL。仅对非sysadmin/monitoradmin用户执行的select类型的语句生效。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,0 ~ INT_MAX。 默认值:0,表示关闭慢SQL超时检测功能。
  • resource_track_cost 参数说明:设置对当前会话的语句进行资源监控的最小执行代价。该参数只有当参数enable_resource_track为on时才有效。 该参数属于USERSET类型参数,请参考表1中对应设置方法进行设置。 取值范围:整型,-1 ~ INT_MAX 值为-1时,不进行资源监控。 值大于或等于0时,值大于或等于0且小于等于9时,对执行代价大于等于10的语句进行资源监控。 值大于或等于10时,对执行代价超过该参数值的语句进行资源监控。 默认值:100000
  • disable_memory_protect 参数说明:禁止内存保护功能。当系统内存不足时如果需要查询系统视图,可以先将此参数置为on,禁止内存保护功能,保证视图可以正常查询。该参数只适用于在系统内存不足时进行系统诊断和调试,正常运行时请保持该参数配置为off。 该参数属于USERSET类型参数,且只对当前会话有效。请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示禁止内存保护功能。 off表示启动内存保护功能。 默认值:off
  • enable_bbox_dump 参数说明:是否开启黑匣子功能,在系统不配置core机制的时候仍可产生core文件。 该参数属于SIGHUP类型参数,请参考表1中对应设置方法进行设置。 取值范围:布尔型 on表示打开黑匣子功能。 off表示关闭黑匣子功能。 默认值:on 黑匣子功能生成core文件依赖操作系统开放ptrace接口。若发生权限不足(errno = 1),请确保/proc/sys/kernel/yama/ptrace_scope配置合理。
  • io_priority 参数说明:IO利用率高达50%时,重消耗IO作业进行IO资源管控时关联的优先级等级。 该参数属于USERSET类型参数,请参考表1中对应类型的设置的方法进行设置。 取值范围:枚举型 None: 表示不受控。 Low: 表示限制iops为该作业原始触发数值的10%。 Medium: 表示限制iops为该作业原始触发数值的20%。 High: 表示限制iops为该作业原始触发数值的50%。 默认值:None
共100000条