oracle表连接深入浅出

2023-11-13

author:skate

time:2010-08-20


 

表的连接

 

表的连接是指在一个SQL语句中通过表与表之间的关联,从一个或多个表检索出相关的数据。如果一个SQL语句的关联表超过两个,
那么连接的顺序如何呢?ORACLE首先连接其中的两个表,产生一个结果集;然后将产生的结果集与下一个表再进行关联;继续这
个过程,直到所有的表都连接完成;最后产生所需的数据。

 

ORACLE 从6的版本开始,优化器使用4种不同的表的连接方式:

 

1 嵌套循环连接(NESTED LOOP JOIN)
2 群集连接 (CLUSTER JOIN)
3 排序合并连接(SORT MERGE JOIN)
4 笛卡尔连接 (CARTESIAN JOIN)

 

ORACLE 7.3中,新增加了

 

5 哈希连接(HASH JOIN)。

 

在ORACLE 8中,新增加了

 

6 索引连接(INDEX JOIN)。

 

这六种连接方式都有其各自技术特点,在一定的条件下,可以充分发挥高效的性能。但是也都有其局限性,如果使用不当,不仅不
能提高效率,反而会严重影响系统的性能。因此,深入地探讨连接方式的内部 运行机制对于性能优化是必要的。


1 嵌套循环连接

 

嵌套循环连接的内部处理的流程:

 

1) Oracle 优化器根据基于规则RBO或基于成本CBO的原则,选择两个表中的一个作为驱动表,并指定其为外部表。
2) Oracle 优化器再将另外一个表指定为内部表。
3) Oracle从外部表中读取第一行,然后和内部表中的数据逐一进行对比,所有匹配的记录放在结果集中。
4) Oracle读取外部表中的第二行,再和内部表中的数据逐一进行对比,所有匹配的记录添加到结果集中。
5) 重复上述步骤,直到外部表中的所有纪录全部处理完。
6) 最后产生满足要求的结果集。


使用嵌套循环连接是一种从结果集中提取第一批记录最快速的方法。在驱动行源表(就是正在查找的记录,外部表)较小、或者内部行
源表已连接的列有惟一的索引或高度可选的非惟一索引时, 嵌套循环连接效果是比较理想的。嵌套循环连接比其他连接方法有优势,它
可以快速地从结果集中提取第一批记录,而不用等待整个结果集完全确定下来。这样,在理想情况下,终端用户就可以通过查询屏幕查看
第一批记录,而在同时读取其他记录。不管如何定义连接的条件或者模式,任何两个行记录源都可以使用嵌套循环连接,所以嵌套循环连
接是非常灵活的。

 

然而,

如果内部行源表(读取的第二张表)已连接的列上不包含索引,或者索引不是高度可选时,嵌套循环连接效率是很低的。
如果驱动表的记录非常庞大时,其他的连接方法可能更加有效。

 

可以通过在SQL语句中添加HINTS(use_nl),强制ORACLE优化器产生嵌套循环连接的执行计划。


2 群集连接(CLUSTER JOIN)

 

群集连接实际上是嵌套循环连接的一种特例。如果所连接的两张源表是群集中的表,即两张表属于同一个段(SEGMENT),
那么ORACLE能够使用群集连接。处理的过程是:ORACLE从第一张行源表中读取第一行,然后在第二张行源表中使用CLUSTER索
引查找能够匹配到的纪录;继续上面的步骤处理行源表中的第二行,直到所有的记录全部处理完。

群集连接的效率极高,因为两个参加连接的行源表实际上处于同一个物理块上。但是,群集连接也有其限制,没有群集的两
个表不可能用群集连接。所以,群集连接实际上很少使用。


 

3 排序合并连接(SORT MERGE JOIN)

 

排序合并连接内部处理的流程:
1) 优化器判断第一个行源表是否已经排序,如果已经排序,则到第3步,否则到第2步。
2) 第一个源表排序
3) 优化器判断第二个行源表是否已经排序,如果已经排序,则到第5步,否则到第4步。
4) 第二个源表排序
5) 已经排过序的两个源表进行合并操作,并生成最终的结果集。

 

在缺乏数据的选择性或者可用的索引时,或者两个行源表都过于庞大(所选的数据超过表记录数的5%)时,排序合并连接将比嵌套
循环连更加高效。排列合并连接需要比较大的临时内存块,以用于排序,这将导致在临时表空间占用更多的内存和磁盘I/O。

可以通过在SQL语句中添加HINTS(use_merge),强制ORACLE优化器产生排序合并连接的执行计划。


4 笛卡尔连接 (CARTESIAN JOIN)

 

笛卡尔连接是指在sql语句中没有写出表连接的条件,优化器把第一个表的每一条记录和第二个表的所有纪录相连接。如果第
一个表的纪录数为m, 第二个表的纪录数为m,则会产生m*n条纪录数。

由于笛卡尔连接会导致性能很差的SQL,因此一般也很少用到。


5 哈希连接(Hash Join)

 

Hash Join 概述
Hash join 算法的一个基本思想就是根据小的row sources(称作build input我们记较小的表为S ,较大的表为B)建立一个可以
存在于 hash area内存中的hash table ,然后用大的 row sources(称作probe input) 来探测前面所建的hash table。如果
hash area 内存不够大, hash table就无法完全存放在hash area内存中。针对这种情况,Oracle在连接键利用一个hash函数将
build input 和 probe input 分割成多个不相连的分区(分别记作 Si 和 Bi ),这个阶段叫做分区阶段;然后各自相应的分区,
即 Si 和 Bi 再做 Hash join ,这个阶段叫做 join 阶段。

 

如果在分区后,针对某个分区所建的hash table还是太大的话,oracle就采用nested-loops hash join. 所谓的nested-loops hash join就是对部分 Si 建立 hash table ,然后读取所有的 Bi 与所建的 hash table 做连接,然后再对剩余的 Si 建立 hash table ,再
将所有的 Bi 与所建的 hash table 做连接,直至所有的 Si 都连接完了。

 

Hash Join 算法有一个限制,就是它是在假设两张表在连接键上是均匀的,也就是说每个分区拥有差不多的数据。但是实际当中数据都是不
均匀的,为了很好地解决这个问题, oracle 引进了几种技术,位图向量过滤、角色互换、柱状图,这些术语的具体意义会在后面详细介绍。

 
Hash Join 原理
我们用一个例子来解释 Hash Join 算法的原理,以及上述所提到的术语。

考虑以下两个数据集。


S={1,1,1,3,3,4,4,4,4,5,8,8,8,8,10}
B={0,0,1,1,1,1,2,2,2,2,2,2,3,8,9,9,9,10,10,11}


oracle优化器根据统计信息,Hash Join 的第一步就是判定小表(即 build input )是否能完全存放在 hash area 内存中。如果能完全存放在内存中,则在内存中建立 hash table ,这是最简单的 hash join 。


如果不能全部存放在内存中,则 build input 必须分区。分区的个数叫做 fan-out 。 Fan-out 是由 hash_area_size 和 cluster size 来决定的。其中 cluster size 等于 db_block_size * hash_multiblock_io_count , hash_multiblock_io_count 在 oracle9i 中是隐含参数。这里需要注意的是 fan-out 并不是 build input 的大小 /hash_ara_size ,也就是说 oracle 决定的分区大小有可能还是不能完全存放在 hash area 内存中。大的 fan-out 导致许多小的分区,影响性能,而小的 fan-out 导致少数的大的分区,以至于每个分区不能全部存放在内存中,这也影响 hash join 的性能。

 

Oracle 采用内部一个 hash 函数作用于连接键上,将 S 和 B 分割成多个分区,在这里我们假设这个 hash 函数为求余函数,即 Mod(join_column_value,10) 。这样产生十个分区,如下表。

 

分区

 

B0

B1

B2

B3

B4

B5

B6

B7

B8

B9

0,0,10,10

1,1,1,1,11

2,2,2,2,2,2

3

NULL

NULL

NULL

NULL

8

9,9,9

S0

10

 

 

 

 

 

 

 

 

 

S1

1,1,1

 

 

 

 

 

 

 

 

 

S2

Null

 

 

 

 

 

 

 

 

 

 

S3

3,3

 

 

 

 

 

 

 

 

 

S4

4,4,4,4

 

 

 

 

 

 

 

 

 

 

S5

5

 

 

 

 

 

 

 

 

 

 

S6

NULL

 

 

 

 

 

 

 

 

 

 

S7

NULL

 

 

 

 

 

 

 

 

 

 

S8

8,8,8,8

 

 

 

 

 

 

 

 

 

S9

NULL

 

 

 

 

 

 

 

 

 

 


经过这样的分区之后,只需要相应的分区之间做 join 即可(也就是所谓的 partition pairs ),如果有一个分区为 NULL 的话,则相应的分区 join 即可忽略。

 
在将 S 表读入内存分区时,oracle将记录连接键的唯一值,构建成所谓的位图向量,它需要占 hash area 内存的 5% 左右。在这里即为 {1,3,4,5,8,10} 。


当对 B 表进行分区时,将每一个连接键上的值与位图向量相比较,如果不在其中,则将其记录丢弃。在我们这个例子中, B 表中以下数据将被丢弃 {0,0,2,2,2,2,2,2,9,9,9,9,9} 。这个过程就是位图向量过滤


当 S1,B1 做完连接后,接着对 Si,Bi 进行连接,这里 oracle 将比较两个分区,选取小的那个做 build input ,就是动态角色互换,这个动态角色互换发生在除第一对分区以外的分区上面。

 

Hash Join 算法

第 1 步:判定小表是否能够全部存放在 hash area 内存中,如果可以,则做内存 hash join 。如果不行,转第二步。
第 2 步:决定 fan-out 数。
   (Number of Partitions) * C<= Favm *M
    其中 C 为 Cluster size ,
其值为 DB_BLOCK_SIZE*HASH_MULTIBLOCK_IO_COUNT ; Favm 为 hash area 内存可以使用的百分比,一般为 0.8 左右; M 为 Hash_area_size 的大小。

 

第 3 步:读取部分小表 S ,采用内部 hash 函数 ( 这里称为 hash_fun_1) ,将连接键值映射至某个分区,同时采用 hash_fun_2 函数对连接键值产生另外一个 hash 值,这个 hash 值用于创建 hash table 用,并且与连接键值存放在一起。


第 4 步:对 build input 建立位图向量。
第 5 步:如果内存中没有空间了,则将分区写至磁盘上。
第 6 步:读取小表 S 的剩余部分,重复第三步,直至小表 S 全部读完。
第 7 步:将分区按大小排序,选取几个分区建立 hash table( 这里选取分区的原则是使选取的数据最多 ) 。
第 8 步:根据前面用 hash_fun_2 函数计算好的 hash 值,建立 hash table 。
第 9 步:读取表 B ,采用位图向量进行位图向量过滤。
第 10 步:对通过过滤的数据采用 hash_fun_1 函数将数据映射到相应的分区中去,并计算 hash_fun_2 的 hash 值。
第 11 步:如果所落的分区在内存中,则将前面通过 hash_fun_2 函数计算所得的 hash 值与内存中已存在的 hash table 做连接, 将结果写致磁盘上。 如果所落的分区不在内存中,则将相应的值与表 S 相应的分区放在一起。


第 12 步:继续读取表 B ,重复第 9 步,直至表 B 读取完毕。
第 13 步:读取相应的 (Si,Bi) 做 hash 连接。在这里会发生动态角色互换。
第 14 步:如果分区过后,最小的分区也比内存大,则发生 nested- loop hash join 。


Hash Join 的成本

1. In-Memory Hash Join
 
  Cost(HJ)=Read(S)+ build hash table in memory(CPU)+Read(B) + Perform In memory Join(CPU)
   忽略 cpu 的时间,则
  Cost(HJ)=Read(S)+Read(B)

 

2. On-Disk Hash Join
根据上述的步骤描述,我们可以看出

Cost(HJ)=Cost(HJ1)+Cost(HJ2)

 

其中 Cost(HJ1) 的成本就是扫描 S,B 表,并将无法放在内存上的部分写回磁盘,对应前面第 2 步至第 12 步。
Cost(HJ2) 即为做 nested-loop hash join 的成本,对应前面的第 13 步至第 14 步。

 

其中 Cost(HJ1) 近似等于 Read(S)+Read(B)+Write((S-M)+(B-B*M/S)) 。

因为在做 nested-loop hash join 时,对每一 chunk 的 build input ,都需要读取整个 probe input ,因此
Cost(HJ2) 近似等于 Read((S-M)+n*(B-B*M/S))

 

其中 n 是 nested-loop hash join 需要循环的次数。 n=(S/F)/M

 

一般情况下,如果 n 大于 10 的话, hash join 的性能将大大下降。从 n 的计算公式可以看出, n 与 Fan-out 成反比例,
提高 fan-out ,可以降低 n 。当 hash_area_size 是固定时,可以降低 cluster size 来提高 fan-out 。

 

从这里我们可以看出,提高 hash_multiblock_io_count 参数的值并不一定提高 hash join 的性能。


当连接的两个表是用等值连接并且表的数据量比较大时,优化器才可能采用哈希连接。哈希连接是基于CBO的。只有在数据库
初始化参数HASH_JOIN_ENABLED设为True,并且为参数PGA_AGGREGATE_TARGET设置了一个足够大的值的时候,Oracle才会使用哈
希边连接。HASH_AREA_SIZE是向下兼容的参数,但在Oracle9i之前的版本中应当使用HASH_AREA_SIZE。当使用ORDERED提示时,
FROM子句中的第一张表将用于建立哈希表。

 

当缺少有用的索引时,哈希连接比嵌套循环连接更加有效。哈希连接也可能比嵌套循环连接更快,因为处理内存中的哈希表
比检索B_树索引更加迅速。 Hash Join 适合于小表与大表连接、返回大型结果集的连接。

 

深入地理解和掌握oracle的表连接对于优化数据库的性能至关重要。由于优化器选择方式的不同,以及统计信息的缺失或统
计信息的不准确,ORACLE自动选择的表连接方式不一定是最优的。当SQL语句的执行效率很低时,可通过auto trace对执行计
划进行跟踪和分析。当出现多表连接时,需要仔细分析是否有更佳的连接条件。根据系统的特点,必要时可以在SQL中添加
HINTS,从而改变SQL的执行计划,从而达到性能优化的目的。

 

6 索引连接

如果一组已存在的索引包含了查询所需要的所有信息,那么优化器将在索引中有选择地生成一组哈希表。可通过范围或者快
速全局扫描访问到每一个索引,而选择何种扫描方式取决于WHERE子句中的可有条件。在一张表有大量的列,而您只想访问有
限的列时,这种方法非常有效。WHERE子句约束条件越多,执行速度越快。因为优化器在评估执行查询的优化路径时,将把约
束条件作为选项看待。您必须在合适的列(那些满足整个查询的列)上建立索引,这样可以确保优化器将索引连接作为可选
项之一。这个任务通常牵涉到在没有索引,或者以前没有建立联合索引的列上增加索引。相对于快速全局扫描,连接索引的

优势在于:快速全局扫描只有一个单一索引满足整个查询;索引连接可以有多个索引满足整个查询。

 

 

 

 

------end------ 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

oracle表连接深入浅出 的相关文章

  • SQL中如何合并多个表的数据

    我想我的处境很复杂 这是场景 我在 SQL Server 中有 3 个表 注册 学生 课程 仅供参考 没有外键 表的列是 Student 学生号 学生名 Course 课程 ID 课程名称 注册 注册 ID 学生 ID 课程 ID 课程结果
  • 如何在 Oracle 上生成版本 4(随机)UUID?

    该博客解释说 输出sys guid 对于每个系统来说不是随机的 http feuerthoughts blogspot de 2006 02 watch out for sequential oracle guids html http f
  • Oracle - 获取星期几

    今天是星期二 为什么当我运行这个 SQL 语句时 它说今天不是星期二 SELECT CASE WHEN TO CHAR sysdate Day Tuesday THEN Its Tuesday ELSE Its Not Tuesday EN
  • PLS-00103:遇到符号“;”当预期出现以下情况之一时:

    我正在尝试插入用户安全问题的答案 以用于密码重置功能 Ellucian 横幅 v8 提供了一个用于运行此 API 的 API 我对他们的 API 非常陌生 从下面的错误消息来看 我还远远没有正确运行它 任何帮助表示赞赏 我尝试在 Oracl
  • R data.table 多个条件连接

    我设计了一种解决方案 用于从两个单独数据表的多个列中查找值 并添加基于新列的值计算 多个条件比较 代码如下 它涉及在计算两个表中的值时使用 data table 和联接 但是 这些表没有联接在我正在比较的列上 因此我怀疑我可能无法获得 da
  • sql join 告诉我 ID 是否存在于其他表中

    我有 2 张桌子 A B ID FKID 1 3 2 3 3 4 4 4 我需要一个 select 语句 它显示 A 的所有内容 其中一个字段告诉我表 B 是否有任何与该 ID 匹配的 id Desired Result ID hasB 1
  • Fluent NHibernate - 将属性映射到连接表上的列

    我有几张桌子 例如 产品 Id 名称 制造商 ID 制造商 ID 名称 我希望能够在我的产品对象上包含ManufacturerName 而不是当我只需要名称时必须加载整个制造商行 我的产品地图看起来像 Table Product Id x
  • 具有连字符的 Oracle 正则表达式在 Windows 上给出的结果与在 Unix 上不同

    我有以下带有正则表达式的查询 select REGEXP REPLACE TEST 3304 V2 lt gt as REG from dual 当通过 SQL Plus 在Windows机器返回以下内容 SQL gt select REG
  • Google Play Beta:“应用程序不适用于此帐户”消息

    有没有人遇到过所有成员都遇到的问题谷歌测试组能够获得测试版 除了一个问题之外没有任何问题 这位拥有有效 Gmail 地址的用户已加入用于 Beta 测试的 Google Grouped 作为管理员 我可以看到他们的状态是member 当他们
  • 自动提取数据 - Oracle SQL Developer

    我通过 SQL Developer 连接到 Oracle 数据库 我想编写一个返回每月数据集的查询 然后将该数据提取到分隔文本文件中 我知道如何做到这一点就好了 我想知道是否有一种方法可以编写一个脚本来运行查询并在一年内逐月提取数据 这样我
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • Java、Oracle 中索引处缺少 IN 或 OUT 参数:: 1 错误

    您好 我使用 Netbeans 8 0 2 和 Oracle 11g Express Edition 在 JSF 2 2 中编写了一个图书馆管理系统 我有几个名为 书籍 借阅者 等的页面 以及数据库中一些名为相同名称的表 我的问题是这样的
  • Oracle SQL 函数中可以有 commit 语句吗

    在 SQL 函数中使用 COMMIT 语句是否可能 有意义 从技术上来说 答案是肯定的 你can请执行下列操作 create or replace function committest return number as begin upd
  • Oracle Text:如何清理用户输入

    如果有人有使用 Oracle 文本的经验 CTXSYS CONTEXT 我想知道当用户想要搜索可能包含撇号的名称时如何处理用户输入 在某些情况下 转义 似乎有效 但对于单词末尾的 s 则不起作用 s 在停用词列表中 因此似乎已被删除 目前
  • ORA-12728: 正则表达式中的范围无效

    我想检查表中是否插入了有效的电话号码 所以我的触发代码在这里 select start index into mob index from gmarg mobile operators where START INDEX substr ne
  • SQL查询json字典数据

    我的表中的 CLOB 字段包含 JSON 如下所示 a value1 b value2 c value3 我正在尝试编写一个 SQL 查询来返回一个包含键和值字段的表 如下所示 key value a value1 b value2 c v
  • 我在 MacBook M1 max 中的 nodejs 连接到数据库 oracle 时遇到问题帮助我

    Node js 中的错误消息 nodemon 启动node server js错误 错误 DPI 1047 无法找到 64 位 Oracle 客户端库 dlopen Users pitidev ldb Downloads instantcl
  • CONTAINS 不适用于 Oracle Text

    我在执行此查询时遇到问题 SELECT FROM gob attachment WHERE CONTAINS gob a document java gt 0 它给了我 ORA 29902 error in executing ODCIIn
  • 我应该使用 JDBC getNString() 而不是 getString() 吗?

    我们正在构建一个由 Oracle 数据库支持的 Java 应用程序 我们使用 JDBC 驱动程序 访问该数据库ojdbc6 jar and orai18n jar 数据库模式主要使用以下方式存储文本列NVARCHAR2数据类型 The JD
  • ORA-04061: 包体“PACKAGE.NAME”的现有状态已失效,但仍然存在

    在我正在处理的一个 Oracle 数据库实例上 我在重新编译包时观察到与正常行为不同的行为 通常 如所讨论的Oracle 中频繁出现错误 ORA 04068 包的现有状态已被丢弃 https stackoverflow com questi

随机推荐

  • java基础-inputStream两次读取的方法

    场景描述 我们需要对同一个InputStream对象使用多次 比如 客户端从服务器获取数据 利用HttpURLConnection的getInputStream 方法获得Stream对象 需要将InputStream流读取获取相关参数 第一
  • windows消息机制

    windows消息机制 文章目录 windows消息机制 1 创建基本的窗口程序 2 消息传递的原理 1 消息类型 2 消息的传递 3 相应的发送消息的函数SendMessage PostMessage 1 创建基本的窗口程序 基本的窗口程
  • idea项目导入eclipse中步骤

    1 打开eclipse 右键import 找到需要导入的项目 2 重新配置tomcat 已经配置好了建议移除后重新添加 window preference 3 项目上右键 debug AS 发现没有 debug on server 这是没有
  • 【微信小程序】云开发环境的搭建

    准备工作 下载并安装微信开发者工具 微信开发者工具版本 Stable 1 05 2201240 一 双击打开 微信开发者工具 后 点击 新建小程序 二 根据自身项目需求创建小程序项目 注意事项 AppID 即微信小程序的 身份证号码 注册后
  • 初级学习02 Hello world

    1 安装jdk https www oracle com java technologies downloads java8 2 配置环境变量 3 安装notepad https qnw shaid top notepad index ht
  • Gitee搭建自己的图床

    CSDN前段时间的下拉广告和红包雨属实恶心人 现在打算逐步分离文章 而为了避免以后发生更换平台而导致不必要的麻烦 还是把图床单独分离出比较好 图床有商业收费的 如七牛 又拍云 阿里oss数据存储这些 会按空间和流量来收费 高稳定性 适合企业
  • Flutter 使用pageview无缝隙自动轮播教程

    导入要使用的轮播图片 List
  • win10安装cuda11.4及cudnn

    查看nvidia驱动版本 在windows终端键入nvidia smi 查看nvidia显卡驱动 显卡驱动的版本决定了CUDA的版本下限 如果出现上述的问题 则终端进入C Program Files NVIDIA Corporation N
  • Java实现简单的台球桌游戏

    Java实现简单台球桌问题 需求 使小球可以在桌面上移动 移动到桌面边缘将被弹回 显示小区的移动 素材 小球照片 桌球照片 程序源代码 package 桌球游戏 import java awt import javax swing publ
  • Qt--事件分发器

    写在前面 在 Qt 中 事件分发器 Event Dispatcher 是一个核心概念 用于处理 GUI 应用程序中的事件 事件分发器负责将事件从一个对象传递到另一个对象 直到事件被处理或被取消 每个继承自QObject或QObject的类都
  • 【开发工具】【sparse】Linux下代码检测工具(sparse)的使用

    获取更多相关的嵌入式开发工具 可收藏系列博文 持续更新中 开发工具 嵌入式常用开发工具汇总帖 Linux内核源码里其实包含了相应的代码检测工具 sparse 位置在 Documentation dev tools sparse rst Do
  • webservice中JAX-WS与CXF,Axis区别

    Web Service是一种能够使应用程序在不同的平台使用不同的编程语言进行通讯的技术规范 而这种技术规范的实现可以用不同的方法 比如使用基于XML形式的协议 SOAP 进行通讯或者是RESTFUL形式的 既然我们知道可以使用上面的两种形式
  • c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

    求出4 4矩阵中最大和最小元素值及其所在行下标和列下标 求出两条主对角线元素之和 include
  • Python之SQLMap:自动SQL注入和渗透测试工具示例详解

    在网络安全领域中 渗透测试是一项重要的任务 其中 SQL注入攻击是最常见的一种攻击方式之一 为了简化渗透测试过程中的繁琐操作 开发者们设计了各种自动化工具 其中 SQLMap是一款使用Python编写的强大工具 用于进行自动化的SQL注入和
  • [Echarts][全网唯一]X轴axisLabel随文字长度自动旋转的实现思路

    最近看了很多BI产品 柱状图的X轴标签文字能够随着系列柱体宽度自动旋转 如果在范围内就横向 不在范围内就自动变成竖向 效果如下 axisLabel空间足够 限制了十个字符 横向显示 标题axisLabel空间不足 限制了十个字符 竖向显示
  • 模仿MybatisPlus实现 lambda query

    刚接触MybatisPlus那会 就觉得它提供的lambda调用方式挺酷的 比如常规写法new QueryWrapper eq name xiaoming 改成用lambda就是 new LambdaQueryWrapper eq User
  • pycharm中配置python解释器【最新版】

    嗨嗨 我是小圆 现在有越来越多的人正在了解python 刚入门的新手 一开始也会很多的问题 今天来给大家分享一下python新手必须学会的技巧 pycharm中配置python解释器 有很多朋友 在安装模块时成功了 但是在pycharm导入
  • JWT——概念、认证流程、结构、使用JWT

    一 什么是JWT JSON Web Token JWT is an open standard RFC 7519 that defines a compact and self contained way for securely tran
  • Kali beef-xss实现Xss详细教程。

    免责声明 本文所介绍的内容仅做学习交流使用 严禁利用文中技术进行非法行为 否则造成一切严重后果自负 1 XSS简介 1 XSS简介 XSS作为OWASP TOP 10之一 XSS中文叫做跨站脚本攻击 Cross site scripting
  • oracle表连接深入浅出

    author skate time 2010 08 20 表的连接 表的连接是指在一个SQL语句中通过表与表之间的关联 从一个或多个表检索出相关的数据 如果一个SQL语句的关联表超过两个 那么连接的顺序如何呢 ORACLE首先连接其中的两个