【发布时间】:2017-10-18 11:11:54
【问题描述】:
简介
简单的问题,我想了解是什么让查询更快。我目前被要求提高查询的性能,我有,但是,这是最好的部分,我不确定它如何或为什么更快,但它明显更快.
这对于解释为什么第二个查询如此之快并不是真正必要的,我只是在您想知道的情况下将其包含在内。基本上,我们最初希望找到大量数据,我的意思是每个有效的组合。因此,为什么我认为旧查询的 'top(1)' 部分实际上是无效的。
示例代码
原来的查询是这样运行的
SELECT
...
(SELECT TOP(1) v FROM pat pa WHERE pa.pc = p.c AND pa.ki = 64) AS pt,
(SELECT TOP(1) v FROM pat pa2 WHERE pa2.pc = p.c AND pa2.ki = 17) AS col
...
所以这花费了惊人的时间,所以我把它改成了这样:
SELECT
...
pt.v, col.v
...
INNER JOIN (
SELECT DISTINCT v, pc
FROM pat
WHERE ki = 64
GROUP BY v, pc
) AS pt
ON p.c = pt.pc
INNER JOIN (
SELECT DISTINCT v, pc
FROM pat
WHERE ki = 17
GROUP BY v, pc
) AS col
ON p.c = col.pc
评论
第一个查询会花费两倍的时间来执行,从字面上看,我的意思是性能提高了一倍多,实际上它也带回了更多的数据,这在这种情况下也是一件好事。
如果有人能解释为什么第二个速度这么快,我会很高兴? - 我已经计算出它需要原始查询的 20% 的时间,检索更多的记录,等等。
另外
在编写查询时,你能告诉我尽可能多的注意事项,以及做什么和不做什么的利弊吗? - 如何每次都能获得最佳性能?
我也刚刚编写了一个查询,并且以某种方式执行它会在性能方面产生 INSANE 差异。
第一个查询 - 慢查询
SELECT DISTINCT pa.v, pa.pc, pa.kid, ak.dn, ak.ID
FROM pat AS pa
INNER JOIN akt AS ak
ON pa.kid = ak.id
第二次查询 - 闪电般的快速
WITH prodAts AS (
SELECT DISTINCT v, pc, kid
FROM pat
),
aks AS (
SELECT DISTINCT dn, ID
FROM akt
)
SELECT DISTINCT *
FROM prodAts
INNER JOIN aks
ON prodAts.kid = aks.ID
我的意思是用第一个查询生成 1 行,用第二个查询生成所有行需要相同的时间,我真的不知道这是怎么回事? - 请解释一下?
【问题讨论】:
-
这是一个简单的问题,但它有无数的答案。图书馆已经写了关于这个主题的文章。我已经投票结束,因为范围太广。
-
查看或阅读如何解释执行计划。所有的答案都在里面。
-
我想执行计划听起来像是一个好的开始,我实际上没有访问服务器的权限,我只是编写查询,所以我什至不知道哪些表被索引,哪些表是不,等等。但我值得从它的声音中研究它吗?
-
如果您无法访问服务器并且缺少有关服务器的重要信息,您将如何开展工作?这就像让法国机械师在不移动的情况下在英国修车!
-
我真的不得不问高级开发人员,并做相当多的猜测工作......我知道疯了......它有时确实让我想拔头发......但是事实证明我现在已经变得非常擅长......我真的很喜欢你的比较,因为这就是一半的感觉!
标签: sql sql-server performance