哪条SQL语句快?

问题描述 投票:1回答:11

哪条SQL语句快?

SELECT TOP 2 c1.Price, c2.Price, ..... c49.Price, c50.Price
FROM Table1 AS c1, Table2 AS c2, ..... Table49 AS c49, Table50 AS c50
WHERE c1.Date = c2.Date AND c2.Date = c3.Date ..... c49.Date = c50.Date
ORDER BY c1.ID DESC

        OR

SELECT TOP 2 c1.Price, c2.Price, ..... c49.Price, c50.Price
FROM (Table1 AS c1 
 INNER JOIN (Table2 AS c2 
    ........
  INNER JOIN (Table49 AS c49
   INNER JOIN Table50 AS c50
  ON c49.Date = c50.Date)
    ........
 ON c2.FullDate__ = c3.FullDate__)
ON c1.FullDate__ = c2.FullDate__)
ORDER BY c1.ID DESC";   

基本上我需要提取从每个表2行周期性地产生的摘要。哪种说法是更快?

sql performance
11个回答
11
投票

什么是快是不是有50桌开始。加入50桌可能是好的,但它是一个非常反直觉的设计,可能不是最维护的解决方案。

你能不能您的数据存储在行(或列)一个(或更少)的表,而不是50桌??!


0
投票

你不指定表的期望音量,但要注意的是,如果查询优化做不同的查询计划那么什么是最快的,在你的表100行可能是不一样的,当你有100,000行或更多。

事实上,一般没有从痴迷优化使用表的查询不到10000条记录,只要你有合理的设计,合理的索引和查询获得。然而,优化不好的查询的地方约10万条记录的性能将开始下降,一般灾难性的。确切的数字取决于构成该行的大小和你的服务器具有的内存量,但它的不寻常数量级以上的为表规模增加一倍的才能看到性能下降。

一般来说,那么最好的策略不是花时间与未成年人的查询上较小的表,这种努力通常可以更有利别处。然而积极优化其运行对你的主表,如果这些都有望增长超过10,000行的任何查询。通常情况下,这将意味着使用QA实例,并装载有期望音量10人次,检查的实际行为。


-8
投票

忽略的JOIN只要有可能。在性能方面,加入语句不是有效的。


5
投票

WHERE通常会比较好,但最好的方式,通过案例的情况下,并抛出这个进入探查,或简单但显示的执行计划。民间经常有很强烈的意见,哪种方法是最快的/在理论上最好的,但没有替换根据你实际处理的理论适用的变化取决于您的数据负载的数据实际上调整。

如果你没有在你的应用程序的实际数据是,试图创造一些现实的压力数据。这将继续用于测试。然后安排时间来调整一旦应用程序是活的。


4
投票

你可能会发现,在SQL优化引擎会产生相同的内部查询(如果逻辑是一样的),并因此会有没有什么区别。

如其他人提及的,通过一个分析器(如查询分析仪)运行此以确定的差值(如果有一个)。


1
投票

所有人都在谈论有更少的表让我思考(感谢MarkR)。我一直在经历的MySQL文档在过去的几个小时,并认识到,一个更好的解决方案是创建一个能够支撑的初步结果一个新的汇总表。此后,我将创建一个触发器每当插入发生在一个始终触动了一个表,将更新新表。

我想到了另一个想法是创建查询的视图。然而,它似乎MySQL的运行基础查询到视图每次它被调用。我对吗?有没有一种方法,使MySQL的存储预执行视图的结果表,然后使用触发器来告诉视图时更新表?有没有做到这一点任何RDBMS?


0
投票

通常情况下,数据库优化了语句,所以差别就不会那么大。但是你可以通过compairing两个查询解释计划验证这一点。

有一件事可能可能优化与加入查询(我没有验证这一点)是有(非加入约束)在声明中加入额外的限制。虽然这是不推荐的风格,因为它没有明确分开的连接条件和其他条件。

例如:

select *     
   from A a 
       join B b on b.x = a.y    
       where b.z = 'ok';

可以写成

select * 
   from A a 
       join B b on b.x = a.y and b.z = 'ok';

0
投票

如果您将查询计划的屏幕截图和探查器跟踪我会很乐意让你知道这是更快。真的是没有足够的信息以其他方式回答这个问题。

我的直觉是,无论是在SQL Server中非常相似的性能和SQL服务器优化了使用相同的查询计划,但谁知道,它可能在五十表连接,使优化器去有点疯狂。

我会在一般的棒,因为我觉得它更容易阅读和维护的JOIN语义。交叉连接是非常容易出错,非常少见。


0
投票

感谢您的回答家伙。

我没有访问查询分析器,因为目前我正在从MS Access,我在那里做一个快速原型,到MySQL移动该数据库。我相信,查询分析器只是在SQL Server上使用,但我可能是错的,所以我不能附上我的探查器跟踪。

每个表是不同的(即,在它的值是即使列名可以是相同的唯一的)和被单独地用于产生其它对象,但我需要偶尔运行从每个表收集行的摘要。所以,我认为我需要50桌,虽然我还没有充实了事物的整体方案,因此会考虑它。 (附注:我是新来的数据库和SQL而不是新的节目)。我还需要考虑内存大小所带来的后果,如果我把所有的信息到一个表时,只有它的一小部分将用于一个时间。

然而,从我收集的,差异不应该是主要的,因为2个语句可能会被编译成相同的内部查询。我问想知道,如果内部会有不同的问题。将运行实际数据测试,以找出。

顺便说一句,将在2条语句的性能问题,如果我们虽然进入多用户式并发查询?


0
投票

优化连接顺序需要指数时间。每个数据库引擎简单地拿起一小部分可能的连接顺序,并估计出这些的最佳选择之一。

好像你总是会想join ... on c*1*.Date = c*n*.Date所有n

你也想摆脱你有非常奇怪数据库架构。


0
投票

当你尝试了什么事?

我的意思是严重的是,查询分析器有一个原因有点计时器。不同的查询结构有时会完全不同的执行时间,经常与它背后没有直观的原因。

写这两个查询。测试它们。然后回来,并回答自己的问题。

© www.soinside.com 2019 - 2024. All rights reserved.