我已经使用SQL服务器一段时间了,并且已经使用了很多性能技术来微调许多查询。大多数这些查询都是在几秒钟内完成的,或者可能是几分钟。
我正在处理一项加载大约100K数据并运行大约10小时的工作。
在编写或调整此类查询时,我需要考虑哪些事项? (例如记忆,日志大小,其他东西)
答案 0 :(得分:3)
确保在要查询的列上定义了良好的索引。
答案 1 :(得分:1)
最终,最好的办法是实际测量并找到瓶颈的来源。找出存储过程中的哪些查询或代码中的哪些操作占用时间最长,并首先关注减少这些查询。
我现在正在处理一个类似的问题,这个问题是在Java上为大量数据库记录执行复杂业务逻辑的工作。我发现关键是要批量处理记录,并尽可能多地运行逻辑而不是在单个记录上运行。这最大限度地减少了到数据库的往返,并使某些查询比我一次为一条记录运行它们更有效。限制批处理大小可防止服务器在Java端工作时耗尽内存。由于我使用的是Hibernate,因此我也会在每批次之后调用session.clear(),以防止会话保留以前批次中不再需要的对象副本。
此外,RDBMS针对处理大量数据进行了优化;尽可能使用普通的SQL操作。避免像游标这样的东西,以及大量的程序编程;正如其他人所说,请确保正确设置索引。
答案 2 :(得分:1)
如果不查看查询,就不可能说。仅仅因为你有索引并不意味着它们被使用。您必须查看执行计划并查看它们是否被使用。他们可能会证明它们对执行计划没有用处。
您可以从查看估算的执行计划开始。如果作业实际完成,您可以等待实际的执行计划。看看参数嗅探。另外,我在SQL Server 2005上有一个非常奇怪的案例
SELECT * FROM l LEFT JOIN r ON r.ID = l.ID WHERE r.ID IS NULL
无法完成,但
SELECT * FROM l WHERE l.ID NOT IN (SELECT r.ID FROM r)
工作正常 - 但仅适用于特定的表格。问题从未得到解决。
确保您的统计信息是最新的。
答案 3 :(得分:0)
如果可能,请在此处发布您的查询,以便查看。我记得有人建立了一个连接到12个不同表的查询,处理大约4万个记录,这些记录花费了大约一天的时间来运行。通过消除不必要的连接,我能够在30分钟内调整它。在返回结果之前,尽可能尝试减少要加入的数据集。如果需要,请使用大量临时表,视图等。
对于具有条件的大型数据集,尝试在连接之前通过视图预先应用条件以减少记录数。 加入100k的100k比加入3k的2k大得多。