请问SQLSERVER在处理一个查询的时候,需要读取数据页、索引页之外,还需要读取什么页?
应该需要读取IAM页,PFS页需要读取吗?
有什么办法可以知道 设置 set statistics io on 后,显示的逻辑读取都包括什么页呢?
请知道的帮忙解决一下,多谢!!!

解决方案 »

  1.   

       SET STATISTICS IO的效果   SET STATISTICS IO的输出信息显示在输出的结束处,下面是它显示的一个例子:    Table 'Order Details'. Scan count 1, logical reads 10, physical reads 1, read-ahead reads 9.  这些信息中的一部分是十分有用的,另一部分则不然,我们来看看每个部分并了解其含意:  Scan Count:在查询中涉及到的表被访问的次数。在我们的例子中,其中的表只被访问了1次,由于查询中不包括连接命令,这一信息并不是十分有用,但如果查询中包含有一个或多个连接,则这一信息是十分有用的。  一个循环外部的表的Scan Count值为1,但对于一个循环内的表而言,其值为循环的次数。可以想象得到,对于一个循环内的表而言,其Scan Count值越小,它所使用的资源越少,查询的性能也就越高。因此在调节一个带连接的查询的性能时,需要关注Scan Count的值,在进行调节时,注意观察它是增加还是减少了。  Logical Reads: 这是SET STATISTICS IO或SET STATISTICS TIME命令提供的最有用的数据。我们知道,SQL Server在可以对任何数据进行操作前,必须首先把数据读取到其数据缓冲区中。此外,我们也知道SQL Server何时会从数据缓冲区中读取数据,并把数据读取到大小为8K字节的页中。   那么Logical Reads的意义是什么呢?Logical Reads是指SQL Server为得到查询中的结果而必须从数据缓冲区读取的页数。在执行查询时,SQL Server不会读取比实际需求多或少的数据,因此,当在相同的数据集上执行同一个查询,得到的Logical Reads的数字总是相同的。  为什么说在调节查询性能中知道SQL Server执行查询时的Logical Reads值是很重要的呢?因为在每次执行同一查询时,这个数值是不会变化的。因此,在进行查询性能的调节时,这是一个可以用来衡量你的调节措施是否成功的一个很好的标准。  在对查询的性能进行调节时,如果Logical Reads值下降,就表明查询使用的服务器资源减少,查询的性能有所提高。如果Logical Reads值增加,则表示调节措施降低了查询的性能。在其他条件不变的情况下,一个查询使用的逻辑读越少,其效率就越高,查询的速度就越快。  Physical Reads:在这里我要说的的东西可能初听起来有点自相矛盾,但只要反复思考,就会明白其中的真正含意。  物理读指的是,在执行真正的查询操作前,SQL Server必须从磁盘上向数据缓冲区中读取它所需要的数据。在SQL Server开始执行查询前,它要作的第一件事就是检查它所需要的数据是否在数据缓冲区中,如果在,就从中读取,如果不在,SQL Server必须首先将它需要的数据从磁盘上读到数据缓冲区中。  我们可以想象得到,SQL Server在执行物理读时比执行逻辑读需要更多的服务器资源。因此,在理想情况下,我们应当尽量避免物理读操作。  下面的这一部分听起来让人容易感到糊涂了。在对查询的性能进行调节时,可以忽略物理读而只专注于逻辑读。你一定会纳闷儿,刚才不是还说物理读比逻辑读需要更多的服务器资源吗?  情况确实是这样,SQL Server在执行查询时所需要的物理读次数不可能通过性能调节而减少的。减少物理读的次数是DBA的一项重要工作,但它涉及到整个服务器性能的调节,而不仅仅是查询性能的调节。在进行查询性能调节时,我们不能控制数据缓冲区的大小或服务器的忙碌程度以及完成查询所需要的数据是在数据缓冲区中还是在磁盘上,唯一我们能够控制的数据是得到查询结果所需要执行的逻辑读的次数。  因此,在查询性能的调节中,我们可以心安理得地不理会SET STATISTICS IO命令提供的Physical Read的值。(减少物理读次数、加快SQL Server运行速度的一种方式是确保服务器的物理内存足够多。)  Read-Ahead Reads:与Physical Reads一样,这个值在查询性能调节中也没有什么用户。Read-Ahead Reads表示SQL Server在执行预读机制时读取的物理页。为了优化其性能,SQL Server在认为它需要数据之前预先读取一部分数据,根据SQL Server对数据需求预测的准确程度,预读的数据页可能有用,也可能没用。  在本例中,Read-Ahead Reads的值为9,Physical Read的值为1,而Logical Reads的值为10,它们之间存在着简单的相加关系。那么我在服务器上执行查询时的过程是怎么样的呢?首先,SQL Server会开始检查完成查询所需要的数据是否在数据缓冲区中,它会很快地发现这些数据不在数据缓冲区中,并启动预读机制将它所需要的10个数据页中的前9个读取到数据缓冲区。当SQL Server检查是否所需要的全部数据都已经在数据缓冲区时,会发现已经有9个数据页在数据缓冲区中,还有一个不在,它就会立即再次读取磁盘,将所需要的页读到数据缓冲区。一旦所有的数据都在数据缓冲区后,SQL Server就可以处理查询了。  我们应该怎么办?  我在本篇文章的开始曾提到,在对查询的性能进行调节时用一些科学的标准来测量你的调节措施是否有效是十分重要的。问题是,SQL Servers的负载是动态变化的,使用查询总的运行时间来衡量你正在调节性能的查询的性能是提高了还是没有,并不是一个合理的方法。  更好的方法是比较多个数据,例如逻辑读的次数或者查询所使用的CPU时间。因此在对查询的性能进行调节时,需要首先使用SET STATISTICS IO和SET STATISTICS TIME命令向你提供一些必要的数据,以便确定你对查询性能进行调节的措施是否真正地得到了目的。        总之,利用set statistics IO on 和set statistics time on来达到调节SQL性能,可从三个方面考虑,CPU时间、(内部循环次数)扫描次数和逻辑读取次数.
      

  2.   

    IAM和PFS页应该是预读时读取的吧,逻辑读时读取的应该是那些存数据和索引的页。如果想看到一次读取了哪些页,可以在单机测试环境下先清空缓冲区再运行查询,再看一下缓冲区里有哪些页就行了。
      

  3.   

    1.FPS,GAM,SGAM这些只有在数据修改时才会用到,查询只读取数据页,IAM页,索引页(堆除外)2. set statistics io on 后,显示的逻辑读取都包括什么页?
    看具体读的哪些pageID不知道
    不过可以看看 
    dbcc ind(dbname,tablename,1) or dbcc ind(dbname,tablename,0),0为堆
    dbcc traceon(3604)
    dbcc page(dbname,1,pageid,1) 看具体页面的详细信息
      

  4.   

    SQLSERVER读取数据的时候通过数据字典找到读取的起始页,会根据IAM页导航到索引页,数据页。具体一次查询读取的是那些页,还需要在研究一下,多谢各位了。