查询求解概述读书笔记

1. 访问路径

是指针对某个表的读取方式,最普通的是heap_scan的方式,即表扫描的方式,如果表上有索引,还可以有索引扫描的方式,具体采用哪种方式进行扫描,依赖于选择条件中的主合取体。

选择条件称为合取范式,每个合区条件是一个合取体。

选择中的每个条件是一个合取体,能够和索引匹配的选择条件称为主合取体。


1.1 选择操作

选择操作是反应sql语句中过滤条件的一种操作,对于聚簇索引,使用索引扫描的方式做选择操作通常会比较好,但如果索引是非聚簇的,则元祖可能散布在不同的页面,效率也可能不高。


经验值是选择超过5%的页面,往往通过直接表扫描的方式效率会更好。


1.2 投影操作

如果不去除重复。

选择部分属性作为输出,如果索引能匹配,也可以通过索引查询。


1.3 连接操作


2. 查询优化概述


2.1. 流水线操作

某个操作结果不经过物化直接通过管道提供给下一个操作应用,即为流水线操作。


2.2 迭代器接口


open -> getNext ->close

屏蔽了不同的扫描操作的细节(如通过表扫描、索引扫描、排序扫描)。


3. 常用的优化方式


3.1 下推选择

连接操作是比较耗时的操作,通过下推选择操作过滤掉关系中的一些元组,使连接的表的数据量减少。


3.2 使用索引



4. 一个典型的优化器要做什么


4.1 考虑不同的查询计划

考虑将选择和叉积合并到连接中

考虑将选择和投影下推到连接前

重新考虑连接顺序


通常连接采用左深树,优势是能够全流水线作业。


4.2 估算计划的代价


常用的IO代价:读输入表、写中间表、结果排序。


5.数据库三大范式


第一范式


无重复的列
数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。如果实体中的某个属性有多个值时,必须拆分为不同的属性
在任何一个关系数据库中,第一范式(1NF)是对关系模式的设计基本要求,一般设计中都必须满足第一范式(1NF)。不过有些关系模型中突破了1NF的限制,这种称为非1NF的关系模型。换句话说,是否必须满足1NF的最低要求,主要依赖于所使用的关系模型。


第二范式


属性完全依赖于主键
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
当存在多个主键的时候,才会发生不符合第二范式的情况。比如有两个主键,不能存在这样的属性,它只依赖于其中一个主键,这就是不符合第二范式。
如果存在不符合第二范式的情况,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。


第三范式


属性不能传递依赖于主属性(属性不依赖于其它非主键属性)
第三范式(3NF)是在第二范式(2NF)的基础上建立起来的,即满足第三范式(3NF)必须先满足第二范式(2NF)。
如果某一属性依赖于其他非主键属性,而其他非主键属性又依赖于主键,那么这个属性就是间接依赖于主键,这被称作传递依赖于主属性。





### 算法学习笔记与资料总结 #### 基础数据结构与算法概述 常见的基础数据结构包括数组、链表、栈、队列、散列表、二叉树、堆、跳表、图以及 Tire 树等[^1]。这些数据结构构成了许多高级算法的基础。 对于初学者来说,理解并掌握基本的算法概念至关重要。例如递归、排序(快速排序、归并排序)、二分查找、搜索技术(广度优先搜索 BFS 和深度优先搜索 DFS),还有哈希算法、贪心策略、分治方法、回溯技巧以及动态规划等。每种算法都有其特定的应用场景和时间复杂度分析,在实际开发过程中需灵活运用。 #### 复杂度分析的重要性 了解如何评估算法效率是非常重要的一步——即学会计算时间和空间上的消耗情况。这里引入了“大 O 表示法”,用来衡量随着输入规模 n 的增长趋势下操作次数的增长速率。通过这种方式可以帮助开发者选择最优解方案来处理大规模数据集或者提高程序运行速度。 #### 特定领域内的扩展应用 当涉及到更复杂的计算机科学分支时,则可能需要用到更加专业的技术和理论支持。比如针对推荐系统的构建,存在两种要方式:User-Based CF (基于用户的协同过滤) 和 Item-Based CF(基于物品之间的相似性)[^2]; 对于人工智能中的视觉识别任务而言, 则涵盖了图像描述生成、可视问答系统设计等方面的研究成果[^3]. 另外值得注意的是某些特殊类型的难题被称为 NP 完全问题[NP-complete problems], 这类题目往往难以找到精确解答但在很多情况下允许采用近似求解手段获得满意的结果而不是追求绝对最佳值[^4]. #### 经典问题及其高效解决方案 以 labuladong 笔记为例介绍了几个经典组合型数值运算挑战如 Two Sum , Three Sum等问题的最佳实践做法。其中提到利用排序配合双指针扫描可有效降低时间成本实现线性级别性能表现的同时还能轻松应对重复元素剔除需求等情况下的变版本拓展训练[^5]。 ```python def two_sum(nums, target): nums.sort() left, right = 0, len(nums)-1 while left < right: current_sum = nums[left]+nums[right] if current_sum == target: return [left,right] elif current_sum<target: left +=1 else : right -=1 return [] ``` 上述代码片段展示了如何使用双指针技术解决两数之和的问题,并且可以通过调整逻辑进一步应用于更多类似的多数字求和场合之中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值