我正在学习SQL,我已经读过,连接和子查询可能是性能驱逐者。我(有点)了解过程编程语言中算法复杂性的理论,并在编程时尽量注意这一点,但我不知道不同的SQL查询有多昂贵。我决定是否应该花时间学习SQL性能,或者只是在我的查询运行缓慢时注意它。那么我的基本问题是:过早优化SQL是否像程序语言一样邪恶?
作为补充信息,我在一个环境中工作,大多数时候,高性能不是问题,我必须使用的最大表有大约150k行。
这是我在提到“邪恶”时提到的Donald Knuth引用:
我们应该忘记小事 效率,约占97% 时间:过早优化是 万恶之源。但我们不应该 放弃我们的机会 至关重要3%。
答案 0 :(得分:3)
我想说一些关于性能的一般概念是必须的:它会阻止你编写可能伤害你的应用程序的非常糟糕的查询(即使你的表中没有数百万行) )
它还可以帮助您设计数据库,使其更加适应性:例如,您将对如何放置索引有一些想法。
但是你不应该把表现作为第一个目标:第一件事是让一个有效的应用程序;然后,如果需要,你将优化它(有一些性能概念,而开发将帮助你拥有一个更容易优化的应用程序)。
注意我不会说“有关于表演的概念”是“过早优化”,只要你不只是“优化”< / em>,但只是“正确写入”;我宁愿称之为良好的做法,这将有助于编写质量更好的代码; - )
答案 1 :(得分:2)
Knuth意味着什么:了解SQL优化真的非常重要,但只有在您需要时才知道。正如你所说,“大部分时间......高性能不是问题。”
当你确实需要高性能时,有3%的时间需要了解要破坏的规则和原因。
然而,与过程语言不同,即使对于150k行,了解一下如何处理查询也很重要。例如,与搜索索引列上的完全匹配相比,自由文本搜索将非常慢。这是最后的步骤,例如分片或完全非规范化,大多数DBA和开发人员都会划清界限。
答案 2 :(得分:1)
我会说你应该尽可能轻松地重新编写SQL,并且只有在遇到你时才会担心性能。
那就是说。
在开发过程中要注意标准事物,例如索引,子选择,使用标准查询可以完成工作的游标等等。
正确开发原件并没有什么坏处,您可以在以后需要时优化问题。
修改强>
还要记住SQL代码的可维护性非常重要,并且调试SQL比正常编码稍微困难一些。
答案 3 :(得分:1)
我不会说SQL优化与早期编程优化有很多陷阱。在考虑性能的情况下提前设计架构和查询可以帮助您在以后避免一些非常讨厌的重新设计。话虽如此,如果查询不是一个慢查询,可以缓存,或很少以一种会影响你的应用程序的方式调用,那么从长远来看,花一天时间摆脱表扫描对你来说完全没用。
我个人描述了我的查询,并专注于最糟糕和最常用的查询。提前精心设计可以减少最糟糕的情况。
答案 4 :(得分:1)
Knuth说“忘记了97%”,但对于一个典型的网络应用程序,它位于数据库IO中,其中97%的请求时间都花费了。这是一个小优化工作可以产生最大结果的地方。
如果这是您正在编写的应用程序类型,我强烈建议您尽可能多地学习RDBMS的工作方式。其他人给你很好的建议,我补充一点,我通常在决定如何花费我的“优化预算”时自上而下地按照这个列表:
架构设计。想想十二次 关于normalizaton和访问 策略。这会为你节省很多 几小时后痛苦。
查询可读性。与#1相关, 有时试图重新编排你的 查询提供了更好的理解 架构应该如何看待。它也会 当你要求时帮忙 帮助
避免在SELECT列表中使用子查询 联接。
如果有慢速查询 探查。检查缺失的索引 首先,最后,如果有的话 仍然慢查询,尝试重写 它
请记住,数据库性能在很大程度上取决于数据分布和同时请求的数量(因为锁定)。即使查询在1秒内完成。在你的动力不足的上网本上,8核服务器可能需要15秒。如果可能,请检查您对实际数据的查询。如果你知道并发性会很高,那么(矛盾的是)使用许多小查询比使用大查询更好。
答案 5 :(得分:0)
我同意这里所说的一切,我想补充一点:确保你的SQL封装得很好,这样当你发现需要优化的东西时,你只需要改变一个地方,无论代码调用它,变化都是透明的。
就个人而言,我喜欢将所有SQL封装在PL / SQL过程中,但也有一些人不同意这一点。无论你做什么,我建议你尽量避免将SQL“内联”与其他源代码一起使用。这似乎总是导致剪切和粘贴,并很快变得难以维护。将您的SQL放在其他地方,并尝试尽可能多地重复使用它。
此外,阅读索引,它们如何真正起作用,以及何时应该而且不应该使用它们。许多人的第一直觉,当他们得到一个缓慢的查询,是将表索引到死亡。这可能会在短期内解决问题,但长期过度索引表的插入和更新速度会很慢。一些精心选择的索引比索引每个字段要好得多。尝试阅读Stephane Faroult撰写的“重构SQL应用程序”。
最后,如上所述,正确规范化的数据库设计将有助于避免99%的慢速查询。非规范化有时是必要的,但在破坏它们之前了解规则是很重要的。
祝你好运!