sql数据库分析
本篇文章继续围绕SQL的语法重点为大家介绍 连接 和 高级连接 的使用,以及 使用连接的注意事项 。
SQL最强大的功能之一就是能在数据查询的执行中 连接(join)表 。连接是利用SQL的SELECT语句能执行的最重要的操作,很好地理解连接及其语法是学习SQL的极为重要的一点。在能够有效地使用连接前,我们必须了解 关系表 以及 关系数据库 设计的一些基础知识。下面的介绍并不能涵盖这一主题的所有内容,但作为入门已经够了。
连接
理解关系表,最好是来看个例子。
有一个包含产品目录的数据库表,其中每类物品占一行。
对于每一种物品,要存储的信息包括产品描述、价格,以及生产该产品的供应商。
现在有同一供应商生产的多种物品,那么在何处存储供应商名、地址、联系方法等供应商信息呢?将这些数据与产品信息分开存储的理由是:
① 同一供应商生产的每个产品,其供应商信息都是相同的,对每个产品重复此信息既浪费时间又浪费存储空间;
② 如果供应商信息发生变化,例如供应商迁址或电话号码变动,只需修改一次即可;
③ 如果有重复数据(即每种产品都存储供应商信息),则很难保证每次输入该数据的方式都相同。不一致的数据在报表中就很难利用。虚饥
关键是, 相同的数据出现多次不是一件好事 ,这是关系数据库设计的基础。
关系表的设计就是要 把信息分解成多个表 , 一类数据一个表 。各表通过某些共同的值互相关联(所以才叫关系数据库)。在这个例子中可建立两个表:一个存储供应商信息,另一个存储产品信息。Vendors表包含所有供应商信息,每个供应商占一行,具有唯一的标识。此标识称为 主键 (primary key),可以是供应商ID或任何其他唯一值。Procts表只存储产品信息,除了存储供应商ID(Vendors表的主键)外,它不存储其他有关供应商的信息。Vendors表的主键将Vendors表与Procts表关联,利用供应商ID能从Vendors表中找出相应供应商的详细信息。
这样做的 好处 是:
① 供应商信息不重复,不会浪费时间和空间;
② 如果供应商信息变动,可以只更新Vendors表中的单个记录,相关表中的数据不用改动;
③ 由于数据不重复,使得处理数据和生成报表更简单。
总之,关系数据可以有效地存储,方便地处理。因此,关系数据库的可伸缩性远比非关系数据库要好。
为什么使用连接
连明誉拦接将数据分解为多个表实现 更有效 地存储、 更方便 地处理,且 可伸缩性更好 。
可伸缩性:能够适应不断增激胡加的工作量而不失败。
连接作为一种机制,能在一条SELECT语句中用来关联表。使用特定的语法,可连接多个表返回一组输出。
创建连接
分析 :上述SELECT语句中与之前的语句相同,都是指定检索的列, 区别 在于该语句指定的两列(prod_name,prod_price)在一个表中,而第一列(vend_name)在另一个表中。
FROM子句也有所区别。该FROM子句列出了两个表:Vendors,Procts。这两个表由SELECT语句的WHERE子句连接。WHERE子句指示DBMS将Vendors表中的vend_id与Procts表中的vend_id匹配起来。
这里使用了 完全限定列名 将Vendors.vend_id和Procts.vend_id两列匹配。最终输出了两个不同表中的数据。
高级连接部分将介绍 如何使用表别名,另外的一些连接 ,以及 如何对被连接的表使用聚集函数 。
使用表别名
之前的文章已经给大家介绍了如何使用别名引用被检索的表列。
SQL还可以 给表名起别名 ,目的是:
① 缩短SQL语句。
② 允许在一条SELECT语句中多次使用相同的表。
分析 :上述语句中的FROM子句的三个表都有别名。如此 省略了许多字符 。表别名还可以用于SELECT的列表、ORDER BY子句以及其他语句部分。
需要注意的是: 表别名只在查询执行中使用 。与列别名不同,表别名不返回到客户端。
使用不同类型的连接
接下来将给大家介绍四种其他类型的连接: 自连接 、 自然连接 、 内连接 和 外连接 。
①自连接
分析: 这是使用了 子查询 的方案。对内部的SELECT语句做了一个简单的检索,返回Jim Jones工作公司的cust_name。该数据用于外部查询的WHERE子句中,以检索出为该公司工作的所有雇员。
下面看看使用了 连接 的方案。
分析:上述语句需要的两个表实际上是相同的表,所以Customers表在FROM子句中出现了两次。但这对于Customers的引用具有歧义,因为没有指示DBMS引用的是哪个Customers表。
于是需要使用表别名解决该问题。Customers表 第一次出现为别名c1 , 第二次为c2 ,然后再将这些别名用作表名。如SELECT语句使用c1前缀明确给出所需列的全名。如果不这么做,DBMS将返回错误,因为名为cust_id、cust_name、cust_contact的列各有两个。DBMS不知需要哪一列,即使它们都是同一列。
WHERE首先连接两个表,再按第二个表中的cust_contact过滤数据,返回所需的数据。
②自然连接
内连接 返回所有的数据,其中 相同的列可多次出现 。而 自然连接排除多次出现 ,使每一列只返回一次。
一般通过对一个表使用通配符(SELECT *),而对其他的列使用明确的子集来实现自然连接。
分析: 上述语句中,通配符只对第一个表使用,而所有其他列都明确列出来,所以没有出现重复的列被检索出来。
③内连接
目前为止使用的连接称为等值连接,是基于两个表之间的相等测试。该连接也称为内连接。
对该种连接还可以使用不同的语法,明确指定连接的类型。
分析 :该语句中的SELECT与之前的区别在于FROM 子句。此处两个表之间的关系是以 INNER JOIN 指定的部分FROM子句,因此需要使用特定的 ON子句 而不是WHERE子句。但传递给ON的实际条件与WHERE相同。
④外连接
许多连接将一个表中的行与另一个表中的行相关联,但有时候 需要包含没有关联的行 。例如,可能需要使用连接完成以下工作:
对每个顾客下的订单进行计数,包括那些至今尚未下订单的顾客;
列出所有产品以及订购数量,包括没有人订购的产品;
计算平均销售规模,包括那些至今尚未下订单的顾客。
在上述例子中,连接包含了那些在相关表中没有关联行的行。这种连接称为外连接,外连接分为 左外连接 和 右外连接 。
左外连接:取左边的表的全部,而右边的表按照条件显示,不符合条件的显示NULL。
右外连接:取右边的表的全部,而左边的表按照条件显示,不符合条件的显示NULL。
下面先给出一个简单的 内连接 ,再给出 左外连接 ,大家对比着理解。
分析 :两个语句都使用了 JOIN 关键字来指定连接类型,与内连接不同的是,左外连接包括没有关联行的行。因此在使用JOIN语法时,还需使用RIGHT或LEFT关键字来指定包括其所有行的表(RIGHT指出的是OUTER JOIN右边的表,而LEFT指出的是OUTER JOIN左边的表)。
上述左外连接语句使用了LEFT OUTER JOIN 从FROM子句左边的表(Customers)中选择所有行。
若要从右边的表选择所有行,即使用 右外连接 ,则语句如下:
注意 :两种基本的外连接形式,左外连接和右外连接。两者的唯一差别是所关联的表的顺序。
此外,还有一种外连接,即 全外连接 。该连接检索两个表中的所有行并关联可关联的行。与左外连接或右外连接包含一个表的不关联的行不同,全外连接包含两个表的不关联的行。
自连接、自然连接、内连接和外连接的区别
①自连接: 通常用于 两张结构和数据内容完全一样的表 ,在做数据处理时,对它们分别 重命名 来加以区分,然后再进行关联。
②自然连接 :特点是要求两个关系表中进行连接的必须是 相同属性列 (名字相同),无需添加连接条件,且 在结果中消除了重复的属性列 。
③内连接 :与自然连接相似,区别在于内连接 不要求两属性列同名 ,可以用 using或on 来指定某两列字段相同的连接条件。
④外连接 :可以解决自然连接时某些属性不同导致这些元组被舍弃的问题,起到了 保留要舍弃的结果 的作用。
使用带聚集函数的连接
之前给大家介绍过使用 聚集函数 来汇总数据,殊不知这些函数也可以与连接一起使用。
分析: 上述语句使用了 COUNT函数 。该语句使用INNER JOIN将Customers和Orders表相互关联。GROUP BY子句按顾客分组,因此,函数调用COUNT(Orders.order_num)对每个顾客的订单计数,将其作为num_ord返回。
分析: 上述语句使用 左外连接 包含所有顾客,包括了那些没有任何订单的顾客。
WHERE子句的重要性
需记住的是,在一条SELECT语句中连接几个表时,相应的关系是在运行中构造的,因为在数据库表中的定义没有指示DBMS如何对表进行连接的内容。
要连接多个表,需要将它们并列于from之后, 关键 是要设置WHERE子句,确保它们之间的 关联关系 必须给出,否则,查询结果会成为笛卡尔积。
笛卡尔积:由没有连接条件的表关系返回的结果为笛卡儿积。
分析 :上述语句输出的结果便是 笛卡尔积 。返回的数据用每个供应商匹配了每个产品,包括了供应商不正确的产品(即使该供应商没有产品)。
连接及其使用的要点
① 注意所使用的连接类型。一般我们使用内连接,但使用外连接也有效。
② 关于确切的连接语法,应该查看具体的文档,看相应的DBMS支持何种语法(大多数DBMS使用这两课中描述的某种语法)。
③ 保证使用正确的连接条件(不管采用哪种语法),否则会返回不正确的数据。
④ 应该总是提供连接条件,否则会得出笛卡儿积。
⑤ 在一个连接中可以包含多个表,甚至可以对每个连接采用不同的连接类型。虽然这样做是合法的,一般也很有用,但应该在测试它们前分别测试每个连接。这会使故障排除更为简单。
以上就是本次介绍的连接和高级连接啦~
下一期将给大家介绍 组合查询 、 插入数据 及 更新和删除数据。
我们下期见!
2. SQL数据分析面试题
1、现有交易数据表user_goods_table,
老板想知道每个用户购买的外卖品类偏好分布,并找出每个用户购买最多的外卖品类是哪个。
2、现有交易数据表user_sales_table,
老板想知道支付金额在前20%的用户。
3、现有用户登录表user_login_table,
老板想知悔裤物道连续7天都登录平台的重要用户。
4、给定一张用户签到表user_attendence,表中包含三个字段,分别是用户ID:【user_id】碧液,日期:【date】,是否签到:【is_sign_in】,0否1是。
4-1、计算截至当前(假设当前时间为2020-04-27),每个用户已经连续签到的天数:
要求输出用户ID【user_id】和连续签到天数【recent_continuous_days】
4-2、计算有史以来 用户最大连续签到天数 :纯培
要求输出用户ID【user_id】和最大连续签到天数
3. 怎么分析一个sql数据库中的表格
两种方式,一种是直接在sqlserver的列表中找到,另一种用写语句的方式查询猛高。
方法一:
1、纳镇登陆SQL SERVER Manager Studio。
2、在左边的树找到自己要查询的数据库。如图:
3、点击“表”,就能看到这个洞知粗库中的所有表了。
4. SQLServer和Oracle数据库分析(oraclesql性能分析)
分析原则:
1、具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的性能关注点)
2、查找瓶颈时按以下顺序,由易到难。
服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,数据库,web服务器等)-〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。分段排除法很有效。
分析的信息来源:1、根据场景运行过程中的错误提示信息;
2、根据测试结果收集到的监控指标数据。
一、错误提示分析
分析实例:
1、Error:“10.10.10.30:8080〃:[10060]Connection
Error::Server“10.10.10.30〃
分析:
A、应用服务死掉(小用户时:程序上的问题。程序上处理数据库的问题)
B、应用服务没有死(应用服务参数设置问题)
例:在许多客户端连接Weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的AeptBacklog属性值设得过低。如果连接时收到消息,说明应提高该值,每次增加25%
C、数据库的连接(1、在应用服务的性能参数可能太小了;2、数据库启动的最大连接数(跟硬件的内存有关)。)
分析:可能是以下原因造成
A、誉丛应用服务参庆掘樱数设置太大导致服务器的瓶颈;B、页面中图片太多;C、在程序处理表的时候检查字段太大多。
二.监控指标数据分析
1、最大并发用户数:
应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。在方案运行中,如果出现了大于3个用户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么可行。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。
2、业务操作响应时间:
分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用“事务性能摘要”图,可以确定在方案执行期间响应时间过长的事务。细分事务并分析每个页面组件的性能。如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用“网络监视器”图确定导致性能瓶颈的网络问题
3、服务器资源监控指标:内存:
1、UNIX资源监控中指标内存页交换速率(Pagingrate),如散衡果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。
2、Windows资源监控中,如果Process计数器和ProcessWorkingSet计数器的值在长时间内持续升高,同时Memory计数器的值持续降低,则很可能存在内存泄漏。
内存资源成为系统性能的瓶颈的征兆:很高的换页率();进程进入不活动状态;交换区所有磁盘的活动次数可高;可高的全局系统CPU利用率;内存不够出错()。
处理器:
1、UNIX资源监控(Windows操作系统同理)中指标CPU占用率(),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQLServer,可接受的最大上限是80-85%合理使用的范围在60%至70%。
2、Windows资源监控中,如果System大于2,而处理器利用率()一直很低,则存在着处理器阻塞。
CPU资源成为系统性能的瓶颈的征兆:很慢的响应时间();CPU空闲时间为零();过高的用户占用CPU时间();过高的系统占用CPU时间();长时间的有很长的运行进程队列()。
磁盘I/O:
1、UNIX资源监控(Windows操作系统同理)中指标磁盘交换率(Diskrate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。
2、Windows资源监控中,如果DiskTime和Avg.DiskQueueLength的值很高,而PageReads/sec页面读取操作速率很低,则可能存在磁盘瓶径。
I/O资源成为系统性能的瓶颈的征兆:过高的磁盘利用率(highdiskutilization);
太长的磁盘等待队列(largediskqueuelength);
等待磁盘I/O的时间所占的百分率太高(/O);
太高的物理I/O速率:largephysicalI/Orate(notsufficientinitself);
过低的缓存命中率(lowbuffercachehitratio(notsufficientinitself));
太长的运行进程队列,但CPU却空闲(largerunqueuewithidleCPU)。
4、数据库服务器:
SQLServer数据库:
1、SQLServer资源监控中指标缓存点击率(CacheHitRatio),该值越高越好。如果持续低于80%,应考虑增加内存。
2、如果FullScans/sec(全表扫描/秒)计数器显示的值比1或2高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。
3、NumberofDeadlocks/sec(死锁的数量/秒):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0。
4、LockRequests/sec(锁请求/秒),通过优化查询来减少读取次数,可以减少该计数器的值。
Oracle数据库:
1、如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。
快存(共享SQL区)和数据字典快存的命中率:select(sum(pins-reloads))/sum(pins)fromv$librarycache;
select(sum(gets-getmisses))/sum(gets)fromv$rowcache;
自由内存:select*fromv$sgastatwherename=‘freememory’。
2、如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)。
缓冲区高速缓存命中率:selectname,valuefromv$sysstatwherenamein(‘dbblockgets’,‘consistentgets’‘physicalreads’)HitRatio=1-(physicalreads/(dbblockgetsconsistentgets))。
3、如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。
日志缓冲区的申请情况:selectname,valuefromv$sysstatwherename=‘redologspacerequests’。
4、如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序。
内存排序命中率:selectround((100*b.value)/decode((a.valueb.value),0,1,(a.valueb.value)),2)fromv$sysstata,v$sysstatbwherea.name=’sorts(disk)’andb.name=’sorts(memory)’
注:上述SQLServer和Oracle数据库分析,只是一些简单、基本的分析,特别是Oracle数据库的分析和优化,是一门专门的技术,进一步的分析可查相关资料。
5. sql数据分析是啥意思
sql数据分析是结构化查询语言。
结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
结构化查询语言是高级的非过程化编程语言,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式。
所以具有完全不同底层结构的不同数据库系统, 可以使用相同的结构化查询语言作为数据输入与管理的接口。结构化查询语言语句可以嵌套,这使它具有极大的灵活性和强大的功能。
SQL具有数据定义、数据操纵、数据查询和数据控制的功能。
1、SQL数据定义功能:能够定义数据库的三级模式结构,即外模式、全局模式和内模式结构。在SQL中,外模式又叫做视图(View),全局模式简称模式(Schema),内模式由系统根据数据库模式自动实现,一般无需用户过问。
2、SQL数据操纵功能:包括对基本表和视图的数据插入、删除和修改,特别是具有很强的数据查询功能。
3、SQL的数据控制功能:主要是对用户的访问权限加以控制,以保证系统的安全性。
6. 数据分析人必掌握的数据库语言-SQL指南第五期
本篇文章继续围绕SQL的语法重点为大家介绍 子查询 的使用。
使用子查询进行过滤
在SQL中SELECT语句用于查询,之前所使用的所有SELECT语句都是简单查询,即从单个数据库表中检索数据的单条语句。然而SQL还可以创建子查询,即嵌套在其他查询中的查询。
示例:
数据表:本次中清亩使用的数据库表都是 关系表 。订单存储在两个表中,每个订单包含订单编号、客户ID、订单日期,在Orders表中存储为一行。各订单的物品存储在相关的OrderItems表中。Orders表不存储顾客信息,只存储顾客ID。顾客实际信息存储在Customers表中。
若现在需要检索出订购RGAN01的所有顾客,应怎样检索? 步骤如下:
① 检索包含物品RGAN01的所有订单的编号。
② 检索具有前一步骤列出的订单编号的所有顾客的ID。
③ 检索前卖森一步骤返回的所有顾客ID的顾客信息。
上述每个步骤都可 单独作为一个查询 来进行。
可将一条SELECT语句返回的结果用于另一条SELECT语句的WHERE子句,也可使用 子查询 来将3个查询组合成一条语句。
① 第一个语句含义明确,是对prod_id为RGAN01的所有订单物品检索其order_num列。
分析: 通过该语句知道了哪个订单包含要检索的物品。
② 下一步查询与上述语句检索出的订单20007和20008相关的顾客ID。此处可利用IN子句。
下面可结合上述两个查询,将第一个查询变为子查询。
分析:正旅在SELECT语句中, 子查询总是从内向外处理 。在处理上述SELECT语句时,DBMS实际上执行了两个操作。
首先执行了 圆括号()内的查询 ,此查询返回两个订单号: 20007 和 20008 .
接着这两个值以IN操作符要求的逗号分隔的格式传递给外部查询的WHERE子句。 外部查询变为:
该语句检索的结果和前面硬编码WHERE子句返回的结果相同。
③ 由上述语句得出订购物品RGAN01的所有顾客ID: 100004 和 100005 .下一步检索这些顾客ID的顾客信息。
也可将其中的WHERE子句转换为子查询,就不用硬编码这些顾客ID了。
分析: DBMS实际上必须执行三条SELECT语句才能完成上述语句。最里面的子查询返回订单号,此列用于外面的子查询的WHERE子句。外面的子查询返回顾客ID列,此顾客ID列用于最外层查询的WHERE子句。最外层查询返回最终所需的数据。
由此可见,在WHERE子句中使用子查询可编写出功能强大灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际应用中由于 性能的限制 ,不宜嵌套太多子查询。
注意: 作为子查询的SELECT语句只能查询 单个列 ,检索多个列将返回错误。另外使用子查询并不总是执行该类数据检索的最有效方法。
作为计算字段使用子查询
使用子查询的另一方法是创建计算字段。
示例: 需要显示Customers表中每个顾客的订单总数。订单与相应的顾客ID都存储在Orders表中。要执行这个操作,需要以下步骤:
① 从Customers表中检索顾客列表。
② 对于检索出的每个顾客,统计其在Orders表中的订单数目。
这里我们可以应用之前介绍的 SELECT COUNT(*) 对表中的行进行计数,并通过一条WHERE子句来过滤某个特定的顾客ID,仅对该顾客的订单进行计数。
如下对顾客1000001的订单进行计数:
要对每个顾客执行COUNT(*)需要将其作为一个子查询,如下:
分析: 该SELECT语句对Customers表中的每个顾客返回三列:cust_name、cust_state和orders。orders是一个 计算字段 ,它由圆括号中的子查询建立。该子查询对检索出的每个顾客执行一次。此例中, 该子查询执行了5次 ,因为检索出了5个顾客。
子查询中的WHERE子句与之前使用的WHERE子句略有不同,因为它使用了 完全限定列名 ,而不只是列名(cust_id)。它指定表名和列名(Orders.cust_id和Customers.cust_id)。下面的WHERE子句告诉SQL,比较Orders表中的cust_id和当前正从Customers表中检索出的cust_id:
在有可能混淆列名时必须用一个 句点分隔表名和列名 。此例中,有两个cust_id列:一个在Customers中,另一个在Orders中。若不采用完全限定名,DBMS会认为要对Orders表中的cust_id自身进行比较。因为:
上述语句总返回Orders表中订单的总数,而该 结果不是我们想要的 ,如下:
由上可知,在构造语句时,若涉及到多个表,而不对同一列名加以区分则会引起DBMS抛出错误信息。
好的做法是,当在SELECT语句中操作多个表时, 使用完全限定列名来避免歧义 。
最后总结一下子查询的特点:
① 子查询必须括在圆括号中。
② 子查询的SELECT子句中只能有一个列,除非主查询中有多个列,用于与子查询选中的列相比较。
③ 子查询不能使用ORDER BY,不过主查询可以。在子查询中,GROUP BY可以起到同ORDER BY相同的作用。
④ 返回多行数据的子查询只能同多值操作符一起使用,比如IN操作符。
⑤ SELECT 列表中不能包含任何对BLOB、ARRAY、CLOB或者NCLOB类型值的引用。
⑥ 子查询不能直接用在聚合函数中。
⑦ BETWEEN操作符不能同子查询一起使用,但是BETWEEN操作符可以用在子查询中。
以上便是本次介绍的全部内容,下篇文章将为大家讲解 连接 和 高级连接 的使用。
我们下期再见!
7. 分析数据库性能的SQL
用于查看哪些实例的哪些操作使用了大量的临时段SELECT to_number(decode(SID NULL SID)) sid 空返operation_type OPERATION trunc(EXPECTED_SIZE/ ) ESIZE trunc(ACTUAL_MEM_USED/ ) MEM trunc(MAX_MEM_USED/ ) MAX MEM NUMBER_PASSES PASS trunc(TEMPSEG_SIZE/ ) TSIZEFROM V$SQL_WORKAREA_ACTIVEORDER BY ; 查询有热块查询的SQL语句select hash_valuefrom v$sqltext a (select distinct a owner a segment_name a segment_type fromdba_extents a (select dbarfil dbablkfrom (select dbarfil dbablkfrom x$bh order by tch desc) where rownum < ) bwhere a RELATIVE_FNO = b dbarfiland a BLOCK_ID <= b dbablk and a block_id + a blocks > b dbablk) bwhere a sql_text like % ||b segment_name|| % and b segment_type = TABLE order bya hash_value a address a piece; 全表扫描select opname target b num_rows b tablespace_name count(target) from v$session_longops a all_all_tables bwhere a TARGET=b owner|| ||b table_namehaving count(target)> group by opname target b num_rows b tablespace_name 查看磁盘排序和缓基迅存排序次数selectto_char(sn snap_time yyyy mm dd hh ) time_ avg(newmen value oldmen value) sorts_memeory avg(newdsk value olddsk value) disk_sortfromstats$sysstat oldmen stats$sysstat newmen stats$sysstat newdsk stats$sysstat olddsk stats$snapshot snwhere newdsk snap_id=sn snap_idand olddsk snap_id=sn snap_id and newmen snap_id=sn snap_idand newdsk snap_id=sn snap_id and oldmen name= sorts (memory) and newmen name= sorts (memory) and olddsk name= sorts (disk) and newdsk name= sorts (disk) group byto_char(sn snap_time yyyy mm dd hh ) 执行最慢的前 个SQL???select * from (selectto_char(snap_time dd Mon HH :mi:ss ) mydate executions exec loadsloads parse_callsparse 搏亏此disk_reads reads buffer_getsgets rows_processed rows_proc sortssorts sql_text hash_valuefromperfstat stats$sql_summary sql perfstat stats$snapshot snwheresql snap_id >(select min(snap_id) min_snapfrom stats$snapshot where snap_time > sysdate $days_back)andsql snap_id = sn snap_idorder by $sortskey desc)tt where rownum< ; SQL缓存池的命中率查询(pinhitratio gethitratio应该大于 %以上)select namespace gethitratio pinhitratio reloads invalidationsfrom v$librarycachewhere namespace in ( SQL AREA TABLE/PROCEDURE BODY TRIGGER ) 数据库的常规参数我就不说了 除了V$parameter中的常规参数外 ORACLE还有大量的隐含参数 下面的语句就可以查询到数据库的所有隐含参数以及其值与参数的描述 SELECT NAME VALUE decode(isdefault TRUE Y N ) as Default decode(ISEM TRUE Y N ) as SesMod decode(ISYM IMMEDIATE I DEFERRED D FALSE N ) as SysMod decode(IMOD MODIFIED U SYS_MODIFIED S N ) as Modified decode(IADJ TRUE Y N ) as Adjusted descriptionFROM ( GV$SYSTEM_PARAMETERSELECT x inst_id as instance x indx+ ksppinm as NAME ksppity ksppstvl as VALUE ksppstdf as isdefault decode(bitand(ksppiflg/ ) TRUE FALSE ) as ISEM decode(bitand(ksppiflg/ ) IMMEDIATE DEFERRED FALSE ) as ISYM decode(bitand(ksppstvf ) MODIFIED FALSE ) as IMOD decode(bitand(ksppstvf ) TRUE FALSE ) as IADJ ksppdesc as DESCRIPTIONFROM x$ksppi x x$ksppsv yWHERE x indx = y indxAND substr(ksppinm ) = _ AND x inst_id = USERENV( Instance ))ORDER BY NAME 想知道现在哪个用户正在利用临时段吗?这个语句将告诉你哪个用户正在利用临时段 SELECT b tablespace b segfile# b segblk# b blocks a sid a serial# a username a osuser a status c sql_textFROM v$session a v$sort_usage b v$sql cWHERE a saddr = b session_addrAND a sql_address = c address(+)ORDER BY b tablespace b segfile# b segblk# b blocks; 查看磁盘碎片select tablespace_name sqrt(max(blocks)/sum(blocks))*( /sqrt(sqrt(count(blocks)))) FSFIfrom dba_free_spacegroup by tablespace_name order by 查看表空间的名称及大小select t tablespace_name round(sum(bytes/( * )) ) ts_sizefrom dba_tablespaces t dba_data_files dwhere t tablespace_name = d tablespace_namegroup by t tablespace_name; 查看表空间物理文件的名称及大小select tablespace_name file_id file_name round(bytes/( * ) ) total_spacefrom dba_data_filesorder by tablespace_name; 查看回滚段名称及大小select segment_name tablespace_name r status (initial_extent/ ) InitialExtent (next_extent/ ) NextExtent max_extents v curext CurExtentFrom dba_rollback_segs r v$rollstat vWhere r segment_id = v usn(+)order by segment_name 耗资源的进程(top session)select s schemaname schema_name decode(sign( mand) to_char(mand) Action Code # || to_char(mand) ) action statussession_status s osuser os_user_name s sid p spid s serial# serial_num nvl(s username [Oracle process] ) user_name s terminal terminal s program program st value criteria_valuefrom v$sesstat st v$session s v$process pwhere st sid = s sid and st statistic# = to_number( ) and ( ALL = ALL or s status = ALL ) and p addr = s paddr order by st value desc p spid asc s username asc s osuser asc 查看锁(lock)情况select /*+ RULE */ ls osuser os_user_name ls username user_name decode(ls type RW Row wait enqueue lock TM DML enqueue lock TX Transaction enqueue lock UL User supplied lock ) lock_type o object_name object decode(ls lmode null Row Share Row Exclusive Share Share Row Exclusive Exclusive null)lock_mode o owner ls sid ls serial# serial_num ls id ls id from sys dba_objects o ( select s osuser s username l type l lmode s sid s serial# l id l id from v$session s v$lock l where s sid = l sid ) lswhere o object_id = ls id ando owner<> SYS order by o owner o object_name 查看低效率的SQL语句SELECT EXECUTIONS DISK_READS BUFFER_GETS ROUND((BUFFER_GETS DISK_READS)/BUFFER_GETS ) Hit_radio ROUND(DISK_READS/EXECUTIONS ) Reads_per_run SQL_TEXTFROM V$SQLAREAWHEREEXECUTIONS> AND BUFFER_GETS > AND (BUFFER_GETS DISK_READS)/BUFFER_GETS < ORDER BY DESC lishixin/Article/program/Oracle/201311/17408
8. sql数据分析需要学什么
作为数据分析师,你首先需要从正在核巧查询的数据库中读取数据。我们一般会采用这种方法:
了解SELECT语句的工作方式。这其中包括研究逻辑查询处理的工作方式。逻辑查询处理描述了数据库引擎执行SELECT语句的子句的顺序。了解它会引导你编写更好,更准确的查询。
研究联接的工作方式
内部联接是最有效的。左,右和完全外部联接的效率较低,但有时必须使用它们。内部联接可以导致行被过滤掉,外部联接氏氏蚂不能导致过滤。研究加入,因此你知道何时使用每种类型。只有最简单的数据库查询才不涉及联接。
了解如何使用GROUP BY子句进行聚合
了解窗口函数/有序分析函数。这些是在SQL中进行分析的缩影歼埋。最初很难将你的头缠绕在它们周围,但是这是值得的。一旦了解了它们,便会一直使用它们。
了解数据库规范化。如果你了解规范化,你将了解为什么架构师以这种方式构造数据库的理论。这有助于编写查询并确定要联接的表。
了解实体关系图(ERD)的工作方式。大多数ERD是使用鱼尾纹符号构建的。确保知道基数和可选性约束是如何工作的,这将帮助你解密连接表时要使用的连接类型。
一旦掌握了这些知识,就应该扩展到学习SQL的DML和DDL子类别。DML代表数据操作语言,SELECT语句是该语言的一部分。DDL代表数据定义语言,这是数据库架构师用来创建表的语言。
本文禁止转载或摘编
本文为我原创
大数据
数据分析
数据分析师
1
收藏
分享
推荐文章
35岁转行数据分析师可以吗?
学习 · 56阅读
Excel之PowerQuery 提取单元格指定文字
学习 · 175阅读
[简述]答题验证系统部署说明
学习 · 865阅读
9. 如何用SQLyog来分析MySQL数据库
用SQLyog来分析MySQL数据库 SOLyog的下载 安装以及使用很简单 我去了相关网站下载 它只有 K字节大小 它把两个文件(一个可执行文件 exe和一个动态链接库文件 dll)安装到C:Program FilesSQLyog路径下 然后运行可执行文件
安装后没有必要再访问春指该网站了 我访问该网站是得到了一个消息 说它的域名没有设置(configured) 登记 或正在建设中 我不清楚这个问题是暂时的还是一直是这样 该软件是免费的 并且没有标志广告(banner ads) 所以它可能是一个特定的尚未最终定型的商业模型 最终可能还是要知森改负费的
数据库 表格(table)和列树(column tree)
该程序一启动就开始询问我搭判的登录到MySOL服务器的口令 我只需要输入我的服务器名字 用户id和登录密码 所有其它的设置都是正确的默认值 然后(当我开始其它事务 重启几次 睡了一会之后) 我重新运行该程序 这时只需要再次输入我的登录密码 该程序没有保存密码的选项 你可以认为这是该程序的一个bug 也可以说是程序的保密特性
一旦你登录之后 界面就是很值得注意 MySOL服务器上所有的数据库都显示在一个树型控件上 你只能访问你在登录时授权的那个数据库 如果你点开代表授权给你的那个数据库的树型结构 你就可以看到一系列代表表格的节点 点开表格节点后 你就可以看到一系列显示字段名的节点和另一个代表索引的节点集合
索引界面绝对是个好东东 这样你就可以CRUD查询索引和关键字了 这相对前端数据库如Microsoft Access来说是个提高 如果考虑到MySOL刚刚开始提供对主(primary)和非相关(foreign)关键字关系的支持 本程序这部分的设计是很成熟的 在右下方的面板上 有四个标签页 即 结果(Result) 消息(Message) 对象(Object)和历史(History)
有什么缺点?
我试图发现该程序的缺点 不过只发现了一个 如果你在Win Dependency Walker下运行程序的 exe文件 你会发现它引用了DLG dll文件 而DLG dll又轮流引用AppHelp 实事上 CommDlg调用AppHelp 而当AppHelp没有请求函数时 CommDlg这么做根本就是浪费资源
过于简单?
在SQLyog FAQ上 有一种观点认为该软件没有正式归档的必要 当然 FAQ(常见问题解答)本身就是一种归档 SQLyog的界面非常直观 我建议你打印一份MySOL文档(包括SQL特殊语法扩展) 我就是这么做的 它只用了一个半英寸的活页封面
最后一步?
FAQ还让人想到一个让人耳朵起了老茧却又是正确的Occam s Razor准则——一切超出必要的复杂性都是没有必要的 我之所以到处 推销 这个工具 就是因为它可以为我们提供一个可以管理MySOL服务器上许多数据库的 简单的 图形化的界面 它的速度极快 并且它的拷贝很小(可以放在一张软盘上)
lishixin/Article/program/SQL/201404/30537
10. 如何用SQLyog来分析MySQL数据库
用SQLyog来分析MySQL数据库:
SOLyog的下载、安装以及使用很简单。我去了相关网站下载,它只有384K字节大小。它把两个文件(一个可执行文件.exe和一个动态链接库文件.dll)安装到C:Program FilesSQLyog路径下。然后运行可执行如悄文件。
安装后没有必要再访问该网站了,我访问该网站是得到了一个消息,说它的域名没有设置(configured)、登记、或正老闷在建设中。我不清楚这个问题是暂时的还是一直是这样。该软件是免费的,并且没有标志广告(banner ads),所以它可能是一个特定的尚未最终定型的商业模型。最终可能还是要负费的。
数据库、表格(table)和列树(column tree)
该程序一启动就开始询问我的登录到MySOL服务器的口令。我只需要输入我的服务器名字、用户id和登录密码。所有其它的设置都是正确的默认值。然后(当我开始其它事务、重启几次、睡了一会之后),我重新运行该程序,这时只需要再次输入我的登录密码。该程序没有保存密码的选项,你可以认为这是该程序的一个bug,也可以说是程序的保密特性。
一旦你登录之后,界面就是很值得注意。MySOL服务器上所有的数据库都显示在一个树型控件上。你只能访问你在登录时授权的那个数据库。如果你点开代表授权给你的那个数据库的树型结构,你就可以看到一系列代表表格的节点。点开表格节点后,你就可以看到一系列显示字段名的节点和另一个代表索引的节点集合。
索引界面绝对是个好东东,这样你就可以CRUD查询索引和关键字了。这相对前端数据库如Microsoft Access来说是个提高。如果考虑到MySOL刚刚开始提供对主(primary)和非相关(foreign)关键字关系的支持,本程序这部分的设计是很成熟的。在右下方的面板上,有四个标签页,即:结果(Result)、消息(Message)、对象(Object)和历史(History)。
有什么缺点?
我试图发现该程序的缺点,不过只发现了一个。如果你在Win32 Dependency Walker下运行程序的.exe文件,你会发现它引用了COMDLG32.dll文件,而COMDLG32.dll又轮流引用AppHelp。实事上,CommDlg调用AppHelp,而当AppHelp没有请求函数时,CommDlg这么做根本就是浪费资源。
过于简单?
在SQLyog FAQ上,有一种观点认为该软件没有正式归档的必要。当然,FAQ(常见问题解答)本身就是一种归档。SQLyog的界面非常直观。我建议你打印一份MySOL文档(包括SQL特殊语法扩展)。我就是这么做的,它只用了一个半英寸的活页封面。
最后一步?
FAQ还让人想到一个让人耳朵起了老茧却又是正确的Occam's Razor准则——一切超出必要的复杂性都是没有必要的。我之所以到处“推销”这个工具,就是因为它可以为我们提供一个可以管理MySOL服务渣含渣器上许多数据库的、简单的、图形化的界面。它的速度极快,并且它的拷贝很小(可以放在一张软盘上)。
SQLyog宣称自己是一个查询分析器,实际上它的功能远远不止这些。假如你正在使用MySOL,你可以在它的网站下载SQLyog(需要登记你的名字和电子邮件地址),然后切身感受一下它的其他功能。