gpt4 book ai didi

sql - 嵌套选择查询优化——执行缓慢

转载 作者:行者123 更新时间:2023-12-04 20:33:19 24 4
gpt4 key购买 nike

我有一个如下所示的查询:

SELECT 
ROUND(SUM(AGLR * BlokInsideAreaFactor), 2) AS AGLRSum,
ROUND(SUM(Vaarsaed * BlokInsideAreaFactor), 2) AS VaarsaedSum,
ROUND(SUM(Vintsaed * BlokInsideAreaFactor), 2) AS VintsaedSum,
ROUND(SUM(Oliefroe * BlokInsideAreaFactor), 2) AS OliefroeSum,
ROUND(SUM(Baelgsaed * BlokInsideAreaFactor), 2) AS BaelgsaedSum
.... (+ 10 more columns)
FROM
(
SELECT
AGLR,
Vaarsaed,
Vintsaed,
Oliefroe,
Baelgsaed,
.... (+ 10 more columns)
Round((CASE WHEN bloktema.AREAL > 0 THEN
omraade.Geom.STIntersection(bloktema.Geom).STArea() / bloktema.AREAL ELSE 0 END), 2)
AS BlokInsideAreaFactor
FROM [CTtoolsData].dbo.BlokAfgroedeGrp blokAfgroed
INNER JOIN [CTtoolsTema].dbo.bloktema2012 bloktema
ON (bloktema.bloknr = blokAfgroed.bloknr)
INNER JOIN [CTtoolsTema].dbo.Area omraade
ON omraade.Geom.STIntersects(bloktema.GEOM) = 1
where omraade.Id = 296
AND blokAfgroed.[Year] = 2012
) AS Q1

我之所以进行嵌套选择,是因为我必须先计算“BlokInsideAreaFactor”,然后再将其乘以外部选择中的其他列值。

我最初的想法是,我会以这种方式优化查询,因为“BlokInsideAreaFactor”仅对每行计算一次,而不是每行计算 15 次(每列一次)。问题是这样查询会变得非常非常慢。查询大约需要 15 分钟,包含大约 4000 行。不幸的是,我们的硬件老化,正在 SQLServer 2012 Express 上运行查询。

我查看了索引,但似乎无法以这种方式进一步优化。为什么看起来像这样的查询变得如此缓慢,最重要的是有没有办法优化它?

更新:

涉及的表如下所示:

BlokAfgroedeGrp:

  • 列:Id(主键、身份)、BlokNr、Year、AGLR、Vaarsaed、Vintsaed...等。
  • 索引:在 Id 上聚集,在 BlokNr + 年份上唯一非聚集

Bloktema2012:

  • 列:Id(主键、身份)、BlokNr、Geom(几何)+其他(不重要)
  • 索引:聚集在 Id 上,空间聚集在 Geom 上,非唯一 - 非聚集在 Id + BlokNr 上,非唯一 - 非单独聚集在 BlokNr 上。

面积:

  • 列:Id(主键,身份),Geom(几何)+其他(不重要)
  • 索引:基于 Id 的聚类,基于 Geom 的空间

我已确保索引上没有任何碎片。

最佳答案

在了解了临时表之后,我最近又回到了这个问题。我已经能够为此优化查询:

DECLARE @TempTable TABLE (AGLR float,         
Vaarsaed float,
Vintsaed float,
Oliefroe float,
Baelgsaed float,
BlokInsideAreaFactor float)

INSERT INTO @TempTable (AGLR, Vaarsaed, Vintsaed, Oliefroe, Baelgsaed, BlokInsideAreaFactor)

SELECT
AGLR,
Vaarsaed,
Vintsaed,
Oliefroe,
Baelgsaed,
Round((CASE WHEN bloktema.AREAL > 0 THEN
omraade.Geom.STIntersection(bloktema.Geom).STArea() / bloktema.AREAL ELSE 0 END), 2)
AS BlokInsideAreaFactor
FROM [CTtoolsData].dbo.BlokAfgroedeGrp blokAfgroed
INNER JOIN [CTtoolsTema].dbo.bloktema2012 bloktema
ON (bloktema.bloknr = blokAfgroed.bloknr)
INNER JOIN [CTtoolsTema].dbo.Area omraade
ON omraade.Geom.STIntersects(bloktema.GEOM) = 1
where omraade.Id = 296
AND blokAfgroed.[Year] = 2012


SELECT
ROUND(SUM(AGLR * BlokInsideAreaFactor), 2) AS AGLRSum,
ROUND(SUM(Vaarsaed * BlokInsideAreaFactor), 2) AS VaarsaedSum,
ROUND(SUM(Vintsaed * BlokInsideAreaFactor), 2) AS VintsaedSum,
ROUND(SUM(Oliefroe * BlokInsideAreaFactor), 2) AS OliefroeSum,
ROUND(SUM(Baelgsaed * BlokInsideAreaFactor), 2) AS BaelgsaedSum
FROM @TempTable

...所以现在查询大约需要 11 秒,而不是 15 分钟。

希望对其他人有帮助!

关于sql - 嵌套选择查询优化——执行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13303849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com