代码改变世界

查询优化(5)——总结

2010-07-01 11:57 by 知行思新, 1674 阅读, 1 推荐, 收藏, 编辑
摘要:在前几篇中我们讨论了查询优化的几个方面。今天我们进行一个总结,把最重要的设计原则概括起来。 基于集合思考 对于SQL初学者,这是最需要注意的。我们应尽可能避免使用游标。 定义游标来扫描表中的行不符合数据库编程的思想。 其比SQL Server内置的nested loop迭代运算低效,因为其对于每行数据需要更深的执行栈。 查询优化器无法对其进行优化,如使用不同的连接顺序,执行顺序或使用不同的执... 阅读全文

查询优化(4)

2010-06-24 11:21 by 知行思新, 1449 阅读, 2 推荐, 收藏, 编辑
摘要:继续查询优化(3),还是讨论索引 注意列的顺序 只有在一个查询的条件与索引最左侧的键匹配时,这个索引才是有效的。举例来说,如果一个索引有一个组合键last_name, first_name,当查询的条件为where last_name = ‘Smith’ 或 where last_name = ‘Smith’ and first_name = ‘John’ 时,这个索引对此查询是有效的。但当查... 阅读全文

查询优化(3)

2010-06-15 18:52 by 知行思新, 1661 阅读, 3 推荐, 收藏, 编辑
摘要:我们继续查询优化(2)的讨论,本文将聚焦索引 创建有用的索引 创建合适的索引是获得高性能数据访问的最重要的工作之一。 谨慎选择聚集索引 当进行范围查询或需要根据键值进行排序时,聚集索引显得特别有用。每张表只能有一个聚集索引,其决定了表中数据的顺序。几乎每张表都应该有一个聚集索引。 默认情况下,聚集索引会创建在表的主键列上,但这不一定是最好的选择。主键从逻辑概念上讲是为了保证数据的唯一性,... 阅读全文

查询优化(2)

2010-06-11 22:21 by 知行思新, 2060 阅读, 2 推荐, 收藏, 编辑
摘要:继续查询优化(1)中的讨论,这次我们来看一下统计数据的管理。统计信息管理SQL Server会为索引列和数据列维护统计信息。一般情况下这些统计信息能被自动维护地很好,但在某些情况下我们需要手动来维护这些信息。索引统计信息数据列(非索引列)统计信息当一个查询运行后,SQL Server会自动为出现在查询语句where中的数据列创建统计信息。通过CREATE STATISTICS命令,我们可以手工创建... 阅读全文

查询优化(1)

2010-06-10 09:53 by 知行思新, 5611 阅读, 3 推荐, 收藏, 编辑
摘要:--最近在看Inside Microsoft SQL Server 2005:Query Tuning and Optimization一书。其中有一段内容感觉归纳得不错,纠正了我以前的一些错误概念。 对查询我们可以从以下几个方面来考虑进行优化。 重写查询语句 除了尽量避免太复杂的谓词判断,我们还需要尽可能避免使用outer joins,cross apply,outer apply,corr... 阅读全文

数据库端分页优化

2010-06-02 18:28 by 知行思新, 1093 阅读, 1 推荐, 收藏, 编辑
摘要:--最近看到Paul White写的一篇数据库端分页优化的文章,感觉不错。所以把主要内容意译出来,作为分享。 概要 在SQL Server 2005及以后版本支持ROW_NUMBER函数。ROW_NUMBER函数可以很方便地用于数据库端分页。本文针对使用此函数进行分页的方法,进行优化和讨论。 需求场景 首先,我们假设一个需求场景,需要进行分页的数据集的宽度很大(每行数据的字段多,长度大)。... 阅读全文

数据库设计的阶梯 - (1)数据元素

2010-05-30 22:15 by 知行思新, 1588 阅读, 0 推荐, 收藏, 编辑
摘要:--注:此文为意译在你开始思考数据库的Schema或Table之前,你需要先想一想数据本身。数据的类型,取值的范围。数据库设计的第一步就是数据,但很多程序员没在设计数据上花任何时间,而是先去设计schema。SQL善于操纵解结构化的数据而不是像文本或图片这样的非结构化的数据。RDBMS的一个基本概念是Codd博士所说的信息原则(Information Principle)。这条规则陈述了所有在RD... 阅读全文

Intersect, Except, Union, All and Any(3)

2010-05-24 21:50 by 知行思新, 514 阅读, 0 推荐, 收藏, 编辑
摘要:--注:此文为意译谓词ANY和ALL,我从不需要使用1. ANY以下两个query会返回相同的结果和执行计划为了演示ANY谓词的实际使用场景,我们使用如下代码在AdventureWorks库中创建一张新表Sales.TopSales我们来获得超过Sales.TopSales表中最小TotalDue的SalesOrderHeader记录生成的执行计划如下: 其Subtree Cost:3.47018... 阅读全文

Intersect, Except, Union, All and Any(2)

2010-05-21 15:35 by 知行思新, 437 阅读, 0 推荐, 收藏, 编辑
摘要:--注:此文为意译我们继续Intersect, Except, Union, All and Any(1)中的讨论。这次我们的目标是要得到在英国(TerritoryID=10)且在‘2004-07-01’后有订单的客户ID。我们将使用多种方法来实现INTERSECT,并比较性能。1. 首先,我们可以使用INNER JOIN方法一代码生成的执行计划如下:其Subtree Co... 阅读全文

Intersect, Except, Union, All and Any(1)

2010-05-19 21:40 by 知行思新, 882 阅读, 1 推荐, 收藏, 编辑
摘要:--注:本文为意译,对原文进行了一些改变在我浏览SQL Server 2008的培训课程时,发现了一些我在平日不太使用的SQL谓词:Intersect Except ALL ANY 我们将在AdventureWorks示例库上,试用这些谓词。首先我们来看INTERSECT,EXCEPT,UNION在实验中,我们将使用CustomerID的以下2个集合在sales territory 10(Unit... 阅读全文