知识大全 提高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中的几种异常处理方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! PL/SQL里有
SQL数据库实现递归查询的几种代码方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! SQL数据
知识大全 SQL Server 2005删除日志文件的几种方法
SQLServer2005删除日志文件的几种方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
PL/SQL中的几种异常处理方法的源代码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 用Fet
知识大全 SQL Server 2005删除日志文件的几种方法小结
SQLServer2005删除日志文件的几种方法小结 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
提高SQL执行效率的几点建议 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 提高SQL执行效率的
初学者必读:提高SQL执行效率的几点建议[2] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! ◆
初学者必读:提高SQL执行效率的几点建议[1] 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 提
SQLServer提高合并复制性能 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 改善合并复制性
知识大全 使用 SQL Server 2000 索引视图提高性能
使用SQLServer2000索引视图提高性能 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 摘