临时表

探秘重编译(Recompilations)(2/2)

谁都会走 提交于 2019-11-27 11:43:11
在上一篇文章里,我讨论了 使用临时表如何引起SQL Server里的重编译 。在文章最后我提到,今天这篇文章我会聚焦 表变量(Table Variables) 的更多信息,它可以避免重编译的昂贵开销。我们来详细分析下。 表变量(Table Variables) 表变量总局限于提交到SQL Server的批处理语句范围。当你在批处理语句范围外引用表变量时,SQL Server就会返回你一条错误信息。这是和临时表相比第1个重大区别。下列代码向你展示了如何创建和使用表变量——只在简单存储过程的上下文里。 1 CREATE PROCEDURE DemonstrateTableVariablesNoRecompiles 2 AS 3 BEGIN 4 DECLARE @tempTable TABLE 5 ( 6 ID INT IDENTITY(1, 1) PRIMARY KEY, 7 FirstName CHAR(4000), 8 LastName CHAR(4000) 9 ) 10 11 INSERT INTO @TempTable (FirstName, LastName) 12 SELECT TOP 1000 name, name FROM master.dbo.syscolumns 13 14 SELECT * FROM @TempTable 15 END 16 GO

从MYSQL的ibtmp1文件太大说起

↘锁芯ラ 提交于 2019-11-27 10:20:13
1. 啥情况呀 测试环境机器磁盘空间不足的告警打破了下午的沉寂,一群人开始忙活着删数据。但是,不久前刚清理了一波数据,测试环境在没做压测的情况下不至于短短一个月不到就涨了200G数据,于是,我悄悄的进入数据目录下,发现一个不寻常的点,ibtmp1文件有192G ll -h ibtmp1 -rw-r----- 1 mysql mysql 192G Aug 12 16:20 ibtmp1 2. 怎么处理 2.1 简单说明 ibtmp1是非压缩的innodb临时表的独立表空间,通过innodb_temp_data_file_path参数指定文件的路径,文件名和大小,默认配置为ibtmp1:12M:autoextend,也就是说在支持大文件的系统这个文件大小是可以无限增长的。 2.2 解决办法 a) 找个空闲时间关闭数据 # 设置innodb_fast_shutdown参数 SET GLOBAL innodb_fast_shutdown = 0; # 此步骤可以省略 # 关闭数据库实例 shutdown; # 因本实例为MySQL5.7 可以直接在SQL命令行中shutdown关闭 关闭后ibtmp1文件会自动清理 b) 修改my.cnf配置文件 为了避免ibtmp1文件无止境的暴涨导致再次出现此情况,可以修改参数,限制其文件最大尺寸。 如果文件大小达到上限时

建立/删除/修改临时表

≡放荡痞女 提交于 2019-11-27 10:02:16
DROP TEMPORARY TABLE IF EXISTS `SAM_ORDERSIGN_EXCEL_TEMP`; CREATE TEMPORARY TABLE `SAM_ORDERSIGN_EXCEL_TEMP` ( `CHANNEL` varchar(80) COLLATE utf8_bin DEFAULT '' COMMENT '渠道', `CHANNEL_NAME` varchar(80) COLLATE utf8_bin DEFAULT '' COMMENT '渠道名称', `SKU_CHANNEL` varchar(80) COLLATE utf8_bin DEFAULT '' COMMENT '要货渠道', `PURCHASE_NO` varchar(80) COLLATE utf8_bin DEFAULT '' COMMENT '采购单号', `WAREHOUSELEVEL2` varchar(80) COLLATE utf8_bin DEFAULT '' COMMENT '二级仓库', `CHANNEL_SKU` varchar(80) COLLATE utf8_bin DEFAULT '' COMMENT '商品编号', `CHAI_MATERIA_NO` varchar(80) COLLATE utf8_bin DEFAULT '' COMMENT

sql优化

对着背影说爱祢 提交于 2019-11-27 09:34:04
  最近在做一个报表,通过一个sql把需要的数据全都查出来,sql涉及到一点业务,比较复杂些,各种左右内连接,分页查询速度都特别慢都得3秒多,这对用户来说实在是太不友好了,于是趁着表改造,我就重新看着怎么能优化这个sql,终于,将查询控制在了0.3秒左右,所以尤其对于复杂一点的sql来说,了解一些sql的基本优化是多么重要的事,下面总结一下此次优化sql的经验和新得(以后再有sql优化方案,就接这篇往下写):   1、首先sql语句用大写,查询结果不要使用*,表关联时取别名   2、考虑使用“临时表”暂存中间结果(进行表关联数据拆分,即先查出核心数据,再通过核心数据查其他数据,这样会快得多)     多张表关联查询时,可以将主表根据条件先过滤一遍,放入临时表中,其它表关联时就关联这张临时表,而且如果其他表都是依靠主表的话,分页这一步就可以在临时表中完成,更可以加快效率。而且使用临时表也可以使sql看起来简洁易懂,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。   3、用EXISTS替换DISTINCT     在一对多表查询根据条件去除冗余数据时,可以使用EXISTS替换DISTINCT;     (低效):     SELECT

叶问13

我怕爱的太早我们不能终老 提交于 2019-11-27 05:32:42
《叶问》是知数堂新设计的互动栏目,不定期给大家提供技术知识小贴士,形式不限,或提问、或讨论均可,并在当天发布答案,让大家轻轻松松利用碎片时间就可以学到最实用的知识点。 2019年03月5日,周二 MySQL binlog_format=mixed,可行吗,为什么 不可行,因为会导致主从数据不一致 Mixed格式相当于 Row 和 Statement 模式的融合。遇到表结构变更的时候就会以statement模式来记录。像update或者delete等修改数据的语句,还是会记录所有行的变更。 但某些情况就会产生主从数据不一致例如: 1、当带有自增主键的更新多个列的表,并调用触发器或存储函数时 2、当SQL使用LOAD_FILE()功能时。(Bug#39701) 3、当SQL语句引用一个或多个系统变量时。(Bug#331168) 更多请参考,https://dev.mysql.com/doc/refman/8.0/en/binary-log-mixed.html 2019年03月26日,周二 MySQL误删除frm文件该怎么办? 情况一:误删后还未重启MySQL 1、从proc中恢复.frm文件 cp /proc/`pidof mysqld`/fd/误删除的.frm /datadir/db/对应库的目录/ 情况二:误删后也重启MySQL了 2、从备份中获取表结构 2.1 物理备份

叶问12

删除回忆录丶 提交于 2019-11-27 05:31:39
《叶问》是知数堂新设计的互动栏目,不定期给大家提供技术知识小贴士,形式不限,或提问、或讨论均可,并在当天发布答案,让大家轻轻松松利用碎片时间就可以学到最实用的知识点。 2019年01月08日,周二 RDS上,MySQL实例中某张表数据小于tmp_table_size,但有查询时会报错临时空间满 The table '/data/mysql/zst/tmp/#sql_13975_23' is full。原因可能是什么? 一、可能有下面几种情况: 1、在SQL中执行group by、order by、distinct、union、多表update、子查询、多表JOIN等情况下,可能需要生成内部临时表,当内部临时表超过tmp-table-size时,就会产生磁盘临时表。 2、接上,若查询包含BLOB、TEXT类型字段时,MySQL会直接使用磁盘临时表。 3、云数据库购买的磁盘空间,是包括数据库文件、日志文件(binlog、relay log、error log等)、临时文件&临时表(关注 Created_tmp_disk_tables、Created_tmp_tables、Binlog_cache_disk_use、Binlog_stmt_cache_disk_use等指标)所消耗占用的磁盘空间。 4、发生table...is full报错,说明可能生成磁盘临时表太多

MySQL第三讲 一一一一 视图、触发器、函数、存储过程

北城以北 提交于 2019-11-27 05:28:06
视图 视图前戏 我们之前讲有,临时表的概念。   现在我们创建一个临时表:select * from (select * from tb1 where id between 10 and 100) as B where B.name = '李四'';   上面的重命名的表B就是一个临时表,可以看出临时表是一个动态的查询过程生成的表。所以,临时表就是经过一条查询语句运行之后生成的表。现在想想一下,我们有的时候,是有可能经常使用到同一张临时表,我们总不能每次用一次临时表,就写同样的代码吧。那多累呀,所以,我们将一些常用的到的临时表规定的存放到某个地方,并有属于它们自己的名字,那再次使用的时候,就简单多了。 好了,上面这段话,其实已经引入了视图概念了!请继续!! 视图的定义 视图是一个虚拟表,其本质就是根据SQL语句获取动态的数据集合,并为其命名(视图名),当用户需要使用这个数据集合的时候,只需要使用视图名就可以获得到改数据集合(表)。 创建视图 -- 格式:create view 视图名称 as SQL语句 create view v1 as select * from tb1 where id>10 删除视图 -- 格式:drop view 视图名称 drop view v1 修改视图 -- 格式:alter view 视图名称 as SQL语句 alter view v1 as

一份详细的 MySQL 规范

会有一股神秘感。 提交于 2019-11-27 02:24:30
一、数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份表必须以bak_为前缀并以日期(时间戳)为后缀 所有存储相同数据的列名和列类型必须一致(一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索 引失效,导致查询效率降低) 二、数据库基本设计规范 1、所有表必须使用Innodb存储引擎 没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎(mysql5.5之前默认使用Myisam,5.6以后默认的为Innodb)Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能更好 2、数据库和表的字符集统一使用UTF8 兼容性更好,统一字符集可以避免由于字符集转换产生的乱码,不同的字符集进行比较前需要进行转换会造成索引失效 3、所有表和字段都需要添加注释 使用comment从句添加表和列的备注 从一开始就进行数据字典的维护 4、尽量控制单表数据量的大小,建议控制在500万以内 500万并不是MySQL数据库的限制,过大会造成修改表结构,备份,恢复都会有很大的问题

大型数据库设计原则

萝らか妹 提交于 2019-11-27 01:39:44
  一个好的数据库产品不等于就有一个好的应用系统,如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能。一般来讲,在一个MIS系统分析、设计、测试和试运行阶段,因为数据量较小,设计人员和测试人员往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程。笔者依据多年来设计和使用数据库的经验,提出以下一些设计准则,供同仁们参考。    命名的规范   不同的数据库产品对对象的命名有不同的要求,因此,数据库中的各种对象的命名、后台程序的代码编写应采用大小写敏感的形式,各种对象命名长度不要超过30个字符,这样便于应用系统适应不同的数据库。    游标(Cursor)的慎用   游标提供了对特定集合中逐行扫描的手段,一般使用游标逐行遍历数据,根据取出的数据不同条件进行不同的操作。尤其对多表和大表定义的游标(大的数据集合)循环很容易使程序进入一个漫长的等特甚至死机,笔者在某市《住房公积金管理系统》进行日终帐户滚积数计息处理时,对一个10万个帐户的游标处理导致程序进入了一个无限期的等特(后经测算需48个小时才能完成)(硬件环境:Alpha/4000 128Mram ,Sco Unix

mysql存储过程中使用临时表

不问归期 提交于 2019-11-27 01:39:43
当工作在很大的表上时,您可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后多这些表运行查询。   创建临时表很容易,给正常的CREATE TABLE语句加上TEMPORARY关键字:   CREATE TEMPORARY TABLE tmp_table (   name VARCHAR(10) NOT NULL,   value INTEGER NOT NULL   )   临时表将在您连接MySQL期间存在。当您断开时,MySQL将自动删除表并释放所用的空间。当然您能够在仍然连接的时候删除表并释放空间。   DROP TABLE tmp_table   假如在您创建名为tmp_table临时表时名为tmp_table的表在数据库中已存在,临时表将有必要屏蔽(隐藏)非临时表 tmp_table。   假如您声明临时表是个HEAP表,MySQL也允许您指定在内存中创建他:   CREATE TEMPORARY TABLE tmp_table (   name VARCHAR(10) NOT NULL,   value INTEGER NOT NULL   ) TYPE = HEAP   因为HEAP表存储在内存中,您对他运行的查询可能比磁盘上的临时表快些。然而