简单的问题,我想了解什么使查询更快。我目前被要求提高查询的性能,我有,但,这是最好的部分,我不确定它是如何或为什么更快,但速度要快得多。
这对于解释为什么第二个查询速度要快得多并不是很重要,我只是在你想知道的事件中包含了这个。基本上,我们希望最初找到大量数据,我的意思是每个组合都是有效的。因此,为什么我认为旧查询的“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行,用第二个查询生成所有行需要相同的时间,我真的不知道是怎么回事? - 请解释一下?
答案 0 :(得分:1)
对于什么是最好的,没有一个明确的答案,唯一的答案是"它取决于"。在对系统进行性能调整时,需要考虑许多因素,包括表大小,索引,磁盘速度,CPU速度和容差,并行数量,语句顺序,可用内存。查询是否需要溢出到临时数据库...列表继续。
正如评论所述,除非我们看到一些查询计划(它们确切地告诉您每个查询实际上在做什么),否则我们只能真实地推测为什么您的查询在您的示例中运行得更快。
对于第二个块,唯一想到的是基表上的索引很差,CTE将数据拉入内存然后将它们连接在一起,因此可以全面查看数据的形式和结构正在操纵。直接连接方法快速扫描表/检查表的存储度量,并猜测将它们连接在一起的最佳方式(优化器有多种内部连接方法可供使用)。 如果这些指标不好/不能代表当前存储的内容,则优化程序很可能做出错误的决定。
继续你对问题的评论,是的,可以访问服务器的状态和计划是最好的(计划至少他们会告诉你它正在使用哪些索引等)。否则你的性能调整只是在黑暗中刺伤,虽然你今天可能会很幸运并获得一些收益,但今天可能会运行数据库维护任务重组所有数据,导致您的新查询实际上是最不理想的选择(可能会发生)
我可以就性能调整给出的最佳建议是识别"为什么当前的解决方案不好"结束"为什么新的好的"这将指导您通过调整进行更好的通话。