跳转到内容

性能指南/数据库和性能

来自维基教科书,开放世界的开放书籍

除了创建 SQL 命令之外,我们还需要更多知识来优化数据库应用程序的性能。更多关于我们的数据库环境和软件设计的信息也很有帮助,就像一个在你身边的好数据库管理员一样。

首先,我们尝试在不改变应用程序和数据库模式的情况下进行一些优化。否则,我们也希望数据库的设计包含一些性能建议。

驱动程序

[编辑 | 编辑源代码]

正确的驱动程序可以帮助我们。我们需要使用最新的直接数据库驱动程序。我们可以快速获取 ODBC,这通常是原型设计的不错方法。ODBC 访问会从数据库语句和结果中进行一些转换。这不可能很快或很猛烈。注意 - 依赖于编程语言的选择,我们有一些不同的驱动程序(例如 JDBC 知道四种驱动程序类型)。

[编辑 | 编辑源代码]

数据库通常通过网络使用。为了处理传入的语句,这些数据库需要高性能的网络链接。如果许多用户使用数据库,请检查负载均衡以使用数据库集群。

你也要知道网络的 MTU [最大传输单元] 是如何工作的。优化你的数据库语句和结果以避免网络中的碎片化。这是数据库和网络的性能。这可能是最后一步,如果其他任何方法都帮不了你。

表空间

[编辑 | 编辑源代码]

选择合适的表空间大小,还要记住撤销和临时表空间。你需要为你的表空间选择合适的系统文件。因此,我们不建议你使用日志文件系统。

表空间的划分

[编辑 | 编辑源代码]

表空间的划分可以帮助你。如果知道数据库中数据的相对分配,一些数据库系统可以更快地返回结果。

键和索引

[编辑 | 编辑源代码]

改变查询值的方式对数据库来说很重要。通过合适的键,你的查询可以获得超过 100% 的性能提升。创建正确的索引也很重要。这些索引的空间不会太大。最好不要用时间来判断我们是否拥有正确的键和索引。让我们使用执行计划...

执行计划

[编辑 | 编辑源代码]

执行计划是检查性能努力的好方法。这些通常以可视化的形式显示的统计信息让你看到:你的索引和键是否适合你的 SQL 语句?

排序数据

[编辑 | 编辑源代码]

通常我们需要排序的数据,我们可以简单地将这些请求包含在我们的 SQL 中。但请注意 - 我们的 RAM 可能会很快被填满,然后临时表空间 / 硬盘驱动器就会开始使用。此时,表空间 的定义方式就变得很重要了。

结果数量

[编辑 | 编辑源代码]

很多时候我们不需要将所有结果返回给用户。想想互联网搜索引擎 - 没有人一次性发送所有大的结果。首先,用户会从特殊规则中选择的部分结果集获得结果。小型化原则与后台进程或线程结合在一起用于获取后续结果片段,可以为我们的用户带来主观的性能提升。想想 - 你访问过多少个互联网搜索网站。

离线和在线查询

[编辑 | 编辑源代码]

我们“普通”用户希望我们的查询结果非常快。但有些应用程序,比如数据仓库或统计数据,并不需要直接的结果。当我们需要结果时,它只是一个很小的但重要的信息来进行检查。有时异步离线查询就足够了。我们可以通过巧妙地延迟启动这些查询来停止不必要的压力 - 有时是在晚上…

SQL 命令在哪里?

[编辑 | 编辑源代码]

我们可以使用数据库中保存的 SQL 查询 - 过程来更快地运行。在使用查询过程之前,我们的数据库会知道需要的信息,并可以进行优化。

否则,我们也可以使用存储过程。在这里,应用程序会在通常使用之前将 SQL 语句提供给我们的数据库。数据库也可以同样地为我们进行优化。

连接数和重用

[编辑 | 编辑源代码]

连接管理使用许多资源。检查需要多少个数据库连接。

重用数据库连接是一种很好的方式,叫做连接池。我们可以节省很多资源 / 开销,因为我们总是创建新的连接。

数据库内部

[编辑 | 编辑源代码]

SQL 语句的顺序

[编辑 | 编辑源代码]

了解我们使用的数据库 SQL 语句是如何利用的,这是一个好主意。但这依赖于具体的数据库,因此我们最好将语句放到外部资源中。

Oracle

[edit | edit source]

Oracle 数据库从右到左解释 where 子句。如果我们要连接大型表,应首先执行大型约束。因此,在 Oracle 数据库中,应将较大的约束放在右侧 - 例如

select * from Kunde K, Bestellung B
 where Datum 1.1.2000 and 31.1.2000 23:59 and Name= Anton
   and K.kdkey = B.kdkey

Interbase

[edit | edit source]

Interbase 从左到右解释 where 子句。如果我们要连接大型表,应首先执行大型约束。因此,在 Oracle 数据库中,应将较大的约束放在左侧 - 例如

select * from Kunde K, join Bestellung B on K.kdkey=B.kdkey
 where Anton 
   and Datum between 1.1.2000 and 31.1.2000 23:59
华夏公益教科书