在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

如何提高SQL语句的性能

145次阅读
没有评论

共计 3617 个字符,预计需要花费 10 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下如何提高 SQL 语句的性能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

1, 从 INSERT 返回 IDENTITY

SELECT @@IDENTITY

2, 内嵌视图与临时表

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

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

3, 避免 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(7))

4, 灵活使用笛卡尔乘积

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

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

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

DECLARE @tblMonths TABLE (sMonth VARCHAR(7))
 DECLARE @tblCustomers TABLE ( CustomerID CHAR(10),
 CompanyName VARCHAR(50),
 ContactName VARCHAR(50))
 DECLARE @tblFinal TABLE ( sMonth VARCHAR(7),
 CustomerID CHAR(10),
 CompanyName VARCHAR(50),
 ContactName VARCHAR(50),
 mSales MONEY)
 DECLARE @dtStartDate DATETIME,
 @dtEndDate DATETIME,
 @dtDate DATETIME,
 @i INTEGER
 SET @dtEndDate =  5/5/1997 
 SET @dtEndDate = DATEADD(DD, -1, CAST(CAST((MONTH(@dtEndDate) + 1) AS
 VARCHAR(2)) +  /01/  + CAST(YEAR(@dtEndDate) AS VARCHAR(4)) +   23:59:59  AS DATETIME))
 SET @dtStartDate = DATEADD(MM, -1 * 12, @dtEndDate)
 -- Get all months into the first table
 SET @i = 0
 WHILE (@i   12)
 BEGIN
 SET @dtDate = DATEADD(mm, -1 * @i, @dtEndDate)
 INSERT INTO @tblMonths SELECT CAST(YEAR(@dtDate) AS VARCHAR(4)) +  -  +
 CASE
 WHEN MONTH(@dtDate)   10
 THEN  0  + CAST(MONTH(@dtDate) AS VARCHAR(2))
 ELSE CAST(MONTH(@dtDate) AS VARCHAR(2))
 END AS sMonth
 SET @i = @i + 1
 -- 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 BETWEEN @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(4)) +  -  +
 CASE WHEN MONTH(o.OrderDate)   10
 THEN  0  + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
 ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))
 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 BETWEEN @dtStartDate AND @dtEndDate
 GROUP BY
 c.CustomerID,
 CAST(YEAR(o.OrderDate) AS VARCHAR(4)) +  -  +
 CASE WHEN MONTH(o.OrderDate)   10
 THEN  0  + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
 ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))
 ) 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

5, 拾遗补零

这里介绍其他一些可帮助提高 SQL 查询效率的常用技术。假设您将按区域对所有销售人员进行分组并将他们的销售额进行小计,但是您只想要那些数据库中标记为处于活动状态的销售人员。您可以按区域对销售人员分组,并使用 HAVING 子句消除那些未处于活动状态的销售人员,也可以在 WHERE 子句中执行此操作。在 WHERE 子句中执行此操作会减少需要分组的行数,所以比在 HAVING 子句中执行此操作效率更高。HAVING 子句中基于行的条件的筛选会强制查询对那些在 WHERE 子句中会被去除的数据进行分组。

另一个提高效率的技巧是使用 DISTINCT 关键字查找数据行的单独报表,来代替使用 GROUP BY 子句。在这种情况下,使用 DISTINCT 关键字的 SQL 效率更高。请在需要计算聚合函数 (SUM、COUNT、MAX 等) 的情况下再使用 GROUP BY。另外,如果您的查询总是自己返回一个唯一的行,则不要使用 DISTINCT 关键字。在这种情况下,DISTINCT 关键字只会增加系统开销。

以上是“如何提高 SQL 语句的性能”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-15发表,共计3617字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 日本一级在线观看视频播放 | 国产尤物视频 | 91在线影院 | 国产小视频免费看 | 午夜福利理论片在线观看播放 | 亚洲精品爆乳一区二区h | 成网站在线观看人免费 | 日本一区二区高清 | 蜜桃成人无码区免费视频网站 | 四虎影视在线观看永久地址 | 依依成人精品无v国产 | 亚洲人成电影院在线观看 | 久久无码av三级 | 国产一区二区不卡免费观在线 | 国产00高中生在线无套进入 | 人妻尝试又大又粗久久 | 中国美女一级a毛片录像在线 | 精品国内自产拍在线观看 | 久久成人永久免费播放 | 好湿好紧太硬了我太爽了视频 | 在线激情| 国产成人综合亚洲亚洲欧美 | 日本午夜在线观看 | 国内精品免费一区二区三区 | 91色在线观看 | 男女同床爽爽视频免费 | 91在线亚洲精品一区 | 国产亚洲精品色一区 | 国内精品久久久久久麻豆 | 国产乱人伦无无码视频试看 | 国产精品乱 | 一级免费黄色片 | 超污很黄很肉的电影在线观看 | 清纯唯美 亚洲综合 图区 | 成人在线视频观看 | 日欧一片内射va在线影院 | 国产成人综合网在线观看 | 亚洲欧美精品无码一区二区三区 | 99偷拍视频精品一区二区 | 国产成人精品无码免费看 | 四虎8848精品永久在线观看 |