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性能的几种方法的主要内容,如果未能解决你的问题,请参考以下文章