`
3177530
  • 浏览: 17850 次
  • 性别: Icon_minigender_2
  • 来自: 南京
社区版块
存档分类
最新评论

提高数据库查询性能的几点原则

阅读更多

在项目开发中  性能问题是必须考虑的问题,为了提高项目的性能,可以着手两个方面,首先在程序方面我们需要优化代码,进行代码的重构,数据库参数的配置,其次在数据库方面,我们需要优化我们的SQL语句,合理的建立索引,

一、在程序方面,
1-》保证在实现功能的基础上,尽量减少对数据库的访问次数;
2-》通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;
3-》能够分开的操作尽量分开处理,提高每次的响应速度;
4-> 在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;
5-> 算法的结构尽量简单;
6-> 在查询时,不要过多地使用通配符如SELECT * FROM T1语句,要用到几列就选择几列如:SELECT COL1,COL2 FROM T1;
7-> 在可能的情况下尽量限制尽量结果集行数如:SELECT TOP 300 COL1,COL2,COL3 FROM T1,因为某些情况下 用户是不需要那么多的数据的。
8-> 不要在应用中使用数据库游标,游标是非常有用的工具,但比使用常规的、面向集的SQL语句需要更大的开销;
按照特定顺序提取数据的查找。

二  数据库方面。

1  避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。
数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:
SELECT name FROM employee WHERE salary > 60000
在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。
我们应当在编程时将整型转化成为钱币型,而不要等到运行时转化。

2  尽量避免在WHERE子句中对字段进行函数或表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
SELECT * FROM T1 WHERE F1/2=100
应改为:
SELECT * FROM T1 WHERE F1=100*2

SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’
应改为:
SELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’

SELECT member_number, first_name, last_name   FROM members
WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21
应改为:
SELECT member_number, first_name, last_name   FROM members
WHERE dateofbirth < DATEADD(yy,-21,GETDATE())
即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

3   避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等这样的操作符,
因为这会使系统无法使用索引,而只能直接搜索表中的数据。例如:
SELECT id FROM employee WHERE id != 'B%'
优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。

4 合理的建立索引 提高查询效率。

5、尽量使用数字型字段,一部分开发人员和数据库管理人员喜欢把包含数值信息的字段设计为字符型,
这会降低查询和连接的性能,并会增加存储开销。
这是因为引擎在处理查询和连接回逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

6、合理使用EXISTS,NOT EXISTS子句。如下所示:
1.SELECT SUM(T1.C1)FROM T1 WHERE(
(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
2.SELECT SUM(T1.C1) FROM T1WHERE EXISTS(
   SELECT * FROM T2 WHERE T2.C2=T1.C2)
两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。
如果你想校验表里是否存在某条纪录,不要用count(*)那样效率很低,而且浪费服务器资源。可以用EXISTS代替。如:
IF (SELECT COUNT(*) FROM table_name WHERE column_name = 'xxx')
可以写成:
IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')

经常需要写一个T_SQL语句比较一个父结果集和子结果集,从而找到是否存在在父结果集中有而在子结果集中没有的记录,如:
1.SELECT a.hdr_key   FROM hdr_tbl a---- tbl a 表示tbl用别名a代替
WHERE NOT EXISTS (SELECT * FROM dtl_tbl b WHERE a.hdr_key = b.hdr_key)

2.SELECT a.hdr_key   FROM hdr_tbl a
LEFT JOIN dtl_tbl b ON a.hdr_key = b.hdr_key   WHERE b.hdr_key IS NULL

3.SELECT hdr_key   FROM hdr_tbl
WHERE hdr_key NOT IN (SELECT hdr_key FROM dtl_tbl)
三种写法都可以得到同样正确的结果,但是效率依次降低。

7、尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。 
见如下例子:
SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’
SELECT * FROM T1 WHERE NAME LIKE ‘L%’
即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。
而第三个查询能够使用索引来加快操作。

8、充分利用连接条件,在某种情况下,两个表之间可能不只一个的连接条件,
这时在   WHERE 子句中将连接条件完整的写上,有可能大大提高查询速度。例:
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO
SELECT SUM(A.AMOUNT) FROM ACCOUNT A,CARD B WHERE A.CARD_NO = B.CARD_NO   AND A.ACCOUNT_NO=B.ACCOUNT_NO
第二句将比第一句执行快得多。

9、消除对大型表行数据的顺序存取,尽管在所有的检查列上都有索引,但某些形式的WHERE子句强迫优化器使用顺序存取。如:
SELECT * FROM orders WHERE (customer_num=104   AND order_num>1001) OR order_num=1008
解决办法可以使用并集来避免顺序存取:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
这样就能利用索引路径处理查询。

10、避免困难的正规表达式。使用 LIKE关键字支持通配符匹配,技术



转载自网易博客
分享到:
评论

相关推荐

    数据库索引设计原则.

    为此,需要遵守以下几点原则: 1.1 基本原则:索引设计应遵守基本原则,即索引列的选择、索引类型的选择、索引的维护等。 1.2 主关键字的约束:主关键字是数据库表中的唯一标识符,索引设计应遵守主关键字的约束,...

    MySql数据库性能优化

    下面将详细介绍MySql数据库性能优化的相关知识点。 什么是优化? 优化是指通过合理安排资源、调整系统参数,使 MySql 运行更快、更节省资源。优化是多方面的,包括查询、更新、服务器等。优化的原则是减少系统瓶颈...

    mySQL数据库性能优化pdf.pdf

    在性能优化的过程中,有几点建议和原则需要牢记:适度优化,避免过度优化;识别并优化性能瓶颈,事半功倍;基于数据进行优化,不要仅凭主观臆测;性能优化是一个持续的过程,需要不断跟进;并且要深入理解业务需求,...

    SQL SERVER6.5查询优化技术的研究.pdf

    本文还讨论了影响数据库性能的几个方面,包括 CPU 配置、磁盘 I/O 性能、网络带宽等,并提出了几点优化方法,例如分散数据存储、选择合适的索引字段等。作者认为,选择合适的索引字段是提高查询性能的重要一步,并且...

    数据库的查询优化技术

    合理使用索引可以极大地提高查询速度。例如,为经常出现在WHERE子句中的列创建索引,尤其是主键和外键。但同时需要注意,索引会占用额外的存储空间,并且在插入、更新和删除操作时可能会降低性能,因此要根据实际...

    数据库优化查询总结,主要是sql语句

    此外,为了进一步提升查询效率,还需要考虑以下几个关键点: 1. **数据库连接管理**:不恰当的数据库连接管理会导致大量的时间浪费在连接和等待过程中。一种有效的解决方案是通过复用现有的`Connection`对象或者...

    SQL Server数据库性能的优化.pdf

    本文并不是对数据库设计原则作系统而详尽的阐述,而是根据作者这几年的经验,在数据库性能优化方面提出以下几点建议,以供大家参考。 一、合理冗余 在数据库设计时,为保证数据的完整性,提倡尽量少的数据冗余。...

    java和数据库性能优化.doc

    在数据库性能优化领域,遵循几个核心原则至关重要。首先是**优先考虑查询**。在大多数应用程序中,查询操作远比插入或更新操作频繁,因此在数据库设计阶段,应将重点放在优化查询效率上。例如,一个OA系统中,一份...

    abap数据库查询效率指南.pdf

    2. **分析数据库编程中的瓶颈**:识别并解决导致性能下降的问题点。 3. **理解表缓冲和索引的工作原理**:掌握如何利用这些机制来提高查询效率。 4. **使用Open SQL进行高效数据库访问**:了解如何编写更加高效的SQL...

    数据库设计原则

    本压缩包文件提供了关于数据库设计的一些关键知识点,包括三大模式、数据库设计原则以及一系列SQL语句。 首先,我们要理解数据库设计的三大模式:概念数据模型、逻辑数据模型和物理数据模型。概念数据模型,通常用...

    数据库表设计原则技巧

    ### 数据库表设计原则技巧详解 #### 一、原始单据与...通过以上几点的介绍,我们可以看出数据库表设计是一项复杂而细致的工作,需要综合考虑各种因素,才能设计出既符合业务需求又能有效支持系统运行的数据库结构。

    数据库设计对SQL Server数据库性能优化分析.pdf

    为了优化SQL Server数据库,还需要考虑以下几点: 1. 使用适当的索引策略,平衡查询速度和插入更新性能。 2. 定期进行数据库维护,如碎片整理、统计信息更新,以保持数据结构的健康状态。 3. 监控和调整数据库配置...

    数据库性能优化之SQL语句优化

    为了保证SQL语句优化的有效性,以下几点是必须要遵守的原则: - 数据库访问代码要集中维护,以统一进行性能监控和调整。 - 定期测试数据库性能,并根据性能监控数据调整优化策略。 - 保证优化措施的可回滚性,...

    关于数据库设计的几个问答

    本文将深入解析“关于数据库设计的几个问答”这一主题,基于给定的文件信息,提炼并阐述其中涉及的重要知识点,涵盖数据库设计的基本步骤、概念模型到逻辑模型的转换、以及数据库性能优化等方面。 ### 数据库设计的...

    天津理工大学 数据库实验四--查询优化.doc

    2. 建立索引后查询:使用索引可以显著提高查询速度,尤其是对于范围查询,如查询年龄在20岁以上的学生。 3. 元组数量少,查询结果占比大:在这种情况下,即使没有索引,查询效率也相对较高。 4. 元组数量多,查询...

    基于合理索引的数据库查询优化研究.pdf

    为了优化查询性能,我们可以考虑以下几点: - **针对`OrderDate`建立聚集索引**:假设我们需要频繁查询某段时间内的销售记录,那么可以考虑在`OrderDate`上建立聚集索引,这样可以显著提高这类查询的速度。 - **...

    数据库讲义 很好的数据库讲义,适合学习数据库

    8. **数据库性能监控与调优**:讲解如何通过监控数据库的性能指标(如CPU使用率、I/O操作、内存使用等)来找出瓶颈,并进行相应的调整和优化。 9. **分布式数据库**:随着大数据时代的到来,分布式数据库成为了解决...

    数据库性能调优技术1索引调优.pdf

    以下是对【数据库性能调优技术1索引调优.pdf】文件中所提及的索引调优知识点的详细阐述。 首先,索引的基本概念需要明确。索引是数据库表中一列或多列的值的集合,可以快速访问表中的特定信息。索引的目的是加快对...

    学生绩点管理系统(C# 数据库)

    综上所述,这个C#实现的学生绩点管理系统,利用了数据库的强大功能,提供了全面的学生成绩管理解决方案,不仅提高了工作效率,也为教育管理带来了便利。开发者可以通过学习和理解此类系统的开发,提升自己的C#编程和...

Global site tag (gtag.js) - Google Analytics