JAVA进阶:提高SQL性能的几种方法

Posted

tags:

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

参考技术A

   从 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

lishixinzhi/Article/program/Java/javascript/201311/25338

js清除浏览器缓存的几种方法

浏览器缓存,有时候我们需要他,因为他可以提高网站性能和浏览器速度,提高网站性能。但是有时候我们又不得不清除缓存,因为缓存可能误事,出现一些错误的数据。像股票类网站实时更新等,这样的网站是不要缓存的,像有的网站很少更新,有缓存还是比较好的。今天主要介绍清除缓存的几种方法。

清理网站缓存的几种方法

meta方法

//不缓存
<META HTTP-EQUIV="pragma" CONTENT="no-cache"> 
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> 
<META HTTP-EQUIV="expires" CONTENT="0">

清理form表单的临时缓存

<body onLoad="javascript:document.yourFormName.reset()">

其实form表单的缓存对于我们书写还是有帮助的,一般情况不建议清理,但是有时候为了安全问题等,需要清理一下!

jquery ajax清除浏览器缓存

方式一:用ajax请求服务器最新文件,并加上请求头If-Modified-Since和Cache-Control,如下:

  $.ajax({
     url:‘www.haorooms.com‘,
     dataType:‘json‘,
     data:{},
     beforeSend :function(xmlHttp){ 
        xmlHttp.setRequestHeader("If-Modified-Since","0"); 
        xmlHttp.setRequestHeader("Cache-Control","no-cache");
     },
     success:function(response){
         //操作
     }
     async:false
  });

方法二,直接用cache:false,

  $.ajax({
     url:‘www.haorooms.com‘,
     dataType:‘json‘,
     data:{},
     cache:false, 
     ifModified :true ,

     success:function(response){
         //操作
     }
     async:false
  });

方法三:用随机数,随机数也是避免缓存的一种很不错的方法!

URL 参数后加上 "?ran=" + Math.random(); //当然这里参数 ran可以任意取了

方法四:用随机时间,和随机数一样。

 URL 参数后加上 "?timestamp=" + new Date().getTime();

以上是关于JAVA进阶:提高SQL性能的几种方法的主要内容,如果未能解决你的问题,请参考以下文章

Java进阶之光!满满的骚操作

Java进阶 - 数据结构ListSetCollections工具类

Java进阶营Java技术专题-虚拟机参数基础学习

JS进阶-闭包的几种常见形式

Java 多线程进阶-并发协作控制

性能测试八:jmeter进阶之beanshell