临时表

MySQL高性能优化规范建议

流过昼夜 提交于 2019-12-03 04:43:04
数据库命令规范 • 所有数据库对象名称必须使用小写字母并用下划线分割 • 所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) • 数据库对象的命名要能做到见名识意,并且最后不要超过 32 个字符 • 临时库表必须以 tmp_为前缀并以日期为后缀,备份表必须以 bak_为前缀并以日期 (时间戳) 为后缀 • 所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低) 数据库基本设计规范 1. 所有表必须使用 Innodb 存储引擎 没有特殊要求(即 Innodb 无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用 Innodb 存储引擎(MySQL5.5 之前默认使用 Myisam,5.6 以后默认的为 Innodb)。 Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能更好。 2. 数据库和表的字符集统一使用 UTF8 兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效,如果数据库中有存储 emoji 表情的需要,字符集需要采用 utf8mb4 字符集。 3. 所有表和字段都需要添加注释 使用 comment 从句添加表和列的备注

sql语句性能优化介绍

强颜欢笑 提交于 2019-12-03 03:36:02
一,SQL语句性能优化 1, 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2,应尽量避免在 where 子句中对字段进行 null 值判断,创建表时NULL是默认值,但大多数时候应该使用NOT NULL,或者使用一个特殊的值,如0,-1作为默 认值。 3,应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。 4,应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以 使用UNION合并查询: select id from t where num=10 union all select id from t where num=20 5,in 和 not in 也要慎用,否则会导致全表扫描,对于连续的数值,能用 between 就不要用 in 了:Select id from t where num between 1 and 3 6,下面的查询也将导致全表扫描:select id from t where name like ‘%abc%’ 或者select id from t where name like ‘%abc’若要提高效率,可以考虑全文检索

ORACLE WITH AS 用法,创建临时表

匿名 (未验证) 提交于 2019-12-03 00:38:01
语法: with tmp as (select * from tb_name) with 例:现在要从1-19中得到11-14。一般的sql如下: ( 使用With as 的SQL为: with TT as( --模拟生一个20行的数据 SELECT LEVEL AS lv FROM DUAL CONNECT BY LEVEL < 20 ) select lv from TT WHERE lv > 10 AND lv < 15 With查询语句不是以select开始的,而是以“WITH”关键字开头 WITH Clause方法的优点 、、、、、、、、、、、、、、 with as 语法 with tmp as (select * from tb_name) with 1 2 3 4 5 6 7 8 9 --相当于建了个e临时表 with e as ( select * from scott.emp e where e.empno=7499) select * from e; --相当于建了e、d临时表 with e as ( select * from scott.emp), d as ( select * from scott.dept) select * from e, d where e.deptno = d.deptno; 其实就是把一大堆重复用到的sql语句放在with

数据库优化案例――――――某知名零售企业ERP系统

匿名 (未验证) 提交于 2019-12-03 00:32:02
本文转载自博客园: HTTPS ://www.cnblogs.com/double-K/p/9210982.html 写在前面    SQL SERVER全面优化------- SQL Server诊断系列专家 --------------博客地址---------------------------------- -------------------------------------------------- --- http://www.cnblogs.com/double-K/ 废话不多说,直接开整------------------------------------------ ----------------------------------------------- 用户现象   系统慢!保存个单据要好几分钟,很多操作都超时,尤其到下午4点左右各种超时,收款什么的都收不了,   查个报表一个小时,下班了还没查完,经常因为系统慢而加班,   业务部门已经怨声载道,这个事情已经上报公司高层IT部分压力非常大! 系统环境   首先我们来看一下这个系统配置及现状,为什么说这个客户经典?往下看就知道了...      先来看看系统配置:          服务器的配置是:8路24核心做了超线程384个逻辑CPU,内存1T,磁盘全闪         没错,相当牛逼得配置!

高手详解SQL性能优化十条经验

匿名 (未验证) 提交于 2019-12-03 00:27:02
1.查询的模糊匹配 尽量避免在一个复杂查询里面使用 LIKE '%parm1%'―― 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 解决办法: 其实只需要对该脚本略做改进,查询速度便会提高近百倍。改进方法如下: a、修改前台程序――把查询条件的供应商名称一栏由原来的文本输入改为下拉列表,用户模糊输入供应商名称时,直接在前台就帮忙定位到具体的供应商,这样在调用后台程序时,这列就可以直接用等于来关联了。 b、直接修改后台――根据输入条件,先查出符合条件的供应商,并把相关记录保存在一个临时表里头,然后再用临时表去做复杂关联 2.索引问题 在做性能跟踪分析过程中,经常发现有不少后台程序的性能问题是因为缺少合适索引造成的,有些表甚至一个索引都没有。这种情况往往都是因为在设计表时,没去定义索引,而开发初期,由于表记录很少,索引创建与否,可能对性能没啥影响,开发人员因此也未多加重视。然一旦程序发布到生产环境,随着时间的推移,表记录越来越多 这时缺少索引,对性能的影响便会越来越大了。 这个问题需要数据库设计人员和开发人员共同关注 法则:不要在建立的索引的数据列上进行下列操作: ◆避免对索引字段进行计算操作 ◆避免在索引字段上使用not,<>,!= ◆避免在索引列上使用IS NULL和IS NOT NULL ◆避免在索引列上出现数据类型转换 ◆避免在索引字段上使用函数

sql使用临时表循环

匿名 (未验证) 提交于 2019-12-03 00:09:02
code CREATE PROCEDURE sp_Update_Blogger_Blog_ArticleCount AS BEGIN declare @account varchar ( 50 ); --博主账号 declare @count int ; --博主数量 declare @i int ; --循环标识 declare @articleCount int ; --文章数量 --把所有博主信息存到临时表 select * into #temp from(select Account,Ranking,ROW_NUMBER() over(order by Ranking) as row from Blogger ) b select @count = COUNT ( 1 ) from #temp; set @i = 1 ; --循环临时表 while ( @count >= @i ) begin select @account = Account from #temp where row = @i; --获取当前行的博主账号 select @articleCount = count ( 1 ) from BlogForBlogger where Account = @account ; --获取博主的文章数量 update Blogger set ArticleCount =

SQL.@,@@、#,##

匿名 (未验证) 提交于 2019-12-02 23:49:02
1、SQL server 中的@,@@、#,##分别代表什么?_百度知道.html( https://zhidao.baidu.com/question/238197938.html ) @ 表示局部变量 @@ 表示全局变量 # 表示本地临时表的名称,以单个数字符号打头;它们仅对当前的用户连接是可见的 ## 表示全局临时表 使用事例如下图所示:    扩展资料: 本地临时表 以一个井号 (#) 开头的表名。只有在创建本地临时表连接是才能看得到,连接断开时临时表立马被删除,也就是到货本地临时表为创建它的该链接的会话所独有,或者说局部临时表是有当前用户创建的,并且只有当前用户的会话才可以访问。 全局临时表 以两个井号 (##) 开头的表名。在所有连接上都能看到全局临时表,也就是说只要全局临时表存在,那么对所有创建用户的会话后都是可见的。如果在创建全局临时表的连接断开前没有显式地除去全局临时表,那么只能等到其它所有任务都停止引用,这些表才会被删除。 当创建全局临时表的连接断开后,新的任务不能再引用它们,也就是说旧的任务才可以引用。当前的语句一执行完,任务与表之间的关联即被除去;因此通常情况下,只要创建全局临时表的连接断开,全局临时表也会同时被删除。 2、SQL中的全局变量和局部变量(@@_@) - 书写者 - 博客园.html( https://www.cnblogs.com

shell脚本实现hive增量加载

匿名 (未验证) 提交于 2019-12-02 23:49:02
实现思路: 1、每天凌晨将前一天增量的数据从业务系统导出到文本,并FTP到Hadoop集群某个主节点上   上传路径默认为: /mnt/data/crawler/ 2、主节点上通过shell脚本调用hive命令加载本地增量温江到hive临时表 3、shell脚本中,使用hive sql 实现临时表中的增量数据更新或者新增增量数据到hive 主数据表中 实现步骤: 1.建表语句, 分别创建两张表test_temp, test 表 ? crrawler.test_temp( ) row format delimited fields terminated by ',' stored as textfile ; +++++++++++++++++++++++++++++++++ create table crawler.test( ) partitioned by (dt string) row format delimited fields terminated by '\t' stored as orc ; 2.编写处理加载本地增量数据到hive临时表的shell脚本test_temp.sh ? #! /bin/bash ################################## # 日期参数可选,默认是系统日期-1 # ##########################

为什么会使用内部临时表

匿名 (未验证) 提交于 2019-12-02 23:49:02
create table t1(id int primary key, a int, b int, index(a)); (select 1000 as f) union (select id from t1 order by id desc limit 2); union的语义是取这两个子查询结果的并集,重复的行只保留一行。 第二行的key=Primary表示用到了索引,第三行的EXTRA字段,表示结果集在做union的时候,使用了临时表。 创建一个临时表,临时表只有一个整形字段f,并且f是主键字段。 执行第一个子查询,得到1000这个值,存入临时表。 执行第二个子查询: 拿到第一行id=1000,试图插入临时表,但由于1000这个值已经存在于临时表,违反了唯一性约束,插入失败。 拿到第二行id=999,插入成功。 从临时表中按行取出数据,返回结果,删除临时表,结果中包含两行数据分别1000和999. 可以看到,这里内存临时表起到了暂存数据的作用,而且计算过程还用上了临时表主键id的唯一性约束,实现了union语义。 如果把这个语句中的union改成union all的话,就依次执行子查询,就不需要临时表了。 select id%10 as m, count(*) as c from t1 group by m; 这个语句的逻辑是表t1里的数据,按照id%10进行分组统计

ORACLE EXECUTE IMMEDIATE 小结

匿名 (未验证) 提交于 2019-12-02 23:40:02
EXECUTE IMMEDIATE 代替了以前Oracle8i中DBMS_SQL package包. -- 使用技巧 1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交 如果通过EXECUTE IMMEDIATE处理DML命令, 那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分. 如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据 2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors. 3. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号. 4. 在Oracle手册中,未详细覆盖这些功能。 下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便. 5. 对于Forms开发者,当在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能. EXECUTE IMMEDIATE -- 用法例子 1. 在PL/SQL运行DDL语句 begin end; 2. 给动态语句传值(USING 子句) declare end; 3. 从动态语句检索值(INTO子句) declare begin end; 4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型. declare