为什么我的查询性能会提高?

时间:2017-10-18 11:11:54

标签: sql sql-server performance

简介

简单的问题,我想了解什么使查询更快。我目前被要求提高查询的性能,我有,,这是最好的部分,我不确定它是如何或为什么更快,但速度要快得多。

这对于解释为什么第二个查询速度要快得多并不是很重要,我只是在你想知道的事件中包含了这个。基本上,我们希望最初找到大量数据,我的意思是每个组合都是有效的。因此,为什么我认为旧查询的“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行,用第二个查询生成所有行需要相同的时间,我真的不知道是怎么回事? - 请解释一下?

1 个答案:

答案 0 :(得分:1)

对于什么是最好的,没有一个明确的答案,唯一的答案是"它取决于"。在对系统进行性能调整时,需要考虑许多因素,包括表大小,索引,磁盘速度,CPU速度和容差,并行数量,语句顺序,可用内存。查询是否需要溢出到临时数据库...列表继续。

正如评论所述,除非我们看到一些查询计划(它们确切地告诉您每个查询实际上在做什么),否则我们只能真实地推测为什么您的查询在您的示例中运行得更快。

对于第二个块,唯一想到的是基表上的索引很差,CTE将数据拉入内存然后将它们连接在一起,因此可以全面查看数据的形式和结构正在操纵。直接连接方法快速扫描表/检查表的存储度量,并猜测将它们连接在一起的最佳方式(优化器有多种内部连接方法可供使用)。 如果这些指标不好/不能代表当前存储的内容,则优化程序很可能做出错误的决定。

继续你对问题的评论,是的,可以访问服务器的状态和计划是最好的(计划至少他们会告诉你它正在使用哪些索引等)。否则你的性能调整只是在黑暗中刺伤,虽然你今天可能会很幸运并获得一些收益,但今天可能会运行数据库维护任务重组所有数据,导致您的新查询实际上是最不理想的选择(可能会发生)

我可以就性能调整给出的最佳建议是识别"为什么当前的解决方案不好"结束"为什么新的好的"这将指导您通过调整进行更好的通话。