需要使用联接优化SQL查询的提示吗

需要使用联接优化SQL查询的提示吗,sql,optimization,join,sybase,Sql,Optimization,Join,Sybase,回顾过去几天,我写的这个查询运行得很好,一个星期后它就会爬行20分钟。我把三张桌子连在一起。我想知道我应该寻找什么东西来让它跑得更快。我真的不知道这个帖子还需要什么信息 编辑:更多信息:db是Sybase 10。查询: SELECT a.id, a.date, a.time, a.signal, a.noise, b.signal_strength, b.base_id, b.firmware, a.site, b.active, a.table_key_id FROM adminuser.st

回顾过去几天,我写的这个查询运行得很好,一个星期后它就会爬行20分钟。我把三张桌子连在一起。我想知道我应该寻找什么东西来让它跑得更快。我真的不知道这个帖子还需要什么信息

编辑:更多信息:db是Sybase 10。查询:

SELECT a.id, a.date, a.time, a.signal, a.noise,
b.signal_strength, b.base_id, b.firmware,
a.site, b.active, a.table_key_id
FROM adminuser.station AS a
JOIN adminuser.base AS b
ON a.id = b.base_id
WHERE a.site = 1234 AND a.date >= '2009-03-20'

我还进行了第三次连接,但运行速度仍然非常慢。我应该尝试另一种连接方法吗?

听起来更像是内存泄漏或客户端代码中没有关闭数据库连接,而不是查询有任何问题

[编辑] Nevermind:您的意思是查询一个日期范围,而不是服务器处于活动状态的持续时间。为了帮助其他人避免同样的困惑,我将把这个问题留给他们


此外,如果您可以发布sql查询也会有所帮助,即使您需要先对其进行一些模糊处理,而且最好检查日期列上是否有索引以及较长范围返回的记录数。

如果您的数据库支持,您可能希望为日期范围使用分区。我听说这会有很大帮助。

如果您在这里使用MSSQL,您可以在SQL Server Management Studio中运行查询,并在查询菜单中设置“包含实际执行计划”选项,从而获得大量信息

这将向您展示SQLServer为执行查询而执行的步骤图,以及每个步骤的相对成本

下一步是稍微修改查询,尝试以不同的方式执行查询,然后同时运行新版本和旧版本。您将得到两个执行计划,其中不仅包括每个步骤的相对成本,还包括查询的两个版本的相对成本!因此,你可以客观地判断你是否正在取得进展


在调试/优化查询时,我总是这样做。

请确保外键上有索引。

请阅读专业版SQL Server 2005性能调优一书。

您没有提到您的数据库。如果不是SQL Server,那么获取数据的细节可能会有所不同,但建议基本相同

当然,可以查看索引,但如果您运行的是SQL Server,那么首先要做的是遵循Blorgbeard的建议,再次使用Management Studio扫描执行计划

我猜您会看到,对于较小的日期范围,优化器会选择一个合理的查询计划,但当日期范围较大时,它会选择完全不同的内容,可能涉及表扫描或索引扫描,并且可能会连接到非常大的临时记录集。执行计划分析器将揭示所有这些

扫描意味着优化器认为,对于您尝试执行的操作,研磨整个表或整个索引比查找特定值更便宜


最终要做的是设置索引和查询语法,以便在查询计划中为查询保留索引查找,而不考虑日期范围,否则,您需要的扫描经过筛选,并且您可以设法最小化临时记录集大小,从而避免过多的读取和I/O。

我不太了解Sybase 10,但请尝试在10天内运行该查询,然后在一段时间内每天分别运行10次,并比较时间。如果第一种情况下的时间要长得多,则可能达到了数据库缓存限制

解决方案不是简单地在程序中的循环中运行较短时间的查询,而是SQL。如果表A是按日期划分的,那么它的效果尤其好

SELECT

 a.id, a.date, a.time, a.signal, a.noise,a.site, b.active, a.table_key_id,
 b.signal_strength, b.base_id, b.firmware

FROM 

( SELECT * FROM adminuser.station 
      WHERE site = 1234 AND date >= '2009-03-20') AS a
JOIN 

    adminuser.base AS b
ON

    a.id = b.base_id
某种程度上重写了查询,以便首先过滤所需的行,然后执行联接,而不是执行联接然后过滤结果

您可以选择所需的列,而不是从子查询中提取*,这可能没有什么帮助

也许这对加快速度没有什么帮助


虽然这在MySql中是有效的,但我不确定sysbase语法

“超过一周”是什么意思?一周的数据而不是几天的数据?在生产环境中运行超过一周?另外,您使用的是哪台数据库服务器?MSSQL?MySQL?Oracle?我再次发布您的查询,我们可以提供帮助,但我们还需要更多的信息来解决问题,您是否为联接条件中使用的列编制了索引,以及您是否确认在执行查询时使用了索引?我明天必须发布。我在家里试着阅读它。我正在使用Sybase 10,所以这是不可能的。我不能。我们正在使用Sybase 10,正确的列正在被索引,我正在使用Sybase 10。事实上,这曾经是连接一个每天增加5000万条记录乘以大约120列并包含一年数据的表的唯一有效方法。