Dav*_*Liu 2 sql sqlite iphone performance
我不知道我的数据库查询是否干净,高效,等等.充其量,我可以从数据库中获得我需要的东西,但不是很多.
我应该读什么书(或网站)才能继续前进?我想知道的各种条件和关键字可能进入查询(例如性能成本JOIN,IN,WHERE等).
我在iOS设备上使用SQLite.
Eri*_*ikE 10
有关SQLite和/或iOS的特定帮助,以下是一些似乎有非常好建议的资源.
现在,更一般地说,要真正为任何企业数据库系统进行性能调整,以下是我认为您需要了解的重要领域:
您正在使用的系统的基本逻辑数据存储架构.例如,b-tree,extent,page,这些的大小和配置,一次读取多少数据,一行的最大大小(如果这是DBMS中的问题),用什么做了以外的事情-row data(再次,如果这是您的DBMS中的问题).
表和行数据的索引,约束和基本排序:这些索引的堆,聚簇,非聚簇,唯一和非唯一性,主键,唯一约束,包含列.在所有这些索引中,是否允许空值,只允许一个空值,或者不允许空值.Uniqueifiers.覆盖指数.
SARGability(查找SARG是"搜索ARGument"的缩写).
外键,默认值,级联删除/更新,它们对插入和删除的影响.
NULL是否需要任何存储空间以及是否受列位置的影响.存储每种数据类型所需的字节数.为字符串数据类型存储或不存储尾随空格时.打包与非打包数据类型(例如,浮点数和小数与整数).聚簇索引和非聚簇索引中每页行数(或最小磁盘读取单位)的概念.
填充因子,碎片,统计信息,索引选择性,页面拆分,转发指针.
当"批处理"操作可以提高性能和原因,以及如何最有效地完成它.
内部,左侧,右侧,全部和交叉连接.半连接(EXISTS)和反半连接(NOT EXISTS).任何其他特定于语言的语法,例如mySql中的USING和SQL Server中的CROSS APPLY/OUTER APPLY.将连接条件放在外连接的ON子句中并将其放入WHERE子句中的效果.
独立子查询,相关子查询,派生表,公用表表达式,理解EXISTS和NOT EXISTS通常似乎引入相关子查询,但通常在执行计划中看作连接(半连接或反半连接).
以图形或文本方式查看和理解执行计划.查看整个SQL批处理或单个语句使用的CPU,读取,写入和持续时间的统计信息/配置文件.了解执行计划和配置文件的限制,实际上这意味着您通常必须使用两者来优化.缓存和重用执行计划,缓存中的计划到期.参数嗅探和参数化.与这些相关的动态SQL.
将数据类型转换为其他数据类型或仅使用这些数据类型的相对成本.(例如,一个可靠的经验法则是使用字符串比使用数字更昂贵.)
与基于集合的处理相比,逐行处理的成本通常过高.正确使用游标(很少见,但有时需要).功能如何隐藏执行计划成本.编写函数的诱人陷阱,当问题可以在集合中解决时,每个行都会被调用(虽然这对于学习如何查看来说可能很棘手,特别是因为传统的应用程序编程倾向于培训人们根据这样的函数进行思考) .
寻找,扫描,范围扫描,"跳过"扫描.书签查找也称为索引查找,然后使用索引查找中找到的值将表搜索到同一个表.循环,合并和散列连接.渴望和懒惰的线轴.加入订单.估计行数.实际行数.
当查询太大并且应该使用临时表或其他方法拆分为多个查询时.
多处理器功能以及并行执行的好处和难点.
Tempdb或其他临时文件用法.临时表,表变量的生命周期和范围(如果你的数据库引擎有这样的话).是否为这些收集统计信息(在SQL Server临时表中使用统计信息和表变量不).
锁定,锁定粒度,锁定类型,锁定升级,块,死锁.数据访问模式(例如UPDATE优先,INSERT秒,DELETE最后).意图,共享,独占锁.锁定提示(例如,在SQL Server UPDLOCK,HOLDLOCK,READPAST,TABLOCKX中).
事务和事务隔离.读取已提交,读取未提交,可重复读取,可序列化,快照,其他我现在不记得了.
数据文件,文件组,单独磁盘,事务日志,简单恢复,完全恢复,最旧的打开事务,即最小日志序列号(LSN),文件增长.
序列,数组,列表,标识列,窗口函数,返回的TOP/rownum /限制行数.
物化视图也称为索引视图.计算列.
1比1,1比0或1,1比1,多对多.
UNION,UNION ALL和其他"垂直"连接.SQL Server也有EXCEPT和INTERSECT.
将IN()列表扩展为OR.将IsNull(),Coalesce()或其他空值处理机制扩展到CASE语句.
使用DISTINCT"修复"查询而不是处理底层问题的缺陷.
链接服务器如何不在链接上进行连接,对链接服务器的查询通常逐行进行,可以在链接上提取大量数据以在本地执行连接,即使这是不合理的.
在触发器中执行任何I/O或容易出错的任务的缺陷.触发器的范围(无论是针对每一行触发还是针对每个数据操作触发一次).
使前端,GUI,报告工具或其他客户端执行客户端类型的工作(例如将日期或数字格式化为字符串)而不是数据库引擎.
错误处理.回滚事务以及它如何总是回滚到第一个事务,无论嵌套有多深,但COMMIT只提交一个级别的工作.
其中大部分与绩效有一定关系.有些对性能不太重要,但(在我看来)如果你想成为一名优秀的SQL开发人员是很重要的,因为仅仅拥有快速查询还不够,他们也需要做对,并与其他人一起玩,并处理故障得当.如果你继续专业地编写SQL并希望改进,那么你最终需要了解大部分内容.我将从了解表组织,索引,搜索和扫描以及散列/合并/循环连接开始.我对SQLite知之甚少,但这些东西对于任何DBMS都是全局的.
可以帮助你很多的一件事是认识到查询涉及搜索数据,就像你在大电话簿或后面有各种索引的电话簿系列中查找姓名,地址,电话号码和其他内容一样.也许有一个反向电话号码索引或由名字组织的索引.考虑从这些物理对象获取信息的最少工作/最短时间路径将帮助您了解查询引擎在选择执行计划时的任务.这种理解会帮助你说"等一下,为什么它应该在进行搜索时进行扫描?这个表非常大并且在X上有一个索引!"
示例场景:您通常按姓氏组织电话簿.您的后面还有一个索引,只有名字和姓氏,按名字排序.
任务1:您需要记下每个名字为Torstein的人的所有电话号码.最佳计划:查看名字索引以查找具有该名字的5个人的姓氏,然后在主电话簿中查看这些姓氏.您刚刚使用针对聚簇索引的书签查找执行了非聚簇索引查找.
任务2:你需要记下每个名字以A开头的人的所有电话号码.快速意识到即使转向名字索引也没有意义,你转向主电话簿,只需阅读每一页从第1页开始.您刚刚进行了表扫描.
为这两项任务选择一个好的"执行计划"(这就是我们刚才所做的)本身就是你拥有的一些领域知识:你知道托尔斯坦是一个非常罕见的名字,并且可能有成千上万的人名称以A开头.此域知识等同于统计信息为查询引擎提供的内容.没有统计数据,就可以选择糟糕的执行计划.
虽然这些一般提示可能并非全部适用于iPhone上的SQLite,但在您的脑海中真正掌握这些概念将对您使用SQLite数据库有很大帮助.无论您使用什么系统,都有一些必然是全局的原则(例如,理解索引永远不会浪费精力,因为任何没有索引的系统都可能不值得使用).
我希望这有帮助.随时可以要求澄清任何一点.如果您在查找资源时遇到问题,我会看到我可以指向您的内容.
| 归档时间: |
|
| 查看次数: |
854 次 |
| 最近记录: |