临时表

sql之T-SQL

此生再无相见时 提交于 2020-01-16 16:17:38
下面就T-SQL的几个方面来分别讲解一下。 1、变量 要动态的写sql语句,就不能没有变量。 声明变量并赋值: 1 declare @i as int;--定义一个 int 类型的 变量 (as可以省略) 2 print @i;--这注意:没有赋值之前,程序不会报错,而且输出一个 空 3 set @i=3; 4 print @i; 在sql server 2008之后就可以对变量 在声明的同时进行赋值 1 declare @a int=3; 2 print @a; 在变量的使用过程中,一定要注意nvarcahr 和nchar的区别。 1 declare @s nvarchar(20); 2 set @s='Hello'; 3 set @s=@s+' World!'; 4 print @s;--输出的是 Hello World! 5 6 declare @s2 nchar(20); 7 set @s2='Hello'; 8 set @s2=@s2+' World!'; 9 print @s2;--输出的是 Hello。 为什么使用nchar却是输出的 Hello,因为:nchar是固定长度,即使长度没有达到最大,但是其余长度用 空来代替了,所以 相当于是满的,所以在进行字符串的相加 是不会起作用的。 在查询中赋值: 1 declare @now datetime; 2 select

MySQL 5.6 Online DDL

社会主义新天地 提交于 2020-01-16 09:01:28
一 .Fast index Creation MySQL 5.5和更高版本并且MySQL 5.1 innodb plugin支持 Fast index Creation ,对于之前的版本对于索引的添加或删除这类DDL操作,MySQL数据库的操作过程为如下: (1)首先创建新的临时表,表结构通过命令ALTAR TABLE新定义的结构 (2)然后把原表中数据导入到临时表 (3)删除原表 (4)最后把临时表重命名为原来的表名 上述过程我们不难发现,若我们对一张大表进行索引的添加或者删除,需要很长的时间,致命的是若有大量的访问请求,意味着无法提供服务。 innodb存储引擎从1.0.x版本开始支持Fast index Creation(快速索引创建)。简称FIC。对于辅助索引的创建,会对创建索引的表加一个S锁。在创建的过程中,不需要重建表,因此速度有明显提升。对于删除辅助索引innodb存储引擎只需要更新内部视图,并将辅助索引的空间标记为可用,同时删除MySQL 数据库内部视图上对该表的索引定义即可。特别需要注意的时,临时表的创建路径是通过参数tmpdir设置的。必须确保tmpdir有足够的空间,否则将会导致辅助索引创建失败。由于在创建辅助索引时加的是S锁,所以在这过程中只能对该表进行读操作,若有事务需要对该表进行写操作,那么数据库服务同样不可用。 需要注意的是,FIC方式只限定于辅助索引

MySQL online ddl原理

人盡茶涼 提交于 2020-01-16 09:00:44
背景 dba的日常工作肯定有一项是ddl变更,ddl变更会锁表,这个可以说是dba心中永远的痛,特别是执行ddl变更,导致库上大量线程处于“Waiting for meta data lock”状态的时候。因此mysql 5.6的online ddl特性是dba们最期待的新特性,这个特性解决了执行ddl锁表的问题,保证了在进行表变更时,不会堵塞线上业务读写,保障在变更时,库依然能正常对外提供访问。网上关于online ddl的文章很多,但涉及原理的很少,都是介绍语法之类的,本文将详细介绍online ddl的原理,知其然,更要知其所以然。 ddl实现方式 5.6 online ddl推出以前,执行ddl主要有两种方式copy方式和inplace方式,inplace方式又称为(fast index creation)。相对于copy方式,inplace方式不拷贝数据,因此较快。但是这种方式仅支持添加、删除索引两种方式,而且与copy方式一样需要全程锁表,实用性不是很强。下面以加索引为例,简单介绍这两种方式的实现流程。 copy方式 (1).新建带索引的临时表 (2).锁原表,禁止DML,允许查询 (3).将原表数据拷贝到临时表(无排序,一行一行拷贝) (4).进行rename,升级字典锁,禁止读写 (5).完成创建索引操作 inplace方式 (1).新建索引的数据字典 (2).锁表

Hive 根据表中某个字段动态分区 以及临时表创建

与世无争的帅哥 提交于 2020-01-16 05:02:03
使用hive储存数据时,需要对做分区,如果从kafka接收数据,将每天的数据保存一个分区(按天分区),保存分区时需要根据某个字段做动态分区,而不是傻傻的将数据写到某一个临时目录最后倒入到某一个分区,这是静态分区。 Hive动态分区步骤如下: 1、建立某一个源表模拟数据源并插入一些数据 create table t_test_p_source ( id string, name string, birthday string ) row format delimited fields terminated by '\t' stored as textfile; insert into t_test_p_source values ('a1', 'zhangsan', '2018-01-01'); insert into t_test_p_source values ('a2', 'lisi', '2018-01-02'); insert into t_test_p_source values ('a3', 'zhangsan', '2018-01-03'); insert into t_test_p_source values ('a4', 'wangwu', '2018-01-04'); insert into t_test_p_source values ('a5',

sql server之数据库语句优化

孤者浪人 提交于 2020-01-15 06:46:18
一切都是为了性能,一切都是为了业务 一、查询的逻辑执行顺序 (1) FROM left_table (3) join_type JOIN right_table (2) ON join_condition (4) WHERE where_condition (5) GROUP BY group_by_list (6) WITH {cube | rollup} (7) HAVING having_condition (8) SELECT (9) DISTINCT (11) top_specification select_list (9) ORDER BY order_by_list 标准的 SQL 的解析顺序为 : (1) FROM 子句 组装来自不同数据源的数据 (2) WHERE 子句 基于指定的条件对记录进行筛选 (3) GROUP BY 子句 将数据划分为多个分组 (4) 使用聚合函数进行计算 (5) 使用 HAVING 子句筛选分组 (6) 计算所有的表达式 (7) 使用 ORDER BY 对结果集进行排序 二、执行顺序 1. FROM :对 FROM 子句中前两个表执行笛卡尔积生成虚拟表 vt1 2. ON: 对 vt1 表应用 ON 筛选器只有满足 join_condition 为真的行才被插入 vt2 3. OUTER(join) :如果指定了 OUTER JOIN

【SQL】临时表解决小表跨库JOIN

╄→гoц情女王★ 提交于 2020-01-14 00:59:44
-- SQL实现 select 10.00 as amount,'X031' as store_code union select 20.00 as amount,'D033' as store_code -- MyBatis实现 select sd.daily_init_target_money / tmp.reality_money as targetImplRate, tmp.reality_money as salesAmount, sd.store_code from store_daily_sales_analyze sd join ( <foreach collection="storeTargetDtoListList" item="storeTargetDtoListItem" index="index" separator="union"> select #{storeTargetDtoListItem.storeCode} as store_code, #{storeTargetDtoListItem.salesAmount} as reality_money </foreach> )tmp on tmp.store_code = sd.store_code <where> <include refid="query_whereConditions"/> <

t_sql

删除回忆录丶 提交于 2020-01-13 14:31:07
利用SQL SERVER的系统函数 object_id() 可以判断是否存在表、临时表, object_id() 的作用是返回架构范围内对象的数据库对象标识。(即返回系统视图 sys.objects 的 object_id 字段值) 语法: OBJECT_ID ( '[ database_name . [ schema_name ] . | schema_name . ] object_name' [ ,'object_type' ] ) 返回值是 int 类型,如果对象不存在则返回 null 。 t_sql 判断是否存在表 if object_id(N'dbo.Info_City',N'U') is not null print '存在表' else print '不存在表' 判断是否存在临时表 if object_id(N'tempdb.dbo.#TEMP2',N'U') is not null print '存在#TEMP2' else print '不存在#TEMP2' 注意:判断临时表需要指定临时数据库 tempdb 判断其他架构范围内的对象 因为函数object_id() 返回的是 架构范围内对象 的数据库对象标识,意味着例如表、视图、约束、存储过程等其他 架构范围内对象 也可以通过上述方法判断其存在性。 例如,判断存储过程仅需稍稍修改对象名和对象类型即可: if

msyql 去重

最后都变了- 提交于 2020-01-10 20:10:21
delete from userinfo where busi_id in (select busi_id from (select busi_id from userinfo group by busi_id having count(busi_id)>1) tmp1)and id not in (select id from (select min(id) id from userinfo group by busi_id having count(busi_id)>1) tmp2);无主键 添加主键再去重操作。DELETE FROM user WHERE id NOT IN ( SELECT temp.min_id FROM ( SELECT MIN(id) min_id FROM user GROUP BY name,age )AS temp ); 如果在设计表时没有指定主键, 导入数据时可能出现重复导入, 导致一个表中出现多条完全相同的多条记录。 以下是解决这个问题的思路: 使用distinct语句筛选出不重复的记录存入临时表tmp; create table tmp as (select distinct sno,sname,age,sex from s); 删除原表中的数据记录 delete from s; 将临时表中的数据插入到原表。 insert into s

SQL临时表初使用

你说的曾经没有我的故事 提交于 2020-01-09 17:32:42
昨晚同事说他想做一个二次查询,他说那是子查询,我想不是的,子查询是只能放在条件语句里的,而他想放在FROM 后面。 我想这应可以用临时表解决,以前也没有做过临时表,只是在书上了解到了这个概念,只好上百度搜了咯。 开始查到了一个用WITH 写的语句,试了试,没通过,估计是行不通了。 又找了找,才找到了可以用select [字段1,字段2,...,] into #tempTable from table的形式,将查得的结果放到一个临时表,而后再对这个临时表操作. 今早上来,查了查资料,把临时表的相关东东了解了一遍: 其创建方法: create table TempTableName, 或 select [字段1,字段2,...,] into TempTableName from table ,如上所说. 而后便可像使用常规表一样使用它们. 临时表其实是放在数据库tempdb里的一个用户表 分两种: 一种是以#(局部)或##(全局)开头的表,这种表在会话期间存,会话结束则自动删除; 另一种,如果创建时不以#或##开头,而用tempdb.TempTable来命名它,则该表可在数据库重启前一直存在. 以上两种都可手动用 drop table TempTableName 来删除. 来源: https://www.cnblogs.com/hanzhi09/archive/2005/10/10

常用的sql优化方法

邮差的信 提交于 2020-01-08 21:53:04
一、为什么要对SQL进行优化 我们开发项目上线初期,由于业务数据量相对较少,一些SQL的执行效率对程序运行效率的影响不太明显,而开发和运维人员也无法判断SQL对程序的运行效率有多大,故很少针对SQL进行专门的优化,而随着时间的积累,业务数据量的增多,SQL的执行效率对程序的运行效率的影响逐渐增大,此时对SQL的优化就很有必要。 二、SQL优化的一些方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num=10 or num=20 可以这样查询: select id from t where num=10 union all select id from t