欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL 高效运行注意事项(二)

程序员文章站 2022-12-13 08:19:51
SQL Server高效运行总的来说有两种方式: 一、 扩容,提高服务器性能,显著提高CPU、内存,解决磁盘I/O瓶颈。硬件的提升是立竿见影的,而且是风险小,在硬件更新换代非常快的年代, 当SQLServer 速度感觉慢的时候,第一选择是更换更新的,更强的服务器! 二、优化应用程序 这个是次优选择。 ......

sql server高效运行总的来说有两种方式:

一、 扩容,提高服务器性能,显著提高cpu、内存,解决磁盘i/o瓶颈。硬件的提升是立竿见影的,而且是风险小,在硬件更新换代非常快的年代,

当sqlserver 速度感觉慢的时候,第一选择是更换更新的,更强的服务器!

二、优化应用程序

这个是次优选择。

 sql 优化,可以考虑从以下几个方面:

1.内嵌视图与临时表  [源自msdn的文章《五种提高 sql 性能的方法》]
  临时表 - 在 tempdb 中的临时表会导致查询进行大量 i/o 操作和磁盘访问,临时表会消耗大量资源。
  内嵌视图 -使用内嵌视图取代临时表。内嵌视图只是一个可以联接到 from 子句中的查询。如果只需要将数据联接到其他查询,则可以试试使用内嵌视图,以节省资源。

例如,如果要查询最新五个定单的有关信息,您首先需要知道是哪些定单。这可以使用返回定单 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
  此查询不仅比前面的查询效率更高,而且长度更短。临时表会消耗大量资源。如果只需要将数据联接到其他查询,则可以试试使用内嵌视图,以节省资源。
---------------------