科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道四项技术 助你提高SQL Server的性能(2)

四项技术 助你提高SQL Server的性能(2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

有时,为了让应用程序运行得更快,所做的全部工作就是在这里或那里做一些很小调整。

作者:sanandi 来源:赛迪网技术社区 2007年9月3日

关键字: 3977 SQL Server SQL Server 各版本 数据库

  • 评论
  • 分享微博
  • 分享邮件

内嵌视图与临时表

某些时候,查询需要将数据与其他一些可能只能通过执行 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

 p.ProductName

此查询不仅比前面的查询效率更高,而且长度更短。临时表会消耗大量资源。如果只需要将数据联接到其他查询,则可以试试使用内嵌视图,以节省资源。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章