需要使用JOIN优化SQL查询的提示

时间:2009-03-31 03:03:43

标签: sql optimization join sybase

我写的查询在查看过去几天时运行正常,一旦我超过一周它爬行(约20分钟)。我一起加入3张桌子。我想知道我应该寻找什么样的东西才能让它跑得更快。我真的不知道帖子需要什么其他信息。

编辑:更多信息: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'

我也拿出了第3次JOIN,它仍然运行得非常慢。我应该尝试另一种JOIN方法吗?

8 个答案:

答案 0 :(得分:2)

您可以通过在SQL Server Management Studio中运行查询并使用包含实际执行计划选项(在查询中)获取大量信息(假设您在此处使用MSSQL) 菜单)。

这将显示SQLServer为执行查询而执行的步骤图 - 每个步骤的相对成本。

下一步是稍微重新编写查询(尝试以不同的方式执行),然后同时运行新版本和旧版本。您将获得两个执行计划,相对成本不仅针对每个步骤,而且针对查询的两个版本!所以你可以客观地告诉你是否在取得进步。

我在调试/优化查询时始终这样做。

答案 1 :(得分:2)

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

解决方案不仅仅是在循环中运行较短时间的查询(在程序中,而不是SQL中)。如果表A按日期分区,它的效果特别好。

答案 2 :(得分:1)

确保外键上有索引。

答案 3 :(得分:0)

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

[编辑]
没关系:你的意思是在日期范围内查询而不是服务器处于活动状态的持续时间。我会留下来帮助别人避免同样的困惑。

此外,如果您可以发布sql查询,即使您需要首先对其进行模糊处理,也会有所帮助,并且检查日期列中是否有索引以及更长时间返回的记录数是一个不错的选择。范围。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

抓住“专业SQL Server 2005性能调优”这本书非常棒。

答案 6 :(得分:0)

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

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

我猜你会看到,对于小日期范围,优化器选择合理的查询计划,但是当日期范围很大时,它会选择完全不同的东西,可能涉及表扫描或索引扫描,以及可能的联接导致非常大的临时记录集。执行计划分析器将揭示所有这些。

扫描意味着优化器认为对整个表格或整个索引进行研磨比寻找特定值更便宜。

您最终要做的是获取索引和设置查询的语法,以便在查询的查询计划中保留索引搜索,而不管日期范围如何,或者,如果失败,您需要的扫描是过滤以及您可以设法最小化临时记录集大小,从而避免过多的读取和I / O.

答案 7 :(得分:0)

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语法。