精华内容
下载资源
问答
  • 外部临时表 通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时表可以同名(同名后非临时表将...
  • 主要介绍了Python实现获取系统临时目录及临时文件的方法,结合实例形式分析了Python文件与目录操作相关函数与使用技巧,需要的朋友可以参考下
  • 主要介绍了sql server创建临时表的两种写法和删除临时表 ,需要的朋友可以参考下
  • sqlserver 临时表的用法

    2020-09-11 05:20:00
    用于复杂查询时可以用临时表来暂存相关记录,能够提高效率、提高程序的可读性,类似于游标中的my_cursor declare my_cursor cursor scroll
  • Oracle释放临时表空间脚本
  • SQL Server 向临时表插入数据,用临时表和表变量代替游标会极大的提高性能,下面有个示例,大家可以参考下
  • 对于自动创建的临时表,由于内存临时表的性能更为优越,mysql总是首先使用内存临时表,而当内存临时表变得太大时,达到某个阈值的时候,内存临时表就转存为外存临时表。也就是说,外存临时表是内存临时表在存储空间...
  • MySQL中的两种临时

    2020-12-14 21:18:52
    外部临时表  通过CREATE TEMPORARY TABLE 创建的临时表,这种临时表称为外部临时表。这种临时表只对当前用户可见,当前会话结束的时候,该临时表会自动关闭。这种临时表的命名与非临时表可以同名(同名后非临时表...
  • 内容是简单的个人主页,放到根目录下面即可使用,域名备案临时展示网页纯静态html,个人用户备案时临时使用,比较容易审核通过
  • postgresql临时

    2018-08-03 10:28:33
    postgresql临时表postgresql临时表postgresql临时表postgresql临时
  • Intouch 2014 R2 DEMO 授权,有效期至2021年4月,仅供学习使用,请勿做其他用途,如有需要,请支持购买正版软件。
  • 10分钟临时邮箱源码-bccto,可以自己部署在服务器上,包内docu安装文档
  • Oracle 临时表用法汇总

    2015-01-09 09:57:02
    临时表的应用 1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。 2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个...
  • oracle查找定位占用临时表空间较大的SQL语句方法,包括:(1)造成临时表空间暴涨的SQL还在运行中(2)造成临时表空间暴涨的SQL已经运行过了。
  • 小易Smalle博文:微信公众平台开发【素材管理】获取临时素材http://blog.csdn.net/oldinaction/article/details/47955557 所用代码
  • 小易Smalle博文:微信公众平台开发【素材管理】上传临时素材http://blog.csdn.net/oldinaction/article/details/47903989 示例代码
  • 10分钟临时邮箱

    热门讨论 2013-07-15 10:45:53
    10分钟临时邮箱 源码
  • VC++创建临时文件实例

    2012-08-23 09:08:58
    摘要:VC/C++源码,文件操作,创建临时文件  VC++创建临时文件的一个实例,创建以TMP结尾的临时文件,这是很多软件运行时都需要的一种方法,对此不熟悉的VC++爱好者可下载源码参考。 来源:乐乐源码(www.lelecode.com)
  • 删除临时文件夹中临时文件的方法

    千次阅读 2021-08-12 08:15:00
    Windows系统一般都会有些临时文件夹,而一些用户在升级到win10正式版后,发现突然找不到临时文件夹了。这该怎么办呢?Windows10系统中的临时文件夹主要有以下三个:①Windows临时文件夹;②用户帐户临时文件夹 ;③ IE...

    Windows系统一般都会有些临时文件夹,而一些用户在升级到win10正式版后,发现突然找不到临时文件夹了。这该怎么办呢?Windows10系统中的临时文件夹主要有以下三个:①Windows临时文件夹;②用户帐户临时文件夹 ;③ IE临时文件夹 。如何查找这三个文件夹在系统盘中的位置,如何删除临时文件夹中的临时文件呢?

    具体方法如下:

    1、①Windows临时文件夹,查找Windows临时文件夹在系统盘中的位置,进入资源管理器,点击系统C:盘;

    4367ea8d32f21a5a590ee8c119cf9dc6.png

    2、在打开的系统C:盘中找到并点击:Windows,打开Windows文件夹窗口;

    6f76e6cabd86c6852273bad6951dae08.png

    3、在Windows文件夹窗口右上角的搜索栏中输入:Temp;

    cd7f748b2ae39b3aa9fc74e6ed7daed6.png

    4、系统自动搜索,搜索出来的临时文件全部显示在窗口中,但这些文件中有的是安装信息文件,有的是脚本文件,还有的是.dll文件,如果不清楚文件用途,建议不要随便删除;

    e10532a68a7d94bbc8361fce6dcad350.png

    5、②用户帐户临时文件夹,查找用户帐户临时文件夹在系统盘中的位置及删除用户帐户临时文件,进入资源管理器,依次展开 C:Users(用户)xyz75(用户名)AppDataLocalTemp;

    1629e5069a1d476d5562ad710e8df66a.png

    6、我们也可以点击系统桌面左下角的【开始】,在开始菜单中点击【运行】,在运行对话框中输入:%temp%命令,点击确定或者回车,打开用户帐户临时文件夹;

    d45bcf9145055994c112514555cd1a19.png

    7、Temp文件夹显示的都是用户帐户临时文件,我们按下键盘上的Ctrl+A键,选中全部临时文件,右键点击,在右键菜单中点击:删除;

    b9422d47b97d257e9c696cc1736c13df.png

    8、可能出现少数或个别临时文件正在使用中,无法删除的现象,跳过可以了(注销系统或电脑重启后可以删除);

    da4ca674b53377a591451e5634947ac2.png

    9、③IE临时文件夹,查找IE临时文件夹及删除IE临时文件,进入资源管理器,依次展开:C:Users(用户)xyz75(用户名)AppDataLocalMicrosoftWindowsINetCache;

    fba98c94dd670fab4adce5160afa9ca6.png

    10、我们也可以进入【控制面板】,点击【Internet选项】,在打开的Internet 属性窗口,点击【浏览历史记录】项的【设置(S)】(在退出时删除历史记录复选框内打勾);

    9eb8e5652270e1240006a58eb2a8cf93.png

    11、在打开的网站数据设置窗口,点击【查看文件】,也可以打开INetCache文件夹(IE高速缓存临时文件夹);

    4b8a40036d713c1b7a6a220cb1bdf33d.png

    12、INetCache文件夹显示的都是IE临时文件,我们按下键盘上的Ctrl+A键,选中全部临时文件,右键点击,在右键菜单中点击:删除;

    b5cacd7422525f350d5c88b2fd0ef223.png

    13、我们点击删除后,会弹出一个警告对话框:确实要删除选中的Cookie吗?,如果一定要删除,点击:是(Y);

    556e41b1330c4d633892b0a488196f37.png

    14、点击【是】以后,INetCache文件夹中的IE临时文件全部删除了。

    0c02c090aac7fa15919247c7f61b55fa.png

    以上就是小编为大家介绍的Windows10系统中Windows临时文件夹、用户帐户临时文件夹和IE临时文件夹在系统盘中的位置,删除临时文件夹中临时文件的方法。供有需要的朋友们参考使用看看。

    展开全文
  • Spark创建临时视图

    千次阅读 2019-11-06 14:41:08
    查看Spark Dataset的API发现,官网给了四种方法来创建临时视图,它们分别是: def createGlobalTempView(viewName: String): Unit // Creates a global temporary view using the given name. def ...

    前言

    查看Spark Dataset的API发现,官网给了四种方法来创建临时视图,它们分别是:

    def createGlobalTempView(viewName: String): Unit
    // Creates a global temporary view using the given name.
    
    def createOrReplaceGlobalTempView(viewName: String): Unit
    // Creates or replaces a global temporary view using the given name.
    
    def createOrReplaceTempView(viewName: String): Unit
    // Creates a local temporary view using the given name.
    
    def createTempView(viewName: String): Unit
    // Creates a local temporary view using the given name.
    

    它们有什么区别呢?分别在什么情况下使用呢?

    临时视图

    1. createTempView(viewName: String)

    创建一个临时视图,viewName为视图名字。临时视图是session 级别的,会随着session 的消失而消失

    • 如果指定的临时视图已存在,则抛出TempTableAlreadyExistsException 异常
    • 参数 viewName:视图名字

    示例:

    df.createTempView("people")
    df2 = spark_session.sql("select * from people")
    
    2. createOrReplaceTempView(viewName: String)

    创建一个临时视图,viewName为视图名字。如果该视图已存在,则替换它。

    • 参数 viewName:视图名字

    上面两个其实可以归为一类,都为临时视图,都是session级别的,不是全局的。顾名思义,带有Replace的就是如果存在视图,即替换。

    全局临时视图

    1. createGlobalTempView(viewName: String)

    创建一个全局临时视图,viewName为视图名字
    spark sql 中的临时视图是session 级别的,会随着session 的消失而消失。如果希望一个临时视图跨session 而存在,则可以建立一个全局临时视图。

    • 如果指定的全局临时视图已存在,则抛出TempTableAlreadyExistsException 异常
    • 全局临时视图存在于系统数据库global_temp 中,必须加上库名取引用它
    • 参数 viewName:视图名字

    示例:

    df.createGlobalTempView("people")
    spark_session.sql("SELECT * FROM global_temp.people").show()
    

    再次强调:使用全局视图时必须加上global_temp数据库名称

    2. createOrReplaceGlobalTempView(viewName: String)

    创建一个全局临时视图,viewName为视图名字。如果该视图已存在,则替换它。

    • 参数 viewName:视图名字

    上面两个其实又可以归为一类,都为全局临时视图。顾名思义,带有Replace的就是如果存在视图,即替换。

    再次划一遍重点!!!

    Spark SQL中的临时视图(Temporary views)是会话范围的,如果创建它的会话终止,临时视图将消失。如果需建立在所有会话之间共享的临时视图,并保持活动状态,直到Spark应用程序终止,那么可以创建一个全局临时视图(Global Temporary View)。全局临时视图绑定到Spark系统保留的数据库global_temp,我们必须使用限定名称来引用它,例如SELECT * FROM global_temp.view1。

    煮个例子

    测试数据准备:

    1,tom,23
    2,jack,24
    3,lily,18
    4,lucy,19
    

    全部测试代码:

      import org.apache.log4j.{Level, Logger}
    import org.apache.spark.sql.SparkSession
    
    object Test {
      def main(args: Array[String]): Unit = {
        Logger.getLogger("org").setLevel(Level.ERROR)
        val spark = SparkSession.builder()
          .appName(name = this.getClass.getSimpleName)
          .master(master = "local[*]")
          .getOrCreate()
    
        import spark.sql
        import spark.implicits._
        val user_df = spark.read.textFile("./data/user")
          .map(_.split(","))
          .map(x => (x(0), x(1), x(2)))
          .toDF("id", "name", "age")
          .cache()
    
        user_df.createTempView(viewName = "view")
        user_df.createGlobalTempView(viewName = "global_view")
    
        sql(sqlText = "select * from view").show()
        sql(sqlText = "select * from global_temp.global_view").show()
        // 创建新的SparkSession
        val new_session: SparkSession = spark.newSession()
        new_session.sql(sqlText = "select * from global_temp.global_view").show()
        new_session.sql(sqlText = "select * from view").show()
        spark.stop()
      }
    }
    

    输出结果:

    +---+----+---+
    | id|name|age|
    +---+----+---+
    |  1| tom| 23|
    |  2|jack| 24|
    |  3|lily| 18|
    |  4|lucy| 19|
    +---+----+---+
    
    +---+----+---+
    | id|name|age|
    +---+----+---+
    |  1| tom| 23|
    |  2|jack| 24|
    |  3|lily| 18|
    |  4|lucy| 19|
    +---+----+---+
    
    +---+----+---+
    | id|name|age|
    +---+----+---+
    |  1| tom| 23|
    |  2|jack| 24|
    |  3|lily| 18|
    |  4|lucy| 19|
    +---+----+---+
    
    Exception in thread "main" org.apache.spark.sql.AnalysisException: Table or view not found: view; line 1 pos 14
    	at org.apache.spark.sql.catalyst.analysis.package$AnalysisErrorAt.failAnalysis(package.scala:47)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.org$apache$spark$sql$catalyst$analysis$Analyzer$ResolveRelations$$lookupTableFromCatalog(Analyzer.scala:733)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.resolveRelation(Analyzer.scala:685)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$8.applyOrElse(Analyzer.scala:715)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$$anonfun$apply$8.applyOrElse(Analyzer.scala:708)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$$anonfun$resolveOperatorsUp$1$$anonfun$apply$1.apply(AnalysisHelper.scala:90)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$$anonfun$resolveOperatorsUp$1$$anonfun$apply$1.apply(AnalysisHelper.scala:90)
    	at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$$anonfun$resolveOperatorsUp$1.apply(AnalysisHelper.scala:89)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$$anonfun$resolveOperatorsUp$1.apply(AnalysisHelper.scala:86)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$.allowInvokingTransformsInAnalyzer(AnalysisHelper.scala:194)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$class.resolveOperatorsUp(AnalysisHelper.scala:86)
    	at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolveOperatorsUp(LogicalPlan.scala:29)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$$anonfun$resolveOperatorsUp$1$$anonfun$1.apply(AnalysisHelper.scala:87)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$$anonfun$resolveOperatorsUp$1$$anonfun$1.apply(AnalysisHelper.scala:87)
    	at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$4.apply(TreeNode.scala:326)
    	at org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:187)
    	at org.apache.spark.sql.catalyst.trees.TreeNode.mapChildren(TreeNode.scala:324)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$$anonfun$resolveOperatorsUp$1.apply(AnalysisHelper.scala:87)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$$anonfun$resolveOperatorsUp$1.apply(AnalysisHelper.scala:86)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$.allowInvokingTransformsInAnalyzer(AnalysisHelper.scala:194)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$class.resolveOperatorsUp(AnalysisHelper.scala:86)
    	at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolveOperatorsUp(LogicalPlan.scala:29)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.apply(Analyzer.scala:708)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.apply(Analyzer.scala:654)
    	at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1$$anonfun$apply$1.apply(RuleExecutor.scala:87)
    	at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1$$anonfun$apply$1.apply(RuleExecutor.scala:84)
    	at scala.collection.LinearSeqOptimized$class.foldLeft(LinearSeqOptimized.scala:124)
    	at scala.collection.immutable.List.foldLeft(List.scala:84)
    	at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1.apply(RuleExecutor.scala:84)
    	at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1.apply(RuleExecutor.scala:76)
    	at scala.collection.immutable.List.foreach(List.scala:381)
    	at org.apache.spark.sql.catalyst.rules.RuleExecutor.execute(RuleExecutor.scala:76)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer.org$apache$spark$sql$catalyst$analysis$Analyzer$$executeSameContext(Analyzer.scala:127)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer.execute(Analyzer.scala:121)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer$$anonfun$executeAndCheck$1.apply(Analyzer.scala:106)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer$$anonfun$executeAndCheck$1.apply(Analyzer.scala:105)
    	at org.apache.spark.sql.catalyst.plans.logical.AnalysisHelper$.markInAnalyzer(AnalysisHelper.scala:201)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer.executeAndCheck(Analyzer.scala:105)
    	at org.apache.spark.sql.execution.QueryExecution.analyzed$lzycompute(QueryExecution.scala:57)
    	at org.apache.spark.sql.execution.QueryExecution.analyzed(QueryExecution.scala:55)
    	at org.apache.spark.sql.execution.QueryExecution.assertAnalyzed(QueryExecution.scala:47)
    	at org.apache.spark.sql.Dataset$.ofRows(Dataset.scala:79)
    	at org.apache.spark.sql.SparkSession.sql(SparkSession.scala:642)
    	at cn.unisk.Test$.main(Test.scala:29)
    	at cn.unisk.Test.main(Test.scala)
    Caused by: org.apache.spark.sql.catalyst.analysis.NoSuchTableException: Table or view 'view' not found in database 'default';
    	at org.apache.spark.sql.catalyst.catalog.ExternalCatalog$class.requireTableExists(ExternalCatalog.scala:48)
    	at org.apache.spark.sql.catalyst.catalog.InMemoryCatalog.requireTableExists(InMemoryCatalog.scala:45)
    	at org.apache.spark.sql.catalyst.catalog.InMemoryCatalog.getTable(InMemoryCatalog.scala:326)
    	at org.apache.spark.sql.catalyst.catalog.ExternalCatalogWithListener.getTable(ExternalCatalogWithListener.scala:138)
    	at org.apache.spark.sql.catalyst.catalog.SessionCatalog.lookupRelation(SessionCatalog.scala:701)
    	at org.apache.spark.sql.catalyst.analysis.Analyzer$ResolveRelations$.org$apache$spark$sql$catalyst$analysis$Analyzer$ResolveRelations$$lookupTableFromCatalog(Analyzer.scala:730)
    	... 44 more
    

    显然同一个SparkSession创建的临时视图只能使用同一个SparkSession访问,但是不同的SparkSession之间可以相互访问创建的全局临时视图。

    什么场景需要创建多个SparkSession?

    说句实话:我从来没有用过全局临时视图,也就是从来没有出现创建多个SparkSession的场景

    网上找了两个场景:

    • Keeping sessions with minor differences in configuration (直译:保持会话在配置上的细微差别)
      其实说白了就是:不同的SparkSession使用不同的配置信息
    Welcome to
          ____              __
         / __/__  ___ _____/ /__
        _\ \/ _ \/ _ `/ __/  '_/
       /___/ .__/\_,_/_/ /_/\_\   version 2.2.0
          /_/
    
    Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_141)
    Type in expressions to have them evaluated.
    Type :help for more information.
    
    scala> spark.range(100).groupBy("id").count.rdd.getNumPartitions
    res0: Int = 200
    
    scala> 
    
    scala> val newSpark = spark.newSession
    newSpark: org.apache.spark.sql.SparkSession = org.apache.spark.sql.SparkSession@618a9cb7
    
    scala> newSpark.conf.set("spark.sql.shuffle.partitions", 99)
    
    scala> newSpark.range(100).groupBy("id").count.rdd.getNumPartitions
    res2: Int = 99
    
    scala> spark.range(100).groupBy("id").count.rdd.getNumPartitions  // No effect on initial session
    res3: Int = 200
    
    • Separating temporary namespaces:(直译:将临时命名空间进行分离)
      说白了就是:同一套代码中,可以通过不同的SparkSession来使用相同的临时视图名称。(可感觉没什么实质的用途)
    Welcome to
          ____              __
         / __/__  ___ _____/ /__
        _\ \/ _ \/ _ `/ __/  '_/
       /___/ .__/\_,_/_/ /_/\_\   version 2.2.0
          /_/
    
    Using Scala version 2.11.8 (OpenJDK 64-Bit Server VM, Java 1.8.0_141)
    Type in expressions to have them evaluated.
    Type :help for more information.
    
    scala> spark.range(1).createTempView("foo")
    
    scala> 
    
    scala> spark.catalog.tableExists("foo")
    res1: Boolean = true
    
    scala> 
    
    scala> val newSpark = spark.newSession
    newSpark: org.apache.spark.sql.SparkSession = org.apache.spark.sql.SparkSession@73418044
    
    scala> newSpark.catalog.tableExists("foo")
    res2: Boolean = false
    
    scala> newSpark.range(100).createTempView("foo")  // No exception
    
    scala> spark.table("foo").count // No effect on inital session
    res4: Long = 1     
    

    后记

    相信现在可以很好的理解Spark中的视图了

    展开全文
  • Oracle 临时表空间 SQL语句

    千次阅读 2021-09-11 12:51:18
    以下总结了关于 Oracle 数据库临时表空间的相关 SQL 语句: Oracle 临时表空间创建和添加数据文件: --创建临时表空间 tempdata create temporary tablespace tempdata tempfile '/oradata/orcl/tempdata01.dbf' ...

    以下总结了关于 Oracle 数据库临时表空间的相关 SQL 语句:

    Oracle 临时表空间创建和添加数据文件:

    --创建临时表空间 tempdata
    create temporary tablespace tempdata tempfile '/oradata/orcl/tempdata01.dbf' size 30g autoextend off;
    --新增临时表空间数据文件
    alter tablespace tempdata add tempfile '/oradata/orcl/tempdata02.dbf' size 30g autoextend off;
    --删除临时表空间数据文件
    展开全文
  • MySQL 临时表的原理以及优化手段

    千次阅读 2021-08-27 11:35:55
    MySQL的临时表的原理以及优化手段。

    MySQL的临时表的原理以及优化手段。

    1 临时表

    sort buffer、内存临时表和join buffer,这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助SQL语句的执行的。其中,在排序的时候用到了sort buffer,在使用join语句的时候用到了join buffer。

    而使用临时表的时候,ExplainExtra字段中具有Using temporary标记。union、group by、distinct等等查询都有可能使用到临时表。

    2 union临时表优化

    使用union的时候,就需要用到内存临时表来进行去重。

    union语句的执行流程为:

    1. 创建一个内存临时表。
    2. 执行第一个子查询,得到值,并存入临时表中。
    3. 执行第二个子查询:依次拿每一行数据和临时表中的每一行数据比较,如果重复则不会插入,这样就实现了去重的功能
    4. 从临时表中按行取出数据,返回结果,并删除临时表。在最后这一步还可以对临时表进行其他操作,比如limit、ORDER BY。

    如果使用union all,则不需要去重,也就不需要临时表了。在执行的时候,就依次执行子查询,得到的结果直接作为结果集的一部分,发给客户端。因此,除非确实需要服务器消除重复的行,否则就一定要使用UNION ALL,这一点很重要。如果没有ALL关键字,MySQL会给临时表加上DISTINCT选项,这会导致对整个临时我的数据做唯一性检查。这样做的代价非常高。如果不需要这些检查,那么甚至都不需要临时表。

    另外,避免对于union之后的结果集进行操作,也能避免临时表的使用,通常需要手工地将MHERE、LIMIT、ORDER BY等子句“下推”到UNION的各个子查询中,以便优化器可以充分利用这些条件进行优化,使得union的结果就是最终的结果(例如,直接将这些子句冗余地写一份到各个子查询)。

    3 group by临时表优化

    另外一个使用临时表的例子是group by,group by还具有隐藏的排序的语句,即在对某些字段进行分组之后,将数据再根据这些字段进行排序,最后返回排序后的结果。

    如下sql:

      select id%10 as m, count(*) as c from t1 group by m;  
    

    这个语句的执行流程是这样的:

    1. 创建内存临时表,表里有两个字段m和c,主键是m;
    2. 扫描表t1的索引a,依次取出叶子节点上的id值,计算id%10的结果,记为x;
      1. 如果临时表中没有主键为x的行,就插入一个记录(x,1);
      2. 如果表中有主键为x的行,就将x这一行的c值加1;
    3. 遍历完成后,再根据字段m做排序,得到结果集返回给客户端。

    此时,Explain的Extra字段中具有Using temporary; Using filesort标记。

    如果并不需要对结果进行排序,那可以在SQL语句末尾增加order by null,即:

      select id%10 as m, count(*) as c from t1 group by m order by null;  
    

    这样就跳过了最后排序的阶段,直接从临时表中取数据返回。

    内存临时表的大小是有限制的,参数tmp_table_size就是控制这个内存大小的,默认是16M。如果要处理的数据超过了最大大小,那么MySQL会把内存临时表转成磁盘临时表,而磁盘临时表默认使用的引擎是InnoDB,因此会按主键顺序存储数据,所以最终取出的结果还是默认有序的。

    对于Group By的临时表的优化,同样是使用索引:因为如果进行Group By字段是有序的,那么在处理时(比如计算每组数量、个数等等),因为跟着的字段有索引,那么相同的值肯定是在一起的、连续的,所以直接顺序扫描输入的数据即可,不需要临时表,也不需要再额外排序。

    总结:

    1. 如果语句执行过程可以一边读数据,一边直接得到结果,是不需要额外内存的,否则就需要额外的内存,来保存中间结果;
    2. join_buffer是无序数组,sort_buffer是有序数组,临时表是二维表结构;

    如果执行逻辑需要用到二维表特性,就会优先考虑使用临时表。比如我们的例子中,union需要用到唯一索引约束, group by还需要用到另外一个字段来存累积计数。

    另外,对于distinct查询来说,如果无法使用索引,则也会使用到临时表,也会进行分组,它和group by的区别是不需要排序。

    参考资料:

    1. 《 MySQL 技术内幕: InnoDB 存储引擎》
    2. 《高性能 MySQL》
    3. 《MySQL实战45讲 | 极客时间 | 丁奇》

    如有需要交流,或者文章有误,请直接留言。另外希望点赞、收藏、关注,我将不间断更新各种Java学习博客!

    展开全文
  • sql临时表_SQL临时

    千次阅读 2020-07-17 00:14:52
    sql临时表In real time scenario, consider that you have read-only access on a table and you have to manipulate some data in it. It is always useful to create a temp table when you want to use the table...
  • 如何在SQL Server中删除临时

    千次阅读 2020-07-16 19:13:05
    临时表,也称为临时表,已被数据库管理员和开发人员广泛使用。 但是,可能有必要在创建临时表之前将其删除。 通常的做法是检查临时表是否存在。 因此,在临时表创建过程中,我们可以消除“数据库中已经有一个名为'#...
  • Oracle数据库临时

    千次阅读 2019-04-05 00:07:32
    一、前言 我们在创建数据表的时候,若没有特殊的指明,那么我们创建的表是一个永久的关系型表格,也就是说,这个...当一个会话结束或者事务结束的时候,这个临时表中的数据,不用用户自己删除,数据库自己会自动...
  • 大数据开发之Hive篇7-Hive临时

    千次阅读 2020-12-28 13:41:30
    如果用数据库中已经存在的永久表的数据库/表名创建了一个临时表,那么在该会话中,对该表的任何引用都将解析为临时表,而不是永久表。如果不删除临时表或将其重命名为不冲突的名称,用户将无法在该会话中访问原始表...
  • SQL临时

    千次阅读 2019-06-26 19:08:40
    临时表就是那些名称以井号 (#) 开头的表。如果当用户断开连接时没有除去临时表,SQL Server 将自动除去临时表。临时表不存储在当前数据库内,而是存储在系统数据库 tempdb 内。 临时表有两种类型: 本地临时表...
  • oracle创建临时

    千次阅读 2021-05-03 06:28:57
    Oracle数据库临时表管理心得我们在创建数据表的时候,若没有特殊的指明,那么我们创建的表是一个永久的关系型表格,也就是说,这个表格中对应的数据,除非是我们显示的删除的话,表中的数据是永远都存在的。...
  • 临时临时表顾名思义,就是临时的,用完销毁掉的表。 数据既可以保存在临时的文件系统上,也可以保存在固定的磁盘文件系统上。 临时表有下面几种: 1、全局临时表 这种临时表从数据库实例启动后开始生效,在...
  • 为了不生成同名的文件夹String s = UUID.randomUUID().toString();String filepath = ServletActionContext.getServletContext().getRealPath(...//创建临时文件夹private void createfile(String filename){File...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,473,217
精华内容 589,286
关键字:

临时

友情链接: VB浏览器.rar