Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么我的查询性能会提高? 简介_Sql_Sql Server_Performance - Fatal编程技术网

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

Sql 为什么我的查询性能会提高? 简介,sql,sql-server,performance,Sql,Sql Server,Performance,简单的问题,我想了解是什么让查询更快。目前有人要求我提高查询的性能,我认为,但这是最好的部分,我不确定如何或为什么它会更快,但它会显著更快 这并不是解释为什么第二个查询要快得多的必要条件,我只在您想知道的事件中包含了这一点。基本上,我们希望首先找到大量的数据,我指的是所有有效的组合。因此,我认为旧查询的“top(1)”部分实际上是无效的 示例代码 最初的查询是这样运行的 SELECT ... (SELECT TOP(1) v FROM pat pa WHERE pa.pc = p.c A

简单的问题,我想了解是什么让查询更快。目前有人要求我提高查询的性能,我认为,但这是最好的部分,我不确定如何或为什么它会更快,但它会显著更快

这并不是解释为什么第二个查询要快得多的必要条件,我只在您想知道的事件中包含了这一点。基本上,我们希望首先找到大量的数据,我指的是所有有效的组合。因此,我认为旧查询的“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%的原始查询时间,检索更多的记录,等等


另外 你能给我尽可能多的应该做和不应该做的事情,以及在写查询时应该做什么和不应该做什么的利弊吗我怎样才能每次都获得最好的表现

我还只写了一个查询,以某种方式执行它会在性能上产生一种疯狂的差异

第一个查询-缓慢的查询 第二个查询-闪电般快速
我的意思是用第一个查询生成一行,用第二个查询生成所有行需要相同的时间,我真的不知道情况如何请解释一下?

什么是最好的并没有明确的答案,唯一的答案是“视情况而定”。在为系统进行性能调优时,需要考虑很多因素,包括表大小、索引、磁盘速度、cpu速度和余量、并行量、语句顺序、可用内存。查询是否需要溢出到临时数据库。。。这个名单还有很多

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

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

根据您在问题中的评论,是的,访问服务器状态和计划是最好的(计划至少会告诉您它正在使用哪些索引等)。否则,您的性能调整只是暗中进行的,虽然您今天可能会幸运地获得一些收益,但今晚可能会运行一个数据库维护任务,重新构造所有数据,从而使您的新查询实际上是最不理想的选择(这可能发生)


关于性能调优,我能给您的最好建议是识别“为什么当前的解决方案不好”而不是“为什么新的解决方案好”,这将引导您更好地进行调优

这是一个简单的问题,但有无数的答案。图书馆已经就这个问题写了文章。我已经投票决定以过于宽泛的方式结束。看看,或者读一下如何解释执行计划。所有答案都在那里。我想执行计划听起来是个好的开始,我实际上没有访问服务器的权限,我只是编写查询,所以我甚至不知道哪些表被索引,哪些表没有索引,等等。但是从它的声音来看,它值得我去研究一下。如果你不能访问服务器并且丢失了关于服务器的重要信息,你怎么能完成你的工作??这就像让一个法国机械师在英国修理一辆汽车而不移动!我真的要问高级开发人员,并做一个公平的份额猜测工作。。。。疯狂我知道。。。。有时候我真的想把头发拔出来。。。但事实证明我现在已经非常擅长了。。。我真的很喜欢你的比较,因为有一半的时间是这样的感觉!老实说,我对这一点还是新手,所以即使是非常模糊的答案,如“视情况而定”,也总比没有答案好,尽管这会导致更多的问题,但这不是重点。谢谢你的意见!:)。。。。是的,我的性能基准是我只是猜测如何获得相同的输出,只是更快地完成,如何,这取决于运气/猜测工作。。。。至于最后的专业提示,我一定要记住这一点,以备将来参考!)@joeevans996在您的情况下,最好是在内部推动,如果您能够访问查询计划,您的工作将更加简单。很好,你现在看到了你的工作成果,但我确实认为有计划可以让你的输出更加一致。好吧,有趣的事实是,显然,当你删除distinct这个词时,它会有完全相同的执行计划。但是,仍然执行得更快,我请一位高级开发人员看一看,他说我打断了他的大脑,所以看起来你的理论可能是对的?我不知道?我想distinct要么使用索引检查它们是否唯一,要么使用排序来识别它们之间的区别。如果使用的是索引(很可能是他们有确切的查询计划),而索引不好,则需要更长的时间。尝试重建表上的索引并运行。原始查询。
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