Pie*_*ten 18 sql database parsing
我一直对你如何在数据库中抛出一些SQL感兴趣,它几乎立即以有序的方式返回你的结果,而不用把它当作黑盒子之外的任何东西.
真的发生了什么?
我很确定它与值如何在内存中定期布局有关,类似于数组; 但除此之外,我不知道其他什么.
如何以一种方式解析SQL以促进所有这些?
Qua*_*noi 12
引擎构建了一个这样的调用查询计划.
它是一组算法,用于返回您使用SQL查询逻辑描述的集合.
几乎每个引擎都可以让您查看为特定查询构建的查询计划.
在MySQL和中PostgreSQL,您使用单词前置查询EXPLAIN
在SQL Server你运行SET SHOWPLAN_TEXT ON运行查询或只需按之前Ctrl-L在Management Studio中
在Oracle,您先添加查询EXPLAIN PLAN FOR然后发出SELECT * FROM (dbms_xplan.display)
您可以在我的博客中找到有趣的这篇文章:
它解决了同样的问题.
从基本的意义上讲,对于许多RDBMS:
a)语法分析阶段从服务器设置(套接字,无论如何)获取输入,并将此SQL转换为有效的AST或其他中间形式.
b)然后将此信息传递给存储引擎,该引擎将此查询描述转换为索引,表,分区,复制数据和构成存储模式语义的其他元素的一组查找
c)引擎然后返回一组然后以任何形式(XML,CSV,特定于客户端)提供给客户端的数据.
但没有一个真正的答案.您将在索引算法,分发算法,缓存,锁定等方面找到相似之处......但主要的相似之处是SQL语言本身的语言接口.除此之外,它们可以以他们希望的任何方式实现...提供他们的结果满足输入查询的预期语义.
实际上,RDBM包含来自计算机科学的各种结构......并且每个结构都具有高度开发和专门的方法,用于将SQL的隐含语义转换为具体存储.
想想MySQL和Oracle有多么不同......或者PostgreSQL和Microsoft SQL.他们都试图满足某种类似SQL的通用规范......但是如何实现该规范是多种多样的.
引擎包含各种exotica,专业索引,以查找数据物理位置,缓存系统等.
有很多开源数据库,如MySQL,PostgreSQL和搜索系统,如Sphinx,你可以看看它们的实现.开源是为了学习任何东西!尝试并找到一个"导师"来指导您完成源代码.