Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何判断查询是否能够很好地扩展?_Sql - Fatal编程技术网

Sql 如何判断查询是否能够很好地扩展?

Sql 如何判断查询是否能够很好地扩展?,sql,Sql,有经验的SQL开发人员使用哪些方法/技术来确定特定的SQL查询是否会随着负载的增加、关联表中的行的增加等而扩展。不要使表变宽,要使表和索引保持窄。确保索引完全覆盖了查询,并且这些查询是可搜索的 在投产前用大量的数据进行测试,看一下: 另外,按照罗伯特的建议,考虑执行计划。是利用索引吗?有没有扫描之类的?你能以任何方式简单地回答这个问题吗?例如,删除以支持EXISTS和only连接到您需要连接到的表 您没有提到技术——请记住,不同的技术可能会影响更复杂查询的效率 我遵循的一些规则是最重要的 不要在

有经验的SQL开发人员使用哪些方法/技术来确定特定的SQL查询是否会随着负载的增加、关联表中的行的增加等而扩展。

不要使表变宽,要使表和索引保持窄。确保索引完全覆盖了查询,并且这些查询是可搜索的


在投产前用大量的数据进行测试,看一下:

另外,按照罗伯特的建议,考虑执行计划。是利用索引吗?有没有扫描之类的?你能以任何方式简单地回答这个问题吗?例如,删除以支持EXISTS和only连接到您需要连接到的表


您没有提到技术——请记住,不同的技术可能会影响更复杂查询的效率

我遵循的一些规则是最重要的

不要在查询中使用每行函数,如if、case、coalesce等。通过以您需要的格式将数据放入数据库来解决这些问题,即使这涉及重复数据

例如,如果需要快速查找姓氏,请将其存储在输入的表单和小写表单中,并为小写表单编制索引。这样,您就不必担心像select*from tbl这样的事情,其中小写的urname='smith'

是的,我知道这会破坏3NF,但您仍然可以通过明智地使用触发器或预计算列来保证数据完整性。例如,表上的insert/update触发器可以强制将lower_姓氏列设置为小写版本的姓氏

这会将转换成本转移到很少发生的插入/更新,而不是发生更多的选择。您基本上摊销了转换成本

确保where子句中使用的每一列都已编制索引。不一定是单独的,但至少作为复合密钥的主要部分

始终从3NF开始,只有在生产中出现性能问题时才恢复。3NF通常是最容易处理的,只有在绝对必要时才能进行恢复

概要文件,在生产环境或其他环境中,只要您有生产数据和模式。数据库调优不是一个“设置即忘”的操作,除非表中的数据从未发生过非常罕见的更改。您应该定期进行监视,并可能进行调优,以避免更改数据会降低性能的可能性

除非绝对必要,否则不要允许对数据库进行裸查询。尝试控制可以运行哪些查询。如果某位经理能够出现并运行以下程序,那么您作为DBA的工作将更加困难:

select * from very_big_table order by column_without_index;
在你的数据库上

如果管理者希望能够运行即席查询,请为他们提供一个克隆的DBMS或副本,这样您的真实用户(即需要性能的用户)就不会受到影响

当联合就足够时,不要使用联合。如果您知道在一个联合的两个选择之间不可能有重复项,那么让DBMS尝试删除它们是没有意义的

类似地,如果要检索所有主键列或唯一约束中的所有列,则不要在表上使用select distinct。在这些情况下,不存在重复的可能性,因此,您再次要求DBMS执行不必要的工作

示例:我们有一位客户的一个表上使用select distinct*查看。查询视图花费了50秒。当我们用开始选择*的视图替换它时,时间降到了亚秒。不用说,我从中得到了一瓶很好的红酒:-


尽量避免选择*。换句话说,只获取所需的列。当您在本地PC上使用MySQL时,这没有什么区别,但当您在加利福尼亚州有一个应用程序查询内蒙古的数据库时,您希望尽可能减少通过网络发送的流量。

调出执行计划,并查找以下任何一项:

表扫描 [聚集]索引扫描 RID查找 书签查找 键查找 嵌套循环 这些事情中的任何一个都是从最具可伸缩性到最不具可伸缩性的降序,这意味着数据库/查询很可能无法扩展到更大的表。理想的查询主要包括索引查找、散列或合并联接、偶尔的排序和其他影响较小的操作后台打印等


正如其他答案所指出的那样,证明它可以扩展的唯一方法是在所需大小的数据上进行测试。以上只是一条经验法则。

我强烈建议阅读一些关于这方面的参考资料。下面的超链接可能是一本值得研究的好书。在其他主题中,确保查看选择性