關於第四章中,SQL指令何時執行小方框的補充說明

oracle 12c查看执行过的sql及当前正在执行的sql 2.PARSING_SCHEMA_NAME显示的是哪个用户执行的该sql,而不是这个sql操作的表属于哪个schema。当执行新的SQL语句时,如果这条SQL语句不在共享池中,数据库会进行硬解析,并将解析后的执行计划加载到共享池中。如果执行的是共享池内已经存在的SQL语句,则只会进行软解析,LAST_LOAD_TIME的值不会改变。假如同事让排查某个接口都有哪些慢sql,可以使用这个方法(先调用下这个慢接口,然后统计下这个时间段内的慢sql),只是会导出非这个接口的多余慢sql,再结合业务进行筛选吧。 阅读详情
  
關於第四章中,SQL指令何時執行小方框的補充說明
文/黃忠成
 
 
   在【極意之道- .NET Framework 3.5 資料庫開發聖典 ASP.NET】一書中,我於第四章,4-36頁處放上SQL指令何時執行的小方框,裡面的程式證明了當對同一LINQ To SQL回傳值下達多次LINQ  Expression運算式時,只有第一次會被轉成SQL指令後送往資料庫執行。
 但這點與前面提及的Distinct、Count、Skip、Take的函式之用法形成了概念上的衝突,例如下面的Distinct函式用法。
var result = (from s1 in context.Order_Details
             where s1.ProductID == 42 select s1.OrderID).Distinct().Count();
依據4-B01的程式結果看來,Distinct函式應該會先被執行,而Count函式會進入LINQ To Objects的範圍,但就事實而言,Distinct及Count函式都會被組合為單一SQL指令。
SELECT COUNT(*) AS [value]
FROM (
    SELECT DISTINCT [t0].[OrderID]
    FROM [dbo].[Order Details] AS [t0]
    WHERE [t0].[ProductID] = @p0
    ) AS [t1]',N'@p0 int',@p0=42
那究竟是什麼,讓這兩個程式產生不同的結果呢?
  事實上,這是因為4-B01的程式使用IEnumerable為函式間傳遞之型別所致,對於編譯器來說,並不會以物件的原始型別來推算呼叫的Extension Method,而是以最終型別,意思是,當你將LINQ To SQL的回傳值轉型為IEnumerable<T>後,那麼呼叫Where時,編譯器將決議成呼叫System.Linq.Enumerable中的Where函式,而非原本的IQueryable<T>中的Where函式。
 所以,因為明白轉型成IEnumerable後,使得編譯器將後續的LINQ Expression全轉成了LINQ To Objects的呼叫了。
 要正確完成累進式查詢的方式,是將程式4-B01中的IEnumerable<Customer>全換成IQueryable<Customer>。
static void NestedQuery()
{
      NorthwindDataContext context = new NorthwindDataContext ();
      context.Log = Console.Out;
      var fquery = GetFirstQuery(context);
      var ret = DoSecondQuery(context, fquery);
      foreach (var item in ret)
         Console.WriteLine(item.CustomerID);
}
 
static IQueryable<Customer> GetFirstQuery(NorthwindDataContext context)
{
      IQueryable<Customer> result = from s1 in context.Customers select s1;
      return result;
}
 
static IQueryable<Customer> DoSecondQuery(NorthwindDataContext context,
                                          IQueryable<Customer> firstQuery)
{
       var result = from s1 in firstQuery
                    where s1.CustomerID == "VINET"
                      select s1;;
        return result;
}
 這個例子告訴我們一件很重要的事,如果你打算將LINQ的回傳值傳遞到另一個函式,或是回傳,要謹慎選擇型別,因為不同的型別,會影響後續使用LINQ時,編譯器如何決定呼叫的Extension Method,最後造成難以查覺的錯誤。
 如果在撰寫LINQ/LINQ To SQL的通用函式時,不得已需要使用IEnumerable<T>(因為這是LINQ回傳值的通用基礎介面),也要加上依據實體介面來轉型的動作,如下例:
static void NestedQuery()
{
     DataClasses1DataContext context = new DataClasses1DataContext();
     context.Log = Console.Out;
     var fquery = GetFirstQuery(context);
     var ret = DoSecondQuery(fquery);
     foreach (var item in ret)
        Console.WriteLine(item.CustomerID);
}
 
static IEnumerable<Customers> GetFirstQuery(DataClasses1DataContext context)
{
      IEnumerable<Customers> result = from s1 in context.Customers select s1;
      return result;
}
 
 static IEnumerable<Customers> DoSecondQuery(IEnumerable<Customers> firstQuery)
{      
       IEnumerable<Customers> result = null;
       if (firstQuery is IQueryable<Customers>)
           result = from s1 in (IQueryable<Customers>)firstQuery
                    where s1.CustomerID == "VINET"
                    select s1;
        else
           result = from s1 in firstQuery
                    where s1.CustomerID == "VINET"
                    select s1;;
        return result;
}
 
 
mybatis执行sql过程 通过理解 MyBatis 的执行原理,可以更好地优化 SQL 性能、定制插件,并快速定位复杂问题(如缓存失效、动态 SQL 错误等)。处理PreparedStatement(预编译,推荐)处理普通Statement(无参数) 阅读详情

相关推荐

从IPv6到Tomcat:彻底解决127.0.0.1拒绝连接的完整指南

本文提供了从IPv6到Tomcat的全面指南,帮助开发者彻底解决127.0.0.1拒绝连接的问题。涵盖网络协议栈、服务配置、端口管理等多个层面的排查方法,特别针对Tomcat服务提供了专项解决方案,确保开发者能够快速定位并修复连接问题。

weixin_29207439的博客 471

sql专题 之 sql的执行顺序

了解一下sql查询的执行顺序

oneouto的博客 1913

AI大模型开发——transformer模型超全完整版(0基础可懂)

为了更深入的了解transformer模型,我们首先从transformer的诞生聊起吧。transformer在2017年由Vaswani等人首次提出,它摒弃了之前流行的循环神经网络和卷积神经网络的架构,引入了自注意力机制( Self-Attention),显著提高了处理序列数据的能力和效率。transformer模型的这种设计使其在处理长距离依赖问题时, 相比于传统的循环神经网络和长短期记忆网络(LSTM)表现得更加出色,至此, 开启了NLP技术的新篇章。

m0_74922316的博客 2119

【SQL】Mysql中一条sql语句的执行过程

假设写完 redo log 后,机器挂了,binlog 日志没有被写入,那么机器重启后,这台机器会通过 redo log 恢复数据,但是这个时候 binlog 并没有记录该数据,后续进行机器备份的时候,就会丢失这一条数据,同时主从同步也会丢失这一条数据。然后拿到查询的语句,把 age 改为 19,然后调用引擎 API 接口,写入这一行数据,InnoDB 引擎把数据保存在内存中,同时记录 redo log,此时 redo log 进入 prepare 状态,然后告诉执行器,执行完成了,随时可以提交。

double222222的博客 3439

【从零开始学Skynet】基础篇(一):Skynet环境搭建

Skynet运行于Linux操作系统,我们可以在自己的电脑上搭建虚拟机系统,也可以购买阿里云、腾讯云服务器,笔者这个系列的所有代码都是在Ubuntu16.04版本的虚拟机系统下运行编辑。

我是一条寻水的鱼 3167

CFturbo 2024保姆级教程:从流量扬程到三维叶轮,手把手搞定离心泵水力设计

本文提供CFturbo 2024离心泵水力设计的全流程实战指南,从流量扬程参数输入到三维叶轮模型导出,详细解析设计步骤与优化技巧。涵盖叶轮尺寸确定、子午面型线设计、叶片角度调整等关键环节,帮助工程师高效完成CAE辅助的离心泵水力设计,提升设计质量与效率。

weixin_42569329的博客 921

如何查看SQL的执行计划

Hash Join:使用两个表中较小的表,并利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。Nestloop Join:嵌套循环连接,是在两个表做连接时,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大,要把返回子集较小的表作为外表,而且在内表的连接字段上要有索引,否则会很慢。timing:在输出中包含实际启动时间和每个节点花费的时间,重复读系统块在某些系统上会显著的减缓查询的速度,只在ANALYZE也启用的时候使用;

HighGO 1298

李沐之数值稳定性+模型初始化和激活函数

层记为t,这里的y不是预测,还包括了损失函数,y是优化函数,不是预测的结果y。第t层是输出。所有的h都是一些向量,向量关于向量的导数是一个矩阵,所以用了很多次的矩阵乘法,出问题就在这里。

m0_51133942的博客 1527

Oracle SQL Profile 固化执行计划实战说明

在 Oracle 数据库运维与性能优化过程中,执行计划漂移是一个极为常见、也极具风险的问题。 一次错误的执行计划选择,往往会导致 SQL 性能断崖式下降,甚至直接影响核心业务系统。

weixin_42329915的博客 644

第三篇:AMD 和 Intel

它像“乐高积木”一样,可以通过标准化的接口与其他部分组合,构建复杂系统。理解组件后,你会发现从操作系统到微服务,现代软件本质上都是组件的组合!

u013089100的博客 1031

《网络安全自学教程》- Windows基线检查加固

Windows安全配置,基线检查标准,基线加固方式

wangyuxiang946的博客 1万+

借助工具排查Sql执行效率

打开Navicat工具,连接到需要执行sql的数据库2点击查询功能选项3点击新建查询功能,弹出输入操作窗口4数据需要查看执行计划的语句,点击执行,然后点击解释,若sql执行时间太长,点击执行可以跳过5选择解释标签,就可以查看到sql的执行计划了也可在(SELECT) 前加 (EXPLAIN)(查看sql语句查询速度)

cgk_ALEM的博客 2581

PCL RANSAC拟合分割圆柱体模型【2026最新版】

使用RANSAC拟合分割圆柱的原理介绍、官网示例代码实现以及一个可视化拟合出来的圆柱的具体应用案例。博客长期更新,最近一次更新时间为:2026年1月28日。

点云侠的博客 40万+

01 | Hive SQL执行步骤

Hive 不是数据库,而是一个“SQL 到分布式计算的翻译器”。阶段目标解析 & 语义分析理解用户意图,验证合法性逻辑计划 & 优化用最少的计算做最多的事物理计划 & 执行借助 Hadoop 生态高效跑任务编写更高效的 Hive SQL;快速定位性能瓶颈(如全表扫描、数据倾斜);合理调优参数(如选择合适的文件格式和执行引擎。💡记住:Hive 的慢,往往不是 SQL 的错,而是执行计划没优化好。

走过冬季 2119

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

什么是SQL执行计划

什么是SQL执行计划

qq_43934844的博客 2138

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

MySQL中SQL的执行顺序

在日常的开发工作中,我们经常会自己手写一些sql语句,但是对于这些sql语句是怎么执行的,执行的顺序又是怎么样的呢?想必各位大佬对此也是了解的,所以对sql语言的执行顺序有一定的了解的话,会更好的理解一些sql语句,从而更好的写sql语句,也有助于SQL的调优。就比如说,先使用子查询对数据进行过滤后在进行join操作还是直接使用join操作之后,再进行数据过滤。

Y_eatMeat的博客 1716

逐条执行sql和批量执行sql的效率对比

在数据库操作中,逐条执行SQL与批量执行SQL的效率差异主要体现在网络交互、事务处理、资源占用等多个层面。以下从技术原理、效率对比、实战案例等方面展开分析,并结合Oracle数据库的具体实现进行说明。:根据业务场景平衡批量大小(如100-1000条/批次),结合绑定变量和事务控制,在性能与风险间找到平衡点。逐条执行(1000条)批量执行(1000条)

小屁孩大帅-保密的博客 1019

oracle补充日志

oracle补充日志整理

一点见解 6179

mysql指令执行sql文件

mysql指令执行sql文件1.登录MySQL2.执行命令3.导入之后乱码 1.登录MySQL mysql -u root -p 2.执行命令 #第一种方法 mysql> source E:\aa.sql #第二种方法 mysql> \. E:\aa.sql 3.导入之后乱码 在最开始位置插入下面代码 set character set utf8; drop database ...

Jack魏 3955

Oracle中执行SQL过程

SQL执行过程的图大同小异,我们今天主要说执行器,因为执行器中执行计划是非常重要的,它可以辅助我们继续SQL优化,检查SQL语句BUG。目前一般开发人员【不包含DBA和资深数据开发人员】使用最多的就是PLSQL,而PLSQL本身自带查看执行计划的按钮,所以不过多说明。此处用NAVICAT说明: 第一步:EXPLAIN PLAN FOR 第二部:写sql语句 第三步:SELECT * FROM TABLE(dbms_xplan.display); 如下图: 通过上图查看执行计划表可以发现一些字段,我们逐个进

qq_15765269的博客 2703
上一篇: 極意之道- .NET Framework 3.5 資料庫開發聖典 (相關資訊彙集 會不時更新)
下一篇: LINQ To Objects 的資料來源
Code6421
博客等级 码龄20年 259粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值