摘要:不知道大家有没有看过这篇文章(http://book.csdn.net/bookfiles/738/index.html),有两个地方可能会误导大家,在此说明一下的看法: 关于在程序中使用SqlParameter指定查询参数后会被自动参数化,那我们可以放心拼接SQL吗? 关于在存储过程中使用sp_executesql生成一个缓存计划会始终有效吗? 其实如果使用SqlParameter后发送的SQL...
阅读全文
摘要:在使用索引对数据进行查询时,优化器考虑是执行索引扫描还是索引查找的依据是根据此索引相关的统计信息。但统计的步长不能超过200(DBCC SHOW_STATISTICS返回的第三部分结果),这在数据量很大的表中,使得统计信息的精度变得越来越不准确。当然,这个影响不会很致命,发生的机会也很少。关键是统计信息得不到及时更新的话,就会使优化器选择错误的执行计划了。 如果我们在事件探查器中发现很多的MIS...
阅读全文
摘要:我们发出的SQL语句,如果没有对应的缓存,优化器都会创建一个相应的执行计划。但是,优化器基于成本的优化过程,在面对比较复杂的SQL语句时,不会考虑所有的情况。因此有些时候,就会给出一个近似高效的执行计划。同时,受生产环境负载的影响,可能优化的过程会更不彻底,因此我们就应该控制语句的复杂程度,以减少优化器考虑各种组合的可能性。当系统的性能出现问题时,即便你的索引建的很完美,但有的时候因为选择度的问题...
阅读全文
摘要:在新的SQLSERVER数据库服务器上线之前,我们在格式化硬盘时应该选择分配单元的大小为64K,因为SQLSERVER的扩展分区大小是由8个8K的数据页组成的。把分配单元大小设置为64K,可以减小索引的外部碎片,在前面的文章中已经介绍过http://www.cnblogs.com/tom-fu/archive/2008/07/09/1238568.html。但这对硬盘的配置还是不够彻底。每块磁盘都...
阅读全文
摘要:所谓的ad hoc,中文译作"即席查询"。就是你使用 osql 或 sqlcmd 而不是作为远程过程调用引用作为语言事件提交的 Transact-SQL,通俗点讲就是你从SSMS命令窗口或是程序中拼接后直接发送的SQL语句就都是ad hoc,声明一下这不包括那些声明参数后,再通过参数执行的SQL语句。 使用ad hoc除了我们都很熟悉的SQL injection,带来额外的网络开销,不能很好的实现...
阅读全文
摘要:关于数据库中分页的过程,网上大把。有通用的分页存储过程,高效的分页存储过程。但是,这些并没有从根本上解决性能问题。我们知道对于相同的查询,如果你限制每页返回10条记录和每页返回20条记录比,虽然10条记录在网络和返回结果时会比20条记录要稍稍占一点优势。但是它要花比20条记录时2倍的访问次数,因此从总的资源消耗来看10条记录会占用更多的资源。但是用户的操作你永远是无法预测的,它可能只是看了第1页然...
阅读全文
摘要:数据文件的碎片 影响磁盘读取性能的两个主要因素:录道时间和轮询延迟。 我们在查询数据时,有两种磁盘的读取方式:顺序读和随机读。随机读发生在对表或索引的扫描时,顺序读发生在使用索引查找数据时。当数据文件有大量碎片时,随机读不会受到太大的影响,因为SQLSERVER会根据表所占用到的数据页面,不管记录的逻辑顺序随机的读取出来,所谓的预读正是这种方式。而顺序读时,因为要按记录的逻辑顺序读取相应的记录,如...
阅读全文
摘要:通常,我们很容易观察到数据库服务器的内存和CPU压力。但是对I/O压力没有直观的判断方法。磁盘有两个重要的参数: Seek time、 Rotational latency。正常的I/O计数为:①1000/(Seek time+Rotational latency)*0.75,在此范围内属正常。当达到85%的I/O计数以上时则基本认为已经存在I/O瓶劲。理论情况下,磁盘的随机读计数为125、顺序读...
阅读全文
摘要:上次没有具体说明,宽宽一直在追问这个问题,现在补充如下:如果你是使用的SQL2000,这个问题会更加严重。触发器操作要作为外部事务的一部分,因此instered和deleted两个虚拟表都是写到事务日志中的。因为日志是顺序写入的,所以在把新旧记录写入日志时,会阻止其它事务写入。同时,读取日志时也会因为有其它写入时而被阻塞。这个无疑给并发操作带来很大影响。SQLSERVER在内部会把触发器作为一个存...
阅读全文
摘要:这要从ODS(Open Data Service)"开放数据服务"说起。它的主要职责是管理连接;SQL的线程服务和将结果集、状态值及消息发送给客户。结果集使用TDS(Tabular data stream)表格数据流进行传送,它除了包含所需要的数据之外,还有一些描述信息:如列名、类型、通信的令牌等等。因此,这也是为什么我觉得在存储过程中只返回一行记录时,使用输出参数能减少网络字节数的原因,因为它少...
阅读全文
摘要:上图显示了一个SQL命令的执行过程,为了能使每个语句能高效的执行,我们应该尽量在关系层来完成所有的操作。举个很简单的例子:SELECT TOP 10 P.Name,P.Color,PSC.Name AS SubcategoryName,PC.Name AS CategoryName,D.DocumentSummary, PP.LargePhoto,SUM(LineTotal) LineTotal ...
阅读全文
摘要:因为上周准备不够充分。关于过程的优化,还有一点想补充一下,上次的PPT中没有加上这一部分,如有异议请指正。 /*这是对临时表定义时的一段话: Once its creating level gets out of scope (terminates), a temporary table is automatically destroyed. If a temporary table was...
阅读全文
摘要:系统响应缓慢,我们通常打开事件探察器进行跟踪。这真是火上加油啊! SQLServer2005下有170个事件及65个属性列,用于跟踪数据库的使用情况。在使用事件探察器时,因为要在内存中保存结果和占用处理器资源以产生这些跟踪事件。因此,我们在以生产服务器做跟踪时,一定要最低限度的产生这些跟踪事件。以防止对服务器产生过大的资源占用。有人会说如果我在另一台机器进行跟踪不就得了,因为要传递这些事件的消息...
阅读全文
摘要:USE AdventureWorks; GO --主键只用来保证数据,而聚集索引影响数据的逻辑排序 --下面的语句执行计划中并没有看到排序操作,证明数据是按SalesOrderID排过序的,而且是一种双向链表 SELECT TOP(10) * FROM Sales.SalesOrderHeader ORDER BY SalesOrderID SELECT TOP(10) * FROM Sales....
阅读全文
摘要:今天在查看一些过程,发现了点问题,和大家一起讨论一下: --================================================================ 一、如何有效利用索引,查询顾客编号>的所有订单信息 --================================================================ --代替非聚焦索引扫...
阅读全文