哪个SQL语句更快?

时间:2008-10-28 09:54:36

标签: sql performance

哪种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行以定期生成摘要。 哪种说法更快?

11 个答案:

答案 0 :(得分:11)

更快的是没有50个表开始。加入50个表可能没问题,但这是一个非常反直觉的设计,可能不是最易维护的解决方案。

您是否可以将数据存储在单个(或更少)表的行(或列)中,而不是50个表中???

答案 1 :(得分:5)

通常会更好,但最好的方法是逐个案例并将其投入分析器,或者更简单但显示执行计划。 Folk通常对理论上哪种方法最快/最好有很强烈的意见,但根据您实际处理的数据,实际调整没有替代,因为适用的理论根据您的数据负载而变化。

如果您的应用尚未拥有真实数据,请尝试创建一些逼真的压力数据。这将继续对测试有用。然后在应用程序生效后安排调整时间。

答案 2 :(得分:4)

您可能会发现SQL优化引擎将生成相同的内部查询(如果逻辑相同),因此没有区别。

正如其他人所说,通过分析器(例如查询分析器)运行它来确定差异(如果有的话)。

答案 3 :(得分:1)

所有关于减少桌子的讨论都让我思考(感谢MarkR)。我已经 在过去几个小时内浏览MySQL文档并实现了 一个更好的解决方案是创建一个新的汇总表来保存 初步结果。此后,我将创建一个更新新表的触发器 只要在其中一个总是被触摸的表上发生插入。

我想到的另一个想法是创建查询视图。但似乎MySQL 每次调用时都会将基础查询运行到视图。我对吗?有办法吗? 使MySQL存储预执行视图的结果表,然后使用触发器 告诉视图何时更新表?是否有任何RDBMS可以做到这一点?

答案 4 :(得分:0)

通常,数据库会优化两个语句,因此差异不会那么大。但是你可以通过计算两个查询的解释计划来验证这一点。

可能使用连接优化查询的一件事(我还没有验证过)是在join语句中有额外的约束(非连接约束)。虽然这不是推荐的样式,因为它没有明确区分连接条件和其他条件。

例如:

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';

答案 5 :(得分:0)

如果您附上查询计划和Profiler跟踪的屏幕截图,我们很乐意让您知道哪个更快。确实没有足够的信息来回答这个问题。

我的直觉是两者在SQL Server中都具有非常相似的性能,并且SQL服务器优化两者以使用相同的查询计划,但是谁知道,可能50个表连接使优化器变得有点疯狂。

我一般会坚持JOIN语义,因为我觉得它更容易阅读和维护。交叉连接非常容易出错并且非常罕见。

答案 6 :(得分:0)

感谢你们的回答。

我无法访问查询分析器,因为我正在移动该数据库 MS Access,我正在做一个快速原型,到MySQL。我相信查询分析器是 仅在SQL Server上可用,但我可能错了,所以我无法附加我的Profiler跟踪。

每个表都是不同的(即,即使列名可能相同,其中的值也是唯一的),并且单独使用以生成其他对象,但我需要偶尔运行从每个表收集行的摘要。所以,我相信我需要50张桌子,虽然我还没有充实整个方案,因此会调查它。 (p.s.我是数据库和SQL的新手,但不是编程新手)。我还需要考虑内存大小的后果,如果我将所有信息放入一个表中,只有一小段时间将使用它。

但是,根据我收集的内容,差异不应该是主要的,因为2个语句可能会被编译为相同的内部查询。我问了一个问题,想知道内部是否会有所不同。将对实际数据进行测试以找出答案。

顺便说一句,如果我们将多个用户的并发查询纳入等式,那么2个语句的表现是否重要?

答案 7 :(得分:0)

您没有指定表的预期量,但请注意,如果查询针对不同的查询计划进行了优化,那么表中100行的最快行可能与100,000行的行不同或更多。

事实上,只要你有合理合理设计的索引和查询,使用少于10,000条记录的表对查询进行过度优化通常很少有。但是,大约100,000个记录的差异优化查询的性能将开始降低,通常是灾难性的。确切的数字取决于行大小和服务器中的内存量,但是对于表大小加倍,性能降低一个数量级或更多的情况并不罕见。

通常情况下,最好的策略是不花时间对较小的表进行小问题,通常可以在其他地方花费更多的利润。但是,如果预计这些查询增长超过10,000行,则会积极优化针对主表运行的任何查询。通常,这意味着使用QA实例并加载预期音量的10倍来检查实际行为。

答案 8 :(得分:0)

优化连接顺序需要指数时间。每个数据库引擎只选择少量可能的连接顺序,并估计其中最好的一个。

您似乎总是希望所有join ... on c*1*.Date = c*n*.Daten

您还希望摆脱您拥有的极其奇怪的数据库架构。

答案 9 :(得分:0)

你尝试过时发生了什么?

我的意思是,查询分析器有一个小计时器是有原因的。不同的查询结构有时会产生截然不同的执行时间,通常没有直观的原因。

写两个查询。测试他们。然后回来回答你自己的问题。

答案 10 :(得分:-8)

尽可能忽略JOIN。性能方面,Join语句根本没有效率。