有很多方法可以优化数据库和查询。我的方法如下。
查看 DB Schema,看看它是否有意义
大多数情况下,数据库的设计很糟糕并且没有规范化。这会极大地影响数据库的速度。作为一般情况,学习 3 范式并始终应用它们。高于第 3 范式的范式通常称为反范式,但这真正意味着它们打破了一些规则以使数据库更快。
我建议坚持使用第三范式,除非您是 DBA(这意味着您知道后续表格并知道自己在做什么)。第 3 次 NF 之后的归一化通常在以后进行,而不是在设计期间进行。
只查询你真正需要的
尽可能过滤
您的 Where 子句是优化的最重要部分。
仅选择您需要的字段
永远不要使用“Select *”——只指定你需要的字段;它会更快,并且会使用更少的带宽。
小心连接
就时间而言,连接是昂贵的。确保使用将两个表关联在一起的所有键,并且不要连接到未使用的表 - 始终尝试连接索引字段。连接类型也很重要(INNER、OUTER、...)。
优化查询和存储过程(最先运行)
查询非常快。通常,您可以在不到一秒的时间内检索到许多记录,即使使用连接、排序和计算也是如此。根据经验,如果您的查询时间超过一秒,您可能可以对其进行优化。
从最常用的查询以及执行时间最长的查询开始。
添加、删除或修改索引
如果您的查询进行全表扫描,索引和适当的过滤可以解决通常非常耗时的过程。所有主键都需要索引,因为它们使连接更快。这也意味着所有表都需要一个主键。您还可以在 Where 子句中经常用于过滤的字段上添加索引。
你特别想在整数、布尔值和数字上使用索引。另一方面,您可能不想在 Blob、VarChars 和长字符串上使用索引。
添加索引时要小心,因为它们需要由数据库维护。如果您对该字段进行多次更新,则维护索引所花费的时间可能会比节省的时间多。
在 Internet 世界中,只读表非常普遍。当表为只读时,您可以添加负面影响较小的索引,因为索引不需要维护(或很少需要维护)。
将查询移至存储过程 (SP)
存储过程通常比查询更好更快,原因如下:
Stored Procedures are compiled (SQL Code is not), making them faster than SQL code.
SPs don't use as much bandwidth because you can do many queries in one SP. SPs also stay on the server until the final results are returned.
Stored Procedures are run on the server, which is typically faster.
Calculations in code (VB, Java, C++, ...) are not as fast as SP in most cases.
It keeps your DB access code separate from your presentation layer, which makes it easier to maintain (3 tiers model).
删除不需要的视图
视图是一种特殊类型的查询——它们不是表。它们是逻辑的而不是物理的,因此每次运行 select * from MyView 时,都会运行生成视图的查询和视图上的查询。
如果您总是需要相同的信息,那么视图可能会很好。
如果您必须过滤视图,这就像在查询上运行查询一样 - 它更慢。
调整数据库设置
您可以通过多种方式调整数据库。更新优化器使用的统计信息、运行优化选项、将数据库设为只读等……这需要对您使用的数据库有更广泛的了解,并且主要由 DBA 完成。
****> 使用查询分析器****
在许多数据库中,都有一个用于运行和优化查询的工具。SQL Server 有一个称为查询分析器的工具,它对优化非常有用。您可以编写查询、执行它们,更重要的是,查看执行计划。您可以使用执行来了解 SQL Server 对您的查询所做的工作。