我的编程空间,编程开发者的网络收藏夹
学习永远不晚

DM怎样进行并行查询

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

DM怎样进行并行查询

DM怎样进行并行查询,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

倘若没有并行查询技术,一个串行执行的查询语句只能利用CPU或者磁盘设备中的一个,而不能利用整个计算机的处理能力。并行查询技术的出现,使得单个SQL语句能利用多个CPU和磁盘设备的处理能力。其优势在于可以通过多个线程来处理查询任务,从而提高查询的效率。

达梦数据库为具有多个CPU的数据库服务器提供并行查询的功能,以优化查询任务的性能。数据库服务器只有具有多个CPU,才能使用并行执行查询操作,来提高查询任务的速度。

达梦数据库通过三个步骤来完成并行查询:首先,确定并行任务数;其次,确定并行工作线程数;最后,执行查询。并行查询相关参数见下表:
参数名 缺省值 属性 说明
MAX_PARALLEL_DEGREE 1 动态,会话级 用来设置默认并行任务个数。取值范围:1~128。缺省值1,表示无并行任务。当PARALLEL_POLICY值为1时该参数值才有效。

parallel_policy 0 静态 用来设置并行策略。取值范围:0、1和2,缺省为0。其中,0表示不支持并行;1表示自动并行模式;2表示手动并行模式。

PARALLEL_THRD_NUM 10 静态 用来设置并行工作线程个数。取值范围:1~1024。

当开启自动并行(PARALLEL_POLICY=1)时,参数MAX_PARALLEL_DEGREE生效,控制并行查询最多使用的线程数。MAX_PARALLEL_DEGREE缺省值为1,表示不并行。此时若指定参数对应的HINT “PARALLEL”,则使用HINT值;

当开启手动并行(PARALLEL_POLICY=2)时,参数MAX_PARALLEL_DEGREE失效,用户需要在语句中使用此参数对应的HINT “PARALLEL”指定语句的并行度,否则不并行。

1.在INI参数中设置默认值
INI参数MAX_PARALLEL_DEGREE设置最大并行任务个数。取值范围:1~128。缺省值1,表示无并行任务,此参数仅在PARALLEL_POLICY值为1时才有效。
例如,在INI参数中将MAX_PARALLEL_DEGREE设置为3的格式如下:
MAX_PARALLEL_DEGREE 3

先查看max_parallel_degree的缺省值

SQL> select sf_get_para_value(1,'MAX_PARALLEL_DEGREE');
LINEID     SF_GET_PARA_VALUE(1,'MAX_PARALLEL_DEGREE')
---------- ------------------------------------------
1          1
used time: 150.207(ms). Execute id is 197.

下面的查询将查看dm.ini文件中设置的max_parallel_degree参数值

SQL> select * from v$dm_ini where para_name='MAX_PARALLEL_DEGREE';
LINEID     PARA_NAME           PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION                      PARA_TYPE
---------- ------------------- ---------- --------- --------- ------- ---------- ---------- -------------------------------- ---------
1          MAX_PARALLEL_DEGREE 1          1         128       N       1          1          Maximum degree of parallel query SESSION
used time: 50.228(ms). Execute id is 198.

下面的查询将查看内存中的max_parallel_degree参数值

SQL> select * from v$parameter where name='MAX_PARALLEL_DEGREE';
LINEID     ID          NAME                TYPE    VALUE SYS_VALUE FILE_VALUE DESCRIPTION
---------- ----------- ------------------- ------- ----- --------- ---------- --------------------------------
1          274         MAX_PARALLEL_DEGREE SESSION 1     1         1          Maximum degree of parallel query
used time: 7.440(ms). Execute id is 199.

现在执行下面的命令来同时修改内存与dm.ini文件中的max_parallel_degree参数为3

SQL> call sp_set_para_value(1,'MAX_PARALLEL_DEGREE',3);
DMSQL executed successfully
used time: 7.183(ms). Execute id is 200.

执行下面的查询可以看到max_parallel_degree参数修改为3了

SQL> select sf_get_para_value(1,'MAX_PARALLEL_DEGREE');
LINEID     SF_GET_PARA_VALUE(1,'MAX_PARALLEL_DEGREE')
---------- ------------------------------------------
1          3
used time: 5.544(ms). Execute id is 201.

从查询返回的sess_value与file_value都为3可以确定max_parallel_degree在dm.ini文件中已经被修改了

SQL> select * from v$dm_ini where para_name='MAX_PARALLEL_DEGREE';
LINEID     PARA_NAME           PARA_VALUE MIN_VALUE MAX_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION                      PARA_TYPE
---------- ------------------- ---------- --------- --------- ------- ---------- ---------- -------------------------------- ---------
1          MAX_PARALLEL_DEGREE 3          1         128       N       3          3          Maximum degree of parallel query SESSION
used time: 6.910(ms). Execute id is 202.

从查询返回的sys_value为3可以在内存中max_parallel_degree也已经被修改了。

SQL> select * from v$parameter where name='MAX_PARALLEL_DEGREE';
LINEID     ID          NAME                TYPE    VALUE SYS_VALUE FILE_VALUE DESCRIPTION
---------- ----------- ------------------- ------- ----- --------- ---------- --------------------------------
1          274         MAX_PARALLEL_DEGREE SESSION 3     3         3          Maximum degree of parallel query
used time: 6.335(ms). Execute id is 203.

然后,使用一般的SQL语句查询即可执行并行查询,不需要使用HINT。如:

SQL> explain SELECT * FROM SYSOBJECTS;
1   #NSET2: [0, 1694, 396]
2     #LOCAL COLLECT: [0, 1694, 396]; op_id(1) n_grp_by (0) n_cols(0) n_keys(0) for_sync(FALSE)
3       #PRJT2: [0, 1694, 396]; exp_num(17), is_atom(FALSE)
4         #CSCN2: [0, 1694, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as SYSOBJECTS)
used time: 0.951(ms). Execute id is 0.

执行计划中的LOCAL COLLECT 代表:本地并行下数据收集处理,代替LOCAL GATHER。

2.在SQL语句中使用“PARALLEL”关键字特别指定
当PARALLEL_POLICY=2时,需要在SQL语句中通过“PARALLEL”HINT指定并行度,否则不并行。若PARALLEL_POLICY=1,则SQL语句中使用的“PARALLEL”HINT总是优先于MAX_PARALLEL_DEGREE参数设置。“PARALLEL”关键字的用法是在数据查询语句的SELECT关键字后,增加HINT子句来实现。

HINT语法格式如下:

例如,下面的例子中,即使已经设置了MAX_PARALLEL_DEGREE默认值3,但实际使用的为PARALLEL指定的任务个数4:

SQL> explain SELECT  * FROM SYSOBJECTS;
1   #NSET2: [0, 1694, 396]
2     #LOCAL COLLECT: [0, 1694, 396]; op_id(1) n_grp_by (0) n_cols(0) n_keys(0) for_sync(FALSE)
3       #PRJT2: [0, 1694, 396]; exp_num(17), is_atom(FALSE)
4         #CSCN2: [0, 1694, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as SYSOBJECTS)
used time: 0.967(ms). Execute id is 0.

另外,每个语句中仅能设置一次并行任务个数,如果设置了多次,则以最后一次设置为准,而且任务个数在全语句中生效。

例如,下面的例子中,使用的并行任务个数为2。

SQL> call sp_set_para_value(1,'MAX_PARALLEL_DEGREE',1);
DMSQL executed successfully
used time: 6.554(ms). Execute id is 211.
SQL> select sf_get_para_value(1,'MAX_PARALLEL_DEGREE');
LINEID     SF_GET_PARA_VALUE(1,'MAX_PARALLEL_DEGREE')
---------- ------------------------------------------
1          1
used time: 5.569(ms). Execute id is 212.
SQL> explain SELECT  * FROM SYSOBJECTS;
1   #NSET2: [0, 1694, 396]
2     #LOCAL COLLECT: [0, 1694, 396]; op_id(1) n_grp_by (0) n_cols(0) n_keys(0) for_sync(FALSE)
3       #PRJT2: [0, 1694, 396]; exp_num(17), is_atom(FALSE)
4         #CSCN2: [0, 1694, 396]; SYSINDEXSYSOBJECTS(SYSOBJECTS as SYSOBJECTS)
used time: 1.067(ms). Execute id is 0.

这种方式能够为单条查询语句设置额外的并行任务个数,以此来提高某些特殊查询任务的性能。

在执行并行查询任务之前,您需要指定完成该任务的并行工作线程数。值得注意的是,实际使用的线程数并非总是等于并行工作线程数。并行工作线程数是在INI参数中设定的,实际使用并行工作线程数是根据系统的实际状况确定的。
1. 并行工作线程数,在INI参数中设定
首先,使用PARALLEL_POLICY参数来设置并行策略。取值范围:0、1和2,默认值0。其中,0表示不支持并行;1表示自动并行模式;2表示手动并行模式。

当开启本地并行(PARALLEL_POLICY>0)时,使用PARALLEL_THRD_NUM指定本地并行查询使用的线程数,取值范围为1~1024,缺省值为10。需要注意的是,若PARALLEL_POLICY=1,如果PARALLEL_THRD_NUM=1, 则按照CPU个数创建并行线程。

例如,设置并行策略PARALLEL_POLICY为2,即手动设置并行工作线程数;同时,设置并行工作线程数PARALLEL_THRD_NUM为4个。

SQL> call sp_set_para_value(2,'PARALLEL_POLICY',2);
DMSQL executed successfully
used time: 6.942(ms). Execute id is 223.
SQL> call sp_set_para_value(2,'PARALLEL_THRD_NUM',4);
DMSQL executed successfully
used time: 6.871(ms). Execute id is 224.

当然,并非所有的查询都适合使用并行查询。大量占用CPU 周期的查询最适合采用并行查询的功能。例如,大型表的连接查询、大量数据的聚合和大型结果集的排序等都很适合采用并行查询。对于简单查询(常用于事务处理应用程序)而言,执行并行查询所需的额外协调工作会大于潜在的性能提升。所以,数据库管理员在确定是否需要使用并行策略的时候,需要慎重。

2. 实际使用的线程数,达梦数据库会根据每个并行查询操作自动检测
实际使用线程数是数据库在查询计划执行时初始化的时候确定的。也就是说,这不需要用户去干预,而是系统根据并行任务数和实际空闲的并行工作线程数来确定的。此操作所依据的条件如下:首先,检测达梦数据库是否运行在具有多个CPU的计算机上。只有具有多个CPU 的计算机才能使用并行查询。这是一个硬性的限制条件。其次,检测可用的空闲工作线程是否足够。并行查询到底采用多少线程数,除了跟操作的复杂程度相关外,还跟当时的服务器状态相关,如是否有足够的可用的空闲工作线程数量等。每个并行查询操作都要求一定的工作线程数量才能够执行;而且执行并行计划比执行串行计划需要更多的线程,所需要的线程数量也会随着任务个数的提高而增加。当无法满足特定并行查询执行的线程要求时,数据库引擎就会自动减少任务个数,甚至会放弃并行查询而改为串行计划。所以,即使同一个操作在不同时候可能会采用不同的线程数。

例如,即使设置并行工作线程数为4。而实际使用的线程数可能只有3个,或者更少。

使用手动并行模式时,只需要在INI参数中设置好如下2个参数,然后执行并行SQL查询语句时,需手动指定当前并行任务个数。若不指定,将不使用并行。设置的2个参数如下:
PARALLEL_POLICY 2
PARALLEL_THRD_NUM 4

使用自动并行模式时,一般指定如下三个参数:
MAX_PARALLEL_DEGREE 3
PARALLEL_POLICY 1
PARALLEL_THRD_NUM 10
另外,当PARALLEL_POLICY为0时,即使有并行任务,也不支持并行。

然后,执行语法格式类似“SELECT * FROM SYSOBJECTS;”的并行SQL语句即可,本条语句使用默认并行任务数3。

当然,如果单条查询语句不想使用默认并行任务数,可以通过在SQL语句中增加HINT,通过“PARALLEL”关键字来特别指定。此时,执行的并行SQL语句格式为“SELECT * FROM SYSOBJECTS;”,本条语句使用的并行任务数为4。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

DM怎样进行并行查询

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎样进行MongoDB文档查询操作

这篇文章将为大家详细讲解有关怎样进行MongoDB文档查询操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。nullnull的查询稍微有点不同,假如我想查询z为null的数据,如下:db.s
2023-06-19

怎么使用Node.js连接数据库并进行查询

这篇“怎么使用Node.js连接数据库并进行查询”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Node.js连接数据
2023-07-05

如何使用JPA进行CriteriaQuery进行查询

本篇内容介绍了“如何使用JPA进行CriteriaQuery进行查询”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!使用JPA Criteri
2023-06-21

oracle并行查询如何写

在Oracle中进行并行查询可以通过使用HINT来指定并行度。以下是一个简单的例子:SELECT * FROM your_table;在上面的例子中,parallel(4)指定了并行度为4,这意味着查
oracle并行查询如何写
2024-04-09

MyBatis中怎么进行分页查询

在MyBatis中进行分页查询可以通过两种方式实现:使用分页插件:MyBatis提供了一些分页插件,如PageHelper,可以方便地进行分页查询。使用PageHelper可以在查询语句前调用PageHelper.startPage方法设置
MyBatis中怎么进行分页查询
2024-03-07

PHP怎么进行无限级查询

这篇文章主要讲解了“PHP怎么进行无限级查询”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP怎么进行无限级查询”吧!一、什么是无限级分类无限级分类是一种树状结构的分类方式,在网站中非常常
2023-07-05

ThinkPHP中怎么进行条件查询

本文小编为大家详细介绍“ThinkPHP中怎么进行条件查询”,内容详细,步骤清晰,细节处理妥当,希望这篇“ThinkPHP中怎么进行条件查询”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、使用where方法添加
2023-07-05

dedecms怎么进行数据库查询

dedecms进行数据库查询的步骤是:1、登录到DedeCMS后台管理界面;2、导航到“数据库管理”页面;3、根据您的需求,编写相应的查询语句;4、点击执行按钮或提交按钮来执行查询;5、查看符合查询条件的记录即可。本教程操作系统:Windo
2023-08-03

Linux命令行下怎样查询字典

这期内容当中小编将会给大家带来有关Linux命令行下怎样查询字典,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。查字典谁不会,但是你会在Linux系统中查字典吗?首先你需要本地设置dictd。dictd 是
2023-06-28

怎样启动并进入Linux命令行

本篇内容介绍了“怎样启动并进入Linux命令行”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!可能有时候你启动 Linux 时需要或者希望不使
2023-06-16

递归查询与PostgreSQL的并行查询功能

递归查询和PostgreSQL的并行查询功能是两个不同的概念,它们在数据库查询中有不同的应用场景递归查询:递归查询是指在查询过程中,一个查询的结果作为另一个查询的输入。这种查询通常用于处理层次结构或者递归关系的数据。在PostgreSQL
递归查询与PostgreSQL的并行查询功能
2024-09-08

MySQL如何查询重复记录并进行去重

可以使用以下方法来查询重复记录并进行去重:查询重复记录:SELECT column1, column2, COUNT(*)FROM table_nameGROUP BY column1, column2HAVING COUNT(*)
MySQL如何查询重复记录并进行去重
2024-03-06

使用python进行whois查询

使用python进行whois查询使用pip命令安装whoispip install python-whoisPython 2.7.6 (default, Oct 26 2016, 20:30:19) [GCC 4.8.4] on lin
2023-01-31

如何用LINQ进行查询

本篇内容介绍了“如何用LINQ进行查询”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!LINQ to XML 提供使用 .NET 语言集成查询
2023-06-17

编程热搜

目录