热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

四个语句帮你提高SQLServer的伸缩性

本文讲解如何应用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

推荐阅读
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • Valve 发布 Steam Deck 的新版 Windows 驱动程序
    Valve 最新发布了针对 Steam Deck 掌机的 Windows 驱动程序,旨在提升其在 Windows 环境下的兼容性、安全性和性能表现。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 在 Windows 10 中,F1 至 F12 键默认设置为快捷功能键。本文将介绍几种有效方法来禁用这些快捷键,并恢复其标准功能键的作用。请注意,部分笔记本电脑的快捷键可能无法完全关闭。 ... [详细]
  • 资源推荐 | TensorFlow官方中文教程助力英语非母语者学习
    来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
author-avatar
五味子120的马甲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有