知识大全 提高SQL性能的几种方法

Posted 笛卡尔

篇首语:要得惊人艺,须下苦功夫。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 提高SQL性能的几种方法相关的知识,希望对你有一定的参考价值。

JAVA进阶:提高SQL性能的几种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

   从 INSERT 返回 IDENTITY

  SELECT @@IDENTITY

   内嵌视图与临时表

  临时表 在 tempdb 中的临时表会导致查询进行大量 I/O 操作和磁盘访问 临时表会消耗大量资源

  内嵌视图 使用内嵌视图取代临时表 内嵌视图只是一个可以联接到 FROM 子句中的查询 如果只需要将数据联接到其他查询 则可以试试使用内嵌视图 以节省资源

   避免 LEFT JOIN 和 NULL

  LEFT JOIN 消耗的资源非常之多 因为它们包含与 NULL(不存在)数据匹配的数据 在某些情况下 这是不可避免的 但是代价可能非常高 LEFT JOIN 比 INNER JOIN 消耗资源更多 所以如果您可以重新编写查询以使得该查询不使用任何 LEFT JOIN 则会得到非常可观的回报

  加快使用 LEFT JOIN 的查询速度的一项技术涉及创建一个 TABLE 数据类型 插入第一个表(LEFT JOIN 左侧的表)中的所有行 然后使用第二个表中的值更新 TABLE 数据类型 此技术是一个两步的过程 但与标准的 LEFT JOIN 相比 可以节省大量时间 一个很好的规则是尝试各种不同的技术并记录每种技术所需的时间 直到获得用于您的应用程序的执行性能最佳的查询

  DECLARE @tblMonths TABLE (sMonth VARCHAR( ))

   灵活使用笛卡尔乘积

  对于此技巧 我将进行非常详细的介绍 并提倡在某些情况下使用笛卡尔乘积 出于某些原因 笛卡尔乘积 (CROSS JOIN) 遭到了很多谴责 开发人员通常会被警告根本就不要使用它们 在许多情况下 它们消耗的资源太多 从而无法高效使用 但是像 SQL 中的任何工具一样 如果正确使用 它们也会很有价值

  其中一段示例代码 值得效仿

   笛卡尔乘积则可以返回所有月份的所有客户 笛卡尔乘积基本上是将第一个表与第二个表相乘 生成一个行集合 其中包含第一个表中的行数与第二个表中的行数相乘的结果 因此 笛卡尔乘积会向表 @tblFinal 返回 (所有月份)* (所有客户)= 行 最后的步骤是使用此日期范围内每个客户的月销售额总计更新 @tblFinal 表 以及选择最终的行集

  DECLARE @tblMonths TABLE (sMonth VARCHAR( ))

  DECLARE @tblCustomers TABLE ( CustomerID CHAR( )

  CompanyName VARCHAR( )

  ContactName VARCHAR( ))

  DECLARE @tblFinal TABLE ( sMonth VARCHAR( )

  CustomerID CHAR( )

  CompanyName VARCHAR( )

  ContactName VARCHAR( )

  mSales MONEY)

  DECLARE @dtStartDate DATETIME

  @dtEndDate DATETIME

  @dtDate DATETIME

  @i INTEGER

  SET @dtEndDate = / /

  SET @dtEndDate = DATEADD(DD CAST(CAST((MONTH(@dtEndDate) + ) AS

  VARCHAR( )) + / / + CAST(YEAR(@dtEndDate) AS VARCHAR( )) + : : AS DATETIME))

  SET @dtStartDate = DATEADD(MM * @dtEndDate)

   Get all months into the first table

  SET @i =

  WHILE (@i < )

  BEGIN

  SET @dtDate = DATEADD(mm * @i @dtEndDate)

  INSERT INTO @tblMonths SELECT CAST(YEAR(@dtDate) AS VARCHAR( )) + +

  CASE

  WHEN MONTH(@dtDate) <

  THEN + CAST(MONTH(@dtDate) AS VARCHAR( ))

  ELSE CAST(MONTH(@dtDate) AS VARCHAR( ))

  END AS sMonth

  SET @i = @i +

  END

   Get all clients who had sales during that period into the y table

  INSERT INTO @tblCustomers

  SELECT DISTINCT

  c CustomerID

  c CompanyName

  c ContactName

  FROM Customers c

  INNER JOIN Orders o ON c CustomerID = o CustomerID

  WHERE o OrderDate BEEEN @dtStartDate AND @dtEndDate

  INSERT INTO @tblFinal

  SELECT m sMonth

  c CustomerID

  c CompanyName

  c ContactName

  

  FROM @tblMonths m CROSS JOIN @tblCustomers c

  UPDATE @tblFinal SET

  mSales = mydata mSales

  FROM @tblFinal f INNER JOIN

  (

  SELECT c CustomerID

  CAST(YEAR(o OrderDate) AS VARCHAR( )) + +

  CASE WHEN MONTH(o OrderDate) <

  THEN + CAST(MONTH(o OrderDate) AS VARCHAR( ))

  ELSE CAST(MONTH(o OrderDate) AS VARCHAR( ))

  END AS sMonth

  SUM(od Quantity * od UnitPrice) AS mSales

  FROM Customers c

  INNER JOIN Orders o ON c CustomerID = o CustomerID

  INNER JOIN [Order Details] od ON o OrderID = od OrderID

  WHERE o OrderDate BEEEN @dtStartDate AND @dtEndDate

  GROUP BY

  c CustomerID

  CAST(YEAR(o OrderDate) AS VARCHAR( )) + +

  CASE WHEN MONTH(o OrderDate) <

  THEN + CAST(MONTH(o OrderDate) AS VARCHAR( ))

  ELSE CAST(MONTH(o OrderDate) AS VARCHAR( ))

  END

  ) mydata on f CustomerID = mydata CustomerID AND f sMonth =

  mydata sMonth

  SELECT f sMonth

  f CustomerID

  f CompanyName

  f ContactName

  f mSales

  FROM @tblFinal f

  ORDER BY

  f CompanyName

  f sMonth

cha138/Article/program/Java/Javascript/201311/25338

相关参考

知识大全 PL/SQL中的几种异常处理方法

PL/SQL中的几种异常处理方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  PL/SQL里有

知识大全 SQL数据库实现递归查询的几种代码方法

SQL数据库实现递归查询的几种代码方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  SQL数据

知识大全 SQL Server 2005删除日志文件的几种方法

SQLServer2005删除日志文件的几种方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 PL/SQL中的几种异常处理方法的源代码

PL/SQL中的几种异常处理方法的源代码  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  用Fet

知识大全 SQL Server 2005删除日志文件的几种方法小结

SQLServer2005删除日志文件的几种方法小结  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 提高SQL执行效率的几点建议

提高SQL执行效率的几点建议  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  提高SQL执行效率的

知识大全 提高SQL执行效率的几点建议[2]

初学者必读:提高SQL执行效率的几点建议[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ◆

知识大全 提高SQL执行效率的几点建议[1]

初学者必读:提高SQL执行效率的几点建议[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  提

知识大全 SQL Server提高合并复制性能

SQLServer提高合并复制性能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  改善合并复制性

知识大全 使用 SQL Server 2000 索引视图提高性能

使用SQLServer2000索引视图提高性能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘