作者:五味子120的马甲 | 来源:互联网 | 2014-04-30 14:32
本文讲解如何应用LEFTJOIN、CROSSJOIN以及IDENTITY值的检索,这些技巧来提高基于SQLServer的利用程序的性能或改良其可伸缩性。你将碰到的现象:利用程序中的SQL查询不能按照您想要的方
本文讲解如何应用LEFT JOIN、CROSS JOIN以及IDENTITY值的检索,这些技巧来提高基于SQL Server的利用程序的性能或改良其可伸缩性。
你将碰到的现象:利用程序中的SQL 查询不能按照您想要的方法进行响应。它要么不返回数据,要么耗费的时间长得出奇。假如它下降了企业利用程序的速度,用户必需等候很长时间。用户盼看利用程序响应敏捷,他们的报告能够在瞬间之内返回分析数据。
为懂得决这些标题,重要的是找到标题的根源。那么,从哪里开端呢?基本原因通常在于数据库设计和拜访它的查询。我将讲述四项技巧,这些技巧可用于提高基于SQL Server的利用程序的性能或改良其可伸缩性。我将仔细阐明 LEFT JOIN、CROSS JOIN 的应用以及IDENTITY 值的检索。请记住,基本没有神奇的解决计划。调剂您的数据库及其查询需要占用时间、进行分析,还需要大批的测试。这些技巧都已被证履行之有效,但对您的利用程序而言,可能其中一些技巧比另一些技巧更实用。
从 INSERT 返回 IDENTITY
我决定从碰到很多标题的内容进手:如何在履行SQL INSERT后检索IDENTITY值。通常,标题不在于如何编写检索值的查询,而在于在哪里以及何时进行检索。在SQL Server中,下面的语句可用于检索由最新在运动数据库连接上运行的 SQL 语句所创立的 IDENTITY 值:SELECT @@IDENTITY。
这个 SQL 语句并不复杂,但需要记住的一点是:假如这个最新的 SQL 语句不是 INSERT,或者您针对非 INSERT SQL 的其他连接运行了此 SQL,则不会获得期看的值。您必需运行下列代码才干检索紧跟在 INSERT SQL 之后且位于同一连接上的 IDENTITY,如下所示:
以下为引用的内容: INSERT INTO Products (ProductName) VALUES ('Chalk') SELECT @@IDENTITY
在一个连接上针对 Northwind 数据库运行这些查询将返回一个名称为 Chalk 的新产品的 IDENTITY 值。所以,在应用ADOVisual Basic利用程序中,可以运行以下语句:
以下为引用的内容: Set oRs = oCn.Execute("SET NOCOUNT ON;INSERT INTO Products _ (ProductName) VALUES ('Chalk');SELECT @@IDENTITY") lProductID = oRs(0)
此代码告诉 SQL Server 不要返回查询的行计数,然后履行 INSERT 语句,并返回刚刚为这个新行创立的 IDENTITY 值。SET NOCOUNT ON 语句表现返回的记录集有一行和一列,其中包含了这个新的 IDENTITY 值。假如没有此语句,则会首先返回一个空的记录集(由于 INSERT 语句不返回任何数据),然后会返回第二个记录集,第二个记录集中包含 IDENTITY 值。这可能有些令人困惑,尤其是由于您从来就没有盼看过 INSERT 会返回记录集。之所以会产生此情况,是由于 SQL Server 看到了这个行计数(即一行受到影响)并将其说明为表现一个记录集。因此,真正的数据被推回到了第二个记录集。当然您可以应用 ADO 中的 NextRecordset 方法获取此第二个记录集,但假如总能够首先返回该记录集且只返回该记录集,则会更方便,也更有效率。
此方法固然有效,但需要在 SQL 语句中额外添加一些代码。获得雷同成果的另一方法是在 INSERT 之前应用 SET NOCOUNT ON 语句,并将 SELECT @@IDENTITY 语句放在表中的 FOR INSERT 触发器中,如下面的代码片段所示。这样,任何进进该表的 INSERT 语句都将主动返回 IDENTITY 值。
以下为引用的内容: CREATE TRIGGER trProducts_Insert ON Products FOR INSERT AS SELECT @@IDENTITY GO
触发器只在 Products 表上产生 INSERT 时启动,所以它总是会在成功 INSERT 之后返回一个 IDENTITY。应用此技巧,您可以始终以雷同的方法在利用程序中检索 IDENTITY 值。
内嵌视图与临时表
某些时候,查询需要将数据与其他一些可能只能通过履行 GROUP BY 然后履行尺度查询才干收集的数据进行联接。例如,假如要查询最新五个定单的有关信息,您首先需要知道是哪些定单。这可以应用返回定单 ID 的 SQL 查询来检索。此数据就会存储在临时表(这是一个常用技巧)中,然后与 Products 表进行联接,以返回这些定单售出的产品数目:
以下为引用的内容: CREATE TABLE #Temp1 (OrderID INT NOT NULL, _ OrderDate DATETIME NOT NULL) INSERT INTO #Temp1 (OrderID, OrderDate) SELECT TOP 5 o.OrderID, o.OrderDate FROM Orders o ORDER BY o.OrderDate DESC SELECT p.ProductName, SUM(od.Quantity) AS ProductQuantity FROM #Temp1 t INNER JOIN [Order Details] od ON t.OrderID = od.OrderID INNER JOIN Products p ON od.ProductID = p.ProductID GROUP BY p.ProductName ORDER BY p.ProductName DROP TABLE #Temp1
这些 SQL 语句会创立一个临时表,将数据插进该表中,将其他数据与该表进行联接,然后除往该临时表。这会导致此查询进行大批 I/O 把持,因此,可以重新编写查询,应用内嵌视图代替临时表。内嵌视图只是一个可以联接到 FROM 子句中的查询。所以,您不用在 tempdb 中的临时表上耗费大批 I/O 和磁盘拜访,而可以应用内嵌视图得到同样的成果:
以下为引用的内容:
SELECT p.ProductName, SUM(od.Quantity) AS ProductQuantity FROM ( SELECT TOP 5 o.OrderID, o.OrderDate FROM Orders o ORDER BY o.OrderDate DESC ) t INNER JOIN [Order Details] od ON t.OrderID = od.OrderID INNER JOIN Products p ON od.ProductID = p.ProductID GROUP BY p.ProductName ORDER BY
推荐阅读
本文介绍了数据库体系的基础知识,涵盖关系型数据库(如MySQL)和非关系型数据库(如MongoDB)的基本操作及高级功能。通过三个阶段的学习路径——基础、优化和部署,帮助读者全面掌握数据库的使用和管理。 ...
[详细]
蜡笔小新 2024-12-22 19:17:15
本文详细探讨了 org.apache.hadoop.ha.HAServiceTarget 类中的 checkFencingConfigured 方法,包括其功能、应用场景及代码示例。通过实际代码片段,帮助开发者更好地理解和使用该方法。 ...
[详细]
蜡笔小新 2024-12-22 18:28:35
本文介绍 SQL Server 的基本概念和操作,涵盖系统数据库、常用数据类型、表的创建及增删改查等基础操作。通过实例帮助读者快速上手 SQL Server 数据库管理。 ...
[详细]
蜡笔小新 2024-12-22 18:39:17
本文详细介绍如何使用CSS自定义HTML5视频播放器的样式,涵盖常见属性及跨浏览器兼容性问题。发布时间:2020-09-14 14:46:29;来源:亿速云;阅读量:58;作者:小新。 ...
[详细]
蜡笔小新 2024-12-22 18:36:22
本文详细介绍了如何将 Python 3.6.3 程序转换为 Windows 可执行文件(.exe),并解决了使用 py2exe 和 cx_Freeze 时遇到的问题。推荐使用 PyInstaller 进行打包,提供完整的安装和打包步骤。 ...
[详细]
蜡笔小新 2024-12-22 17:28:12
2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ...
[详细]
蜡笔小新 2024-12-22 16:09:09
本文深入分析了 USDC 的稳定性和可能的救援措施,探讨了在硅谷银行破产后 USDC 面临的风险以及行业内的反应。 ...
[详细]
蜡笔小新 2024-12-22 16:05:49
本文详细介绍了使用Node.js、Express、MongoDB和Socket.io构建的实时聊天应用程序。涵盖项目结构、技术栈选择及关键依赖项的配置。 ...
[详细]
蜡笔小新 2024-12-22 15:31:28
本文介绍如何使用PHP在WordPress中根据分类类别ID或名称获取所有相关文章,提供详细的方法和代码示例。 ...
[详细]
蜡笔小新 2024-12-22 15:05:58
本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ...
[详细]
蜡笔小新 2024-12-22 14:36:54
This request pertains to exporting the hosted_zone_id attribute associated with the aws_rds_cluster resource in Terraform configurations. The absence of this attribute can lead to issues when integrating DNS records with Route 53. ...
[详细]
蜡笔小新 2024-12-22 14:20:30
本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ...
[详细]
蜡笔小新 2024-12-22 14:02:29
本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ...
[详细]
蜡笔小新 2024-12-22 13:38:48
本文记录了在安装CPU版本的TensorFlow过程中遇到的依赖问题及解决方案,特别是numpy版本不匹配和动态链接库(DLL)错误。通过详细的步骤说明和专业建议,帮助读者顺利安装并使用TensorFlow。 ...
[详细]
蜡笔小新 2024-12-22 13:22:19
本文详细介绍了在XAMPP环境中如何修改Apache和MySQL的默认端口号,并确保WordPress能够正常访问。同时,提供了针对Go语言社区和Golang开发者的相关建议。 ...
[详细]
蜡笔小新 2024-12-22 13:14:54