首页 文章 精选 留言 我的

精选列表

搜索[提高],共10000篇文章
优秀的个人博客,低调大师

红帽OpenShift容器平台3.3提高DevOps采用率和应用扩展能力

红帽公司日前宣布推出红帽OpenShift容器平台3.3版本,在安全的企业级容器平台上提供了新的开发人员特性和部署扩展能力,旨在增强混合云环境中的应用交付能力。红帽OpenShift容器平台可支持企业构建与维护云原生和传统应用,提供了一款从开发到投入生产的整个应用生命周期内使用的解决方案。 红帽OpenShift容器平台3.3基于开放式行业标准,以及红帽企业Linux的可靠的基础而构建,提供了具有Linux容器和容器编排创新能力单一的平台,并且在经过加固的企业级产品中提供了应用开发和部署能力。红帽OpenShift容器平台的最新版本提供了企业版的Kubernetes 1.3和Docker容器运行环境,该环境以红帽企业Linux 7为基础,可帮助客户享受快速创新带来的收益,同时保持企业级平台的稳定性、可靠性和安全性。 红帽OpenShift容器平台3.3的新特性包括: 增强开发人员生产力和敏捷性 在现代IT企业中,开发人员需要更快地提供更优秀的应用和应用更新。红帽OpenShift容器平台通过基于Jenkins Pipeline项目的最新连续交付管道和呈现应用管道统一视图的开发人员汇总仪表板,将新的自动化能力融合到应用开发生命周期内,从而帮助解决了这一需求。此外,该平台的新特性通过OpenShift的集成化路由和软件定义的网络能力以及对应用路由配置的精细控制,实现了更佳的A/B测试自动化。 云级部署 由于向云环境演进需要计算平台具有更高的扩展能力和灵活性,红帽OpenShift容器平台3.3可帮助提供更好的平台扩展性,对于大规模运行关键任务应用、在每个计算集群中支持1,000个节点的企业来说,这是一项至关重要的需求。这允许更大规模的部署,不仅支持新的应用,而且支持混合云环境中原有的应用,从而帮助企业保留现有的应用投资,而不必牺牲创新能力。此外,红帽OpenShift容器平台固有的Kubernetes能力现在可以主动监控并预防资源匮乏和意外宕机。 企业级安全 安全是企业采用Linux容器技术最关心的问题之一。OpenShift提供了一个安全的企业就绪型容器平台,其中包括对于Linux操作系统、容器平台和集成化应用服务的支持。OpenShift中包含了最可信、最安全的企业Linux平台 – 红帽企业Linux,并且继承了其所有安全特性和持续更新。安全特性已经扩展到Docker容器运行环境中,而且该环境与安全增强Linux集成,提供了额外的多租户安全能力,并且扩展到OpenShift的集成化容器注册表中,允许管理员对Docker格式的容器镜像进行管理,同时允许控制接入和镜像更新。OpenShift容器平台3.3融合了更多针对用户、团队及其项目的注册表增强能力,包括查看镜像细节和管理镜像接入的能力。OpenShift还为与企业级LDAP系统集成的Kubernetes提供了集成的用户授权和基于角色的接入控制能力,并为容器的执行提供了集成的安全策略,以便管理员在单一地点能够进行控制用户接入、权限、配额和接入,并提取和运行容器镜像等操作。 红帽全系列的容器产品涵盖私有云和全面管理的公有云产品,可在跨多个基础架构并提供容器即服务的单个解决方案中支持应用开发流程的不同方面。这些基础架构环境包括红帽容器开发包中包含的红帽OpenShift Container Local(红帽OpenShift容器本地版)、红帽OpenShiftContainer Lab(红帽OpenShift容器实验室)、OpenShift Online和OpenShift Dedicated。红帽针对容器而优化的解决方案系列包括存储、应用服务和管理产品,以及免费的开发工具。 红帽OpenShift容器平台3.3从2016年9月27日起供客户下载。OpenShift Online和OpenShift Dedicated平台将在OpenShift容器平台3.3上市后很快更新。 原文发布时间为:2016年9月28日 本文来自云栖社区合作伙伴至顶网,了解相关信息可以关注至顶网。

优秀的个人博客,低调大师

IoT设备网络会帮你削减开支&提高生产力吗?

美国德克萨斯州一家啤酒分销商一直使用思科的IoT设备和网络设备降低能源成本和提升工人生产力。 Del Papa是一家位于美国德克萨斯州的啤酒、饮用水和功能饮料分销商,它在2012年春季开始在其德克萨斯市工厂中使用思科的IoT技术。这个公司曾经只是希望减少能源开支,但是它发现IoT技术也会带来其他一些红利:它能帮助工人填写订单并将订单快速发出。 这个公司现在可以监控加热、通风和空调系统,然后远程实时作出修改。紧密关注恒定温度是很重要的,因为Del Papa与Anheuser-Busch签定了协议,要保持仓库温度恒定在一个指定的温度上,以保护啤酒不变质。 类似地,公司也可以远程控制建筑物的照明。许多灯光都是自动控制的,办公室灯光在上午8点打开,然后在下午5点熄灭。仓库安装的是动作感应灯光,如果15分钟内没有检测到活动物体,它们就会自己熄灭。这会带来一些附加好处;如果系统显示仓库后面的灯光半夜里打开,那么公司就需要检查是否有人闯入建筑物了。如果灯光在深夜意外打开着,那么他们也可以远程关闭灯光。 Del Papa公司的信息系统经理Steve Holtsclaw说:“我们不得不向董事会推销其效率。这里需要一定的提前支付成本,但是如果对比一下现在与以前所消耗的电量数,我们就可以看到有很多的节省。我们还可以设定目标,确定我们每月或每年的使用限额,然后控制电源使用情况,从而将耗电量控制在目标范围之内。” 支持IoT技术的网络也会意料之外地大大提升生产力。这家公司之前使用的无线基础架构不够可靠,如果一名员工站在仓库的一个特定区域,那么他可能会失去信号,然后无法在无线设备上查看一个到达订单的明细信息。这时,这名员工又不得不走支仓库的其他区域,才能查看订单和发送产品。现在,整个仓库布满了信号很强的统一无线覆盖,完全消除了这些死角。 Holtsclaw说:“填写订单就是在销售啤酒和赚钱。你没有想到它在消耗时间,但是因为时间浪费,旧系统将8小时工作拖延到10小时工作才完成,造成延迟的原因包括订单确认时间和卡车装货时间。我们现在再也没有这样的问题了。” Holtsclaw和他的团队不得不去除大部分遗留网络,然后从零开始重新建设他们的IoT基础架构。 Holtsclaw说:“我们混搭使用了各种供应商产品,这些设备相互间无法协同工作。它们全部都已经过时,已经无法满足我们的要求了。” Del Papa的网络在接入层和分布层上运行着思科的Catalyst 3850系列和3750-X系列交换机,在核心网络中运行Nexus 7000系列交换机,然后使用Aironet 3602i AP部署WLAN和思科5508无线控制器。此外,它还使用供应商的集成服务路由器(Integrated Services Routers),用一条光纤骨干线路连接工厂,由它连接每一栋建筑内部的中间配送架。Holtsclaw希望保证所有交换机端口都支持最高10Gbps的容量,以便适应未来的扩展需求。 他说:“我购买这种设备时不仅考虑目前的使用需求,也考虑将来的需求。现在所有东西都是最低配置,但是它们可以通过简单的替换而升级配置。” 这些传感器组合使用无线和有线连接,而且它们都通过网络IP地址进行通信。Holtsclaw说:“网络上的这些传感器或节点都会主动发送心跳到管理这些设备的服务服务器和应用程序。这种主动连接支持实时管理每一台设备,以及精确读取这些设备的状态与设置。” 这家公司在安装这项技术后也遇到了一些问题——但是问题不在于技术本身应有的功能上,而在于培训非IT员工如何正确使用这项技术。 他说:“我们许多人通常还无法应付这项技术,因此需要投入很大的力量去培训人员。在前几个月里,有时候大门无法打开,因为仓库人员还在逐渐软件,所以我的团队有时候需要介入培训。” Zones是帮助建设Del Papa网络的思科合作伙伴,它的IoT解决方案副总裁Stephen Lurie指出,随着公司业务发现使用数据提升效率的新方法,IoT一定会继续增长。 Lurie说:“所有这些传感器都有自己的话语(数据)。它们使用不同的说话语言(数据传输方式)。现在,使用IoT就能够让我们听懂它们的话。” 作者:Dina Gerdeman 曾少宁译 来源:51CTO

优秀的个人博客,低调大师

提高查询性能,用GaussDB(DWS) in表达式还是or表达式?

摘要:在本文中,我将重点分析在各种通用场景下,IN 运算符和 OR 运算符查询的性能差异,并探索这些性能差异背后的原因,目的是为了帮助DWS用户最大化的提升其查询性能。 本文分享自华为云社区 《GaussDB(DWS) in表达式还是or表达式》 ,作者:一只小兵。 前言 适用版本:【9.1.0(及以上)】 声明式查询语言(如 SQL)的最初想法是,用户直接要求数据库管理系统 (DBMS) 给出其想要的答案,而无需考虑其计算方式与计算过程。DBMS的查询优化器负责确定查询的最高效执行计划。理想情况下,如果您使用不同的 SQL 命令提出相同的问题,DBMS应该选择相同的最佳计划。遗憾的是,实际情况并非总是如此,查询性能通常取决于用户编写查询的方式。有时对SQL 进行简单的改写即能得到显著的性能提升。 在WHERE语句中使用IN和OR运算符对查询的结果做过滤是上述问题的代表场景之一,如下面的查询语句范例,它们产生的查询结果是一致的,但执行的时间可能不同: 在本文中,我将重点分析在各种通用场景下,IN 运算符和 OR 运算符查询的性能差异,并探索这些性能差异背后的原因,目的是为了帮助DWS用户最大化的提升其查询性能。 TL;DR: IN运算符在部分场景性能远优于OR运算符,在其他场景下两种运算符性能基本一致。本文推荐在查询中尽量使用IN运算符,对于具有大量谓词的查询尤其如此 。 实验数据准备 声明:本文重点比较IN运算符与OR运算符的执行性能差异,差异比例可做参考,查询的绝对执行时间则无参考价值。 -- 建表, DWS列存,hstore_opt表,并声明id列为primary key。 CREATE TABLE item( id INTEGER NOT NULL, name VARCHAR(30), price INTEGER, quantity INTEGER, primary key (id) ) WITH (orientation=COLUMN, enable_hstore_opt=TRUE); -- 随机插入两百万行数据。 INSERT INTO item SELECT id, SUBSTR(MD5(RANDOM()::text), 0, 20) AS name, (RANDOM() * 10000)::int AS price, (RANDOM() * 10000)::int AS quantity FROM generate_series(1, 2000000) AS t(id); -- Merge all data from hstore delta table info CU. select hstore_full_merge('item'); 本实验使用Hstore OPT列存表,开启Turbo执行引擎。由于Hstore Opt表在单行数据插入时,会先插入delta表,并异步写成CU中。本文为了去除查询delta表对实验数据的影响,手动执行一次merge,保证所有delta表中数据都已写入CU。 单一属性过滤 我们首先比较使用单一列过滤的性能差异,大部分复制查询的内部都包含对单一列进行过滤的场景。 单个索引属性 首先,当单一属性上声明了索引,我们检验在WHERE 子句中使用单个 IN 运算符和使用多个 OR 子句运行相同的查找的性能差异。上诉语句声明中,id列声明为唯一列,DWS会自动为此列创建索引,我们使用此列进行下列的实验。我们首先运行IN语句,然后运行OR语句,并不断的增加条件中需要查找的ID个数。 -- IN expression SELECT * FROM item WHERE id IN (...); -- OR expression SELECT * FROM item WHERE id = ? OR id = ? OR ... ; 下图显示了性能数据对比。理论上,两个查询在同一张表上计算相同的结果,优化器应该总能能选出最优的执行方式,从而上述个查询执行的时间应该相同。然而,当过滤条件较少时,两种表达式的执行时间相差不大。而随着过滤条件的个数增加,IN运算符的执行速度远快于OR运算符。当过滤条件个数为1000时,IN运算符比OR运算符快了10倍(48ms vs 501ms)。 为了理解出现这种情况的原因,让我们来看一下上面两种运算符分别对应的执行计划的差异: postgres=# explain SELECT * FROM item where id in (1559267,311557,234010,1863199,876092,580136,1116400,575622,380796,1518233); QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------- id | operation | E-rows | E-memory | E-width | E-costs ----+------------------------------------------+--------+----------+---------+--------- 1 | -> Row Adapter | 10 | | 43 | 63.79 2 | -> Vector Streaming (type: GATHER) | 10 | | 43 | 63.79 3 | -> CStore Index Heap Scan on item | 10 | 16MB | 43 | 57.79 4 | -> CStore Index Ctid Scan | 10 | 1MB | 0 | 38.12 Predicate Information (identified by plan id) --------------------------------------------------------------------------------------------------------------------------- 3 --CStore Index Heap Scan on item Recheck Cond: (id = ANY ('{1559267,311557,234010,1863199,876092,580136,1116400,575622,380796,1518233}'::integer[])) 4 --CStore Index Ctid Scan Index Cond: (id = ANY ('{1559267,311557,234010,1863199,876092,580136,1116400,575622,380796,1518233}'::integer[])) postgres=# explain SELECT * FROM item WHERE id = 1559267 OR id = 311557 OR id = 234010 OR id = 1863199 OR id = 876092 OR id = 580136 OR id = 1116400 OR id = 575622 OR id = 380796 OR id = 1518233; QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- id | operation | E-rows | E-memory | E-width | E-costs ----+-----------------------------------------------------------------+--------+----------+---------+--------- 1 | -> Row Adapter | 10 | | 43 | 61.99 2 | -> Vector Streaming (type: GATHER) | 10 | | 43 | 61.99 3 | -> CStore Index Heap Scan on item | 10 | 16MB | 43 | 55.99 4 | -> CStore Index Or(5, 6, 7, 8, 9, 10, 11, 12, 13, 14) | 10 | 1MB | 0 | 36.25 5 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 6 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 7 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 8 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 9 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 10 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 11 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 12 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 13 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 14 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 Predicate Information (identified by plan id) -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 --CStore Index Heap Scan on item Recheck Cond: ((id = 1559267) OR (id = 311557) OR (id = 234010) OR (id = 1863199) OR (id = 876092) OR (id = 580136) OR (id = 1116400) OR (id = 575622) OR (id = 380796) OR (id = 1518233)) 5 --CStore Index Ctid Scan Index Cond: (id = 1559267) 6 --CStore Index Ctid Scan Index Cond: (id = 311557) 7 --CStore Index Ctid Scan Index Cond: (id = 234010) 8 --CStore Index Ctid Scan Index Cond: (id = 1863199) 9 --CStore Index Ctid Scan Index Cond: (id = 876092) 10 --CStore Index Ctid Scan Index Cond: (id = 580136) 11 --CStore Index Ctid Scan Index Cond: (id = 1116400) 12 --CStore Index Ctid Scan Index Cond: (id = 575622) 13 --CStore Index Ctid Scan Index Cond: (id = 380796) 14 --CStore Index Ctid Scan Index Cond: (id = 1518233) IN运算符首先进行Index Ctid Scan扫描主键索引以获取满足条件的行ctid,索引过滤的条件为IN条件。获取到所有满足的Ctid后,进行Index Heap Scan查询原表,获取并返回所有用户所需列。 OR运算符也是首先进行Index Ctid Scan扫描主键索引表,但索引的过滤条件为单个谓词,每个OR条件都需要执行一次查找。查找完成后进行Index OR汇总,最后也是进行Index Heap Scan查询原表。 OR运算符性能较差的原因在于需要为每个谓词做一次索引扫描并建立一个位图,即id = 1 为一个位图,id = 2 为一个位图等等。随后进行按位或组合这些位图。在谓词个数为1000时,需要进行1000次索引扫描并生成1000个位图,与只进行一此索引扫描的IN运算符相比,效率大大降低。并且随着谓词个数的增加,性能差别会逐步拉大。 单个未索引属性 接下来,我们基于单个未索引属性(price)进行相同的比较:一个使用单个 IN 子句,另一个使用多个带有相等谓词的 OR 子句。然后,我们增加每个查询的谓词个数。 -- IN expression SELECT * FROM item WHERE price IN (...); -- OR expression SELECT * FROM item WHERE price = ? OR price = ? OR ... ; 下图显示了性能数据对比。IN表达式的性能依旧优于OR表达式,并且性能差距相比索引属性更大。在谓词个数为1000时,性能差别达到了40倍(150ms vs 6399ms)。 让我们依旧通过生成的执行计划来看差异的原因: postgres=# explain SELECT * FROM item where price in (1988,5547,6631,4931,5752,2119,9647,3724,5146,873); QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------- id | operation | E-rows | E-memory | E-width | E-costs ----+----------------------------------------+--------+----------+---------+---------- 1 | -> Row Adapter | 1921 | | 43 | 19105.85 2 | -> Vector Streaming (type: GATHER) | 1921 | | 43 | 19105.85 3 | -> CStore Scan on item | 1921 | 1MB | 43 | 19015.85 Predicate Information (identified by plan id) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------- 3 --CStore Scan on item CU Predicate Filter: (price = ANY ('{1988,5547,6631,4931,5752,2119,9647,3724,5146,873}'::integer[])) Pushdown Predicate Filter: (((price >= 873) AND (price <= 9647)) AND ((price = 1988) OR (price = 5547) OR (price = 6631) OR (price = 4931) OR (price = 5752) OR (price = 2119) OR (price = 9647) OR (price = 3724) OR (price = 5146) OR (price = 873))) postgres=# explain SELECT * FROM item where price = 1988 OR price = 5547 OR price = 6631 OR price = 4931 OR price = 5752 OR price = 2119 OR price = 9647 OR price = 3724 OR price = 5146 OR price = 873; QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- id | operation | E-rows | E-memory | E-width | E-costs ----+----------------------------------------+--------+----------+---------+---------- 1 | -> Row Adapter | 1921 | | 43 | 31356.73 2 | -> Vector Streaming (type: GATHER) | 1921 | | 43 | 31356.73 3 | -> CStore Scan on item | 1921 | 1MB | 43 | 31266.73 Predicate Information (identified by plan id) -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 3 --CStore Scan on item Filter: ((price = 1988) OR (price = 5547) OR (price = 6631) OR (price = 4931) OR (price = 5752) OR (price = 2119) OR (price = 9647) OR (price = 3724) OR (price = 5146) OR (price = 873)) Pushdown Predicate Filter: ((price = 1988) OR (price = 5547) OR (price = 6631) OR (price = 4931) OR (price = 5752) OR (price = 2119) OR (price = 9647) OR (price = 3724) OR (price = 5146) OR (price = 873)) 从计划上来看,IN运算符与OR运算符的执行算子一致,唯一不同的是Predicate Information。IN运算符生成的是CU Predicate Filter, OR运算符生成的是Filter。 CU Predicate Filter意味着此过滤条件下推到了存储层过滤,这样的做法可以减少了性能消耗。原因在于其直接在读CU(DWS列存表单列数据的基本存储单位)的时候就将不必要的数据过滤掉,而无需将其先填入Batch(DWS执行引擎中单列数据的基本存储单位)中,然后在执行器中进行过滤。 除此以外,可以看到IN运算符的过滤条件为ANY,而OR运算符的过滤条件为OR。当起ANY条件下推到存储层时,存储层会生成一个临时的哈希表,并将条件中的谓词都存入哈希表中。相比多个OR条件,在进行过滤时,只需进行一次哈希比较,而无需逐个谓词比较,算法复杂度由O(N)变成了O(1),大大的提升了执行性能。 需要注意的是,截止到本文撰写的时间,只有部分场景的IN运算符支持下推到存储层。让我们来看一下当不支持下推到存储层时,执行层执行IN运算符的性能如何。 为了方便起见,这里不特意构造不下推的语句了,而是简单的通过设置GUC参数enable_cu_predicate_pushdown来关闭存储层下推: postgres=# set enable_cu_predicate_pushdown = off; SET 以下是性能数据比较: 可以看到,虽然IN + 执行层运算相比IN直接下推到存储层运行的性能较差,但相差不远。及时没有下推到存储层,IN运算符的性能相比OR运算符依旧有较大的提升。 让我们来分析一下是IN运算符在执行层的执行的计划: postgres=# explain SELECT * FROM item where price in (1988,5547,6631,4931,5752,2119,9647,3724,5146,873); QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------- id | operation | E-rows | E-memory | E-width | E-costs ----+----------------------------------------+--------+----------+---------+---------- 1 | -> Row Adapter | 1921 | | 43 | 19105.85 2 | -> Vector Streaming (type: GATHER) | 1921 | | 43 | 19105.85 3 | -> CStore Scan on item | 1921 | 1MB | 43 | 19015.85 Predicate Information (identified by plan id) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ --------------------------- 3 --CStore Scan on item Filter: (price = ANY ('{1988,5547,6631,4931,5752,2119,9647,3724,5146,873}'::integer[])) Pushdown Predicate Filter: (((price >= 873) AND (price <= 9647)) AND ((price = 1988) OR (price = 5547) OR (price = 6631) OR (price = 4931) OR (price = 5752) OR (price = 2119) OR (price = 9647) OR (price = 3724) OR (price = 5146) OR (price = 873))) 可以看到,其生成的Predicate Information 与OR条件同样为“Filter”。表示其未下推到存储层执行过滤。但是在执行层,DWS依旧会为IN运行符生成临时哈希表,将O(N)的算法复杂度优化到O(1)。所以其性能依旧远远好于OR表达式,且随着谓词个数增多,性能优势越明显。 多属性过滤 接下来,我们评估在两个属性列上分布使用IN运算符与OR运算符进行过滤的差异。首先,我们评估当两个属性都是/不是索引列的情况,然后我们评估两个属性中只有一个属性是/不是索引列的情况。 TL;DR: 在多属性场景下,DWS为IN查询与OR查询生成的计划是相同的,故他们的执行性能一致。在此等场景下,使用IN运算符与OR运算符并无差别。 两个索引属性 首先基于两个属性(name、price)创建一个复合索引(idx_item_name_quantity): postgres=# create index idx_item_name_quantity on item (name, quantity); CREATE INDEX 使用复合索引中两个属性(name、price)过滤的查询如下: SELECT * FROM item WHERE (name, quantity) IN (('a', 1), ('b', 2)); SELECT * FROM item WHERE (name='a' AND quantity=1) OR (name='b' AND quantity=2) 执行计划如下: postgres=# explain SELECT * FROM item WHERE (name, quantity) IN (('a', 1), ('b', 2)); QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------- id | operation | E-rows | E-memory | E-width | E-costs ----+------------------------------------------+--------+----------+---------+--------- 1 | -> Row Adapter | 2 | | 43 | 17.24 2 | -> Vector Streaming (type: GATHER) | 2 | | 43 | 17.24 3 | -> CStore Index Heap Scan on item | 2 | 16MB | 43 | 11.24 4 | -> CStore Index Or(5, 6) | 2 | 1MB | 0 | 7.22 5 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.61 6 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.61 Predicate Information (identified by plan id) -------------------------------------------------------------------------------------------------------------------------- 3 --CStore Index Heap Scan on item Recheck Cond: ((((name)::text = 'a'::text) AND (quantity = 1)) OR (((name)::text = 'b'::text) AND (quantity = 2))) 5 --CStore Index Ctid Scan Index Cond: (((name)::text = 'a'::text) AND (quantity = 1)) 6 --CStore Index Ctid Scan Index Cond: (((name)::text = 'b'::text) AND (quantity = 2)) OR运算符与IN运算符的执行计划一模一样,可以知道他们的执行性能将一致,这里就进行性能数据比较了。 从上述计划可以看到,DWS优化器先将IN语句转换为OR语句,然后针对语句中的每个谓词条件,执行一次索引扫描获取对应的Ctid,并生成位图,然后进行位图OR运行合并,最后进行原表扫描获取所有的查询列。 两个未索引属性 首先将上述创建的索引删除: postgres=# drop index idx_item_name_quantity; DROP INDEX 基于两个未索引属性的查询如下: SELECT * FROM item WHERE (name, quantity) IN (('a', 1), ('b', 2)); SELECT * FROM item WHERE (name='a' AND quantity=1) OR (name='b' AND quantity=2) IN语句与OR语句的执行计划也是一致的: postgres=# explain SELECT * FROM item WHERE (name, quantity) IN (('a', 1), ('b', 2)); QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------- id | operation | E-rows | E-memory | E-width | E-costs ----+----------------------------------------+--------+----------+---------+---------- 1 | -> Row Adapter | 2 | | 43 | 16564.78 2 | -> Vector Streaming (type: GATHER) | 2 | | 43 | 16564.78 3 | -> CStore Scan on item | 2 | 1MB | 43 | 16558.78 Predicate Information (identified by plan id) --------------------------------------------------------------------------------------------------------------------------------------- 3 --CStore Scan on item Filter: ((((name)::text = 'a'::text) AND (quantity = 1)) OR (((name)::text = 'b'::text) AND (quantity = 2))) Pushdown Predicate Filter: ((((name)::text = 'a'::text) AND (quantity = 1)) OR (((name)::text = 'b'::text) AND (quantity = 2))) postgres=# explain SELECT * FROM item WHERE (name='a' AND quantity=1) OR (name='b' AND quantity=2) QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------- id | operation | E-rows | E-memory | E-width | E-costs ----+----------------------------------------+--------+----------+---------+---------- 1 | -> Row Adapter | 2 | | 43 | 16564.78 2 | -> Vector Streaming (type: GATHER) | 2 | | 43 | 16564.78 3 | -> CStore Scan on item | 2 | 1MB | 43 | 16558.78 Predicate Information (identified by plan id) --------------------------------------------------------------------------------------------------------------------------------------- 3 --CStore Scan on item Filter: ((((name)::text = 'a'::text) AND (quantity = 1)) OR (((name)::text = 'b'::text) AND (quantity = 2))) Pushdown Predicate Filter: ((((name)::text = 'a'::text) AND (quantity = 1)) OR (((name)::text = 'b'::text) AND (quantity = 2))) 根据计划可以看出,在此情况下,DWS并不会针对IN表达式进行临时表哈希优化,也不会下推到存储层进行过滤。 一个属性有索引 + 一个属性无索引 接下来,我们检验一个属性(id)索引,一个属性(price)无索引的过滤情况。 查询语句如下: SELECT * FROM item WHERE (id, price) IN ((1, 1), (2, 2)); SELECT * FROM item WHERE (id=1 AND price=1) OR (id=2 AND price=2) 在此场景下IN语句与OR语句生成的执行计划也是一致的,故其性能基本相同: postgres=# explain SELECT * FROM item WHERE (id, price) IN ((1, 1), (2, 2)); QUERY PLAN ----------------------------------------------------------------------------------------- id | operation | E-rows | E-memory | E-width | E-costs ----+------------------------------------------+--------+----------+---------+--------- 1 | -> Row Adapter | 1 | | 43 | 17.27 2 | -> Vector Streaming (type: GATHER) | 1 | | 43 | 17.27 3 | -> CStore Index Heap Scan on item | 1 | 16MB | 43 | 11.27 4 | -> CStore Index Or(5, 6) | 2 | 1MB | 0 | 7.25 5 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 6 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 Predicate Information (identified by plan id) -------------------------------------------------------------------------- 3 --CStore Index Heap Scan on item Recheck Cond: ((id = 1) OR (id = 2)) Filter: (((id = 1) AND (price = 1)) OR ((id = 2) AND (price = 2))) 5 --CStore Index Ctid Scan Index Cond: (id = 1) 6 --CStore Index Ctid Scan Index Cond: (id = 2) postgres=# explain SELECT * FROM item WHERE (id=1 AND price=1) OR (id=2 AND price=2); QUERY PLAN ----------------------------------------------------------------------------------------- id | operation | E-rows | E-memory | E-width | E-costs ----+------------------------------------------+--------+----------+---------+--------- 1 | -> Row Adapter | 1 | | 43 | 17.27 2 | -> Vector Streaming (type: GATHER) | 1 | | 43 | 17.27 3 | -> CStore Index Heap Scan on item | 1 | 16MB | 43 | 11.27 4 | -> CStore Index Or(5, 6) | 2 | 1MB | 0 | 7.25 5 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 6 | -> CStore Index Ctid Scan | 1 | 1MB | 0 | 3.62 Predicate Information (identified by plan id) -------------------------------------------------------------------------- 3 --CStore Index Heap Scan on item Recheck Cond: ((id = 1) OR (id = 2)) Filter: (((id = 1) AND (price = 1)) OR ((id = 2) AND (price = 2))) 5 --CStore Index Ctid Scan Index Cond: (id = 1) 6 --CStore Index Ctid Scan Index Cond: (id = 2) 从计划可以看出,针对有索引属性( id), DWS会先进行索引扫描过滤,后进行位图合并。在最后扫描原表数据时,再把另外一个属性的过滤条件加上。 总结 根据上述的实验可以发现,在对单个属性进行过滤时,DWS对带有 IN 查询始终表现出对 OR 查询相当或更好的性能。对于具有大量谓词的查询尤其如此。 关于下推到存储层的优化,截止到本文发布时间,只有在IN运算符是除与WHERE语句中才会生效,并且IN查询单一属性的类型有要求,目前支持INT, NUMERIC,DATE,VARCHAR等,对于其他类型则不支持下推。而在执行层使用临时哈希表加速的功能适用于所有类型,并且为了平衡哈希本身带来的消耗与使用哈希获取的性能收益,只有当IN运算符中条件个数较多时才生效,如大于10个。 当根据多个属性进行过滤时,IN 和 OR 查询具有相同的性能,DWS优化器为两种查询生成的计划是一致的。 因此,我们建议您尽量使用 IN 子句,以最大化的提升查询的性能。 点击关注,第一时间了解华为云新鲜技术~ 询问AI

优秀的个人博客,低调大师

提高API采用率的关键:快速创建有效的API监控任务

为什么需要API监控? 在当今数字化时代,企业应用程序及网站越来越依赖于外部 API 和第三方应用程序提供商。例如一家电商公司,他们的网站可能同时会接入多个外部API,包括支付、物流、广告等服务。如果在用户购买商品时,恰巧出现了支付API故障,就会导致用户无法完成付款动作,从而影响公司的整体营收。API的可靠性直接关系到公司的业务运转。当应用程序中的API出现问题时,会影响到整个网站或应用程序的性能,甚至会导致网站或应用程序直接崩溃。因此,API监控变得至关重要。 监控宝API监控 监控宝提供的API监控能够利用全球近百个监测点,实时监控API的运行状况,包括可用性、正确性、响应时间等性能数据。通过实时告警和历史统计分析,帮您快速发现并解决问题,节约企业的运维成本,减少业务损失。监控宝的API监控能够: 实时监控get、post、put、delete、head、options六种API请求方式,覆盖绝大部分的接口调用格式。 支持JSON、XML、Text、Response Header、状态码验证及Postman,JMeter脚本导入。 通过断言功能监测正确性,支持监控多步请求,从而实现对整个业务流程的监控。 API监控包括可用性、正确性、响应时间、可用率、故障率、正确率、平均可用率、平均正确率、平均响应时间、错误总时长、错误总次数、故障总时长、故障总次数13个监控指标。判断和计算规则如下: 创建监控任务 配置入口:API监控>任务管理 单击创建项目创建API监控任务,需要配置监控任务的基本信息、事务设置、监控设置和告警设置。 设置基本信息 在创建API监控任务页面设置监控任务的基本信息,包括定义任务名称、选择项目是否加入分类。如下图所示。 任务名称 输入任务名称,以便于查找和区分监控对象。您需要为监控任务设置一个有代表性的名称,例如您需要监控在淘宝中提交订单的业务流程,则可设置监控任务名称为“淘宝-提交订单”。 项目是否加入分类 为方便管理自己创建的监控任务,您可为当前监控任务选择一个项目分类。您还可以单击创建分类,新建一个项目分类作为当前监控任务的分类。 设置初始变量 您可利用变量来存储值,动态地提取HTTP响应数据,并在多个请求之间动态地传递数据和状态。比如,添加请求1时,可通过设置变量$a来动态提取Response Header中的Date值。然后在添加请求2时,使用变量a作为断言的目标值。使用变量时需要提前初始化变量,即为变量赋默认值。 在创建API监控任务的事务设置页面,单击设置初始化变量,添加并管理初始变量,如下图所示。 设置自定义变量 在自定义变量页面区域,单击添加变量添加一个变量,设置变量名称和变量值。自定义变量仅应用于本监控任务。注意:变量名称必须以$符号开头,并且是纯字母组成。除自定义变量外,您可以查看系统变量及自定义系统变量,系统变量可用于所有监控任务的API请求。 设置系统变量 在系统变量页面区域,单击自定义页签,单击添加变量添加系统变量,定义变量名称和变量描述信息。注意:在自定义系统变量时,变量名称必须以$public_开头。在系统变量页面区域,单击公共函数页签,查看可用的系统变量,详细说明见下表。 设置事务 在创建API监控任务的事务设置中添加并管理需要监控的API请求。 您能够直接导入脚本来添加API请求,也可手动添加和设置API请求。添加API请求后,可直接复制已添加的请求来创建新的请求。 通过导入脚本添加API请求 为快速创建多条API请求,单击导入脚本,在打开的对话框中直接输入脚本内容并导入。导入成功后,监控宝根据导入的脚本自动创建对应的API请求。在打开的导入脚本对话框,单击查看实例了解脚本样式,脚本支持Postman和JMeter格式。您可以直接使用Postman中生成的脚本。 手动添加API请求 单击添加请求,打开请求编辑页面,如下图所示。 根据实际需要设置各项内容,详细说明见下表。 复制API请求 为避免重复设置,添加API请求后,您可单击【复制按钮】复制当前API请求作为一条新的API请求,根据需要修改相应内容即可。 移动API请求 当添加多个API请求,如果需要调换请求的先后顺序,鼠标拖动目标请求移动到目标位置。 添加请求间隔 单击添加请求间隔,输入发送API请求的时间间隔,例如设置“10s”,则发送一次API请求后,等待10s发送第二次API请求。 测试API监控请求 添加API请求后,为保证正常监控,需检查是否能请求成功。单击验证测试来测试请求并查看测试结果,如下图所示。 请求成功即可用,所有请求都成功时,监控任务(即整个业务流程)的状态为正常且可用,单击展开>返回结果,查看请求的返回结果。添加断言时才能测试请求的正确性,所有请求都正确时监控任务的正确性为“是”,单击展开>变量与断言,查看断言详情。 设置监控 在创建API监控任务的监控设置中,设置监测点和监控频率,如下图所示。 监测点选择相应的监测点对目标API进行监测。您可以选择多个监测点也可以创建/选择一个监测点分组。所选择的监测点或监测点分组的成员均用来监测目标网API。 选择监测点:根据需求选择多个监测点。 选择监测点分组:选择或创建监测点分组。若分组内监测点成员有所变化,任务创建后仍会同步。 注意:选择监测点分组后,监测点分组中的所有监测点都发生故障时才会向您发送告警消息。 监控频率:监控宝执行监控的时间间隔,例如选择2分钟,则监控宝每隔2分钟就执行一次监控。 设置告警 在创建API监控任务的告警设置中,设置常规告警重试次数,连续连续告警提醒,告警线,企业IM通知及告警方式,如下图所示。 告警设置项说明如下表所示: 小结 在过去的封闭系统中,如果出现故障,只会对该系统内的应用程序产生影响,而对于现在大部分企业来说,一个故障就会影响到整个生态系统。监控宝可以利用全球近百个监测点,实时监控API的运行状况,保障企业运维效率及用户体验。点击此处,马上申请监控宝免费试用名额

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。