主要考虑的Servlet版运行方式有Q?/p>
一QServlet在Web容器中的q行机制
1Q?单独一个无状态的Servlet实例q行
即Web容器里的多个U程调用一个Servlet实例的运行方?/p>
2Q?多个Servlet实例
在Web容器中有多个Servlet实例的对象池Qƈ有多个Web容器U程来分别调用执?/p>
二:(x)Servlet q接数据库的方式
1Q?一对一
卛_每个Servlet实例都有直接的数据库q接?/p>
具体方式有:(x)
1> 在Servlet实例的每个处理方法中每次都调用数据库q接Q然后用此连接进行数据库的查询等操作Q最后关闭ƈ释放此连接?/p>
2> 在Servlet实例的初始化操作时就q接一个“长”的数据库连接,直到Servlet实例在destroy时关闭ƈ释放此数据库q接?/p>
因ؓ(f)现在的数据库操作主要是查询,没有Ҏ(gu)据库的增加、修改等操作Q多用户业务查询、Web容器多线E同时对一个Servlet的同一个数据库q接q行操作应该?x)没有数据操作同步等问题?/p>
2Q?使用Web容器的数据源
q里主要是用Web容器的数据源Q数据库q接池?/p>
在理Zq种方式能提供最佳的性能。这是也是测试各UWeb容器产品在数据库q接池上实现的性能情况?/p>
q里主要看Web容器的在各种应用情况下的最优化配置?/p>
Servlet与数据源q接的实现方式:(x)
Servlet直接从Web容器配置中取得数据源?qing)其q接对象Q然后通过此连接对象来操作数据库。对于数据库q接对象的管理由Web容器来管理?/p>
三:(x)要考虑的问题:(x)
1Q?大数据量传输问题
大数据量通过Servlet实例从数据库中取得ƈ整理后,如何有效的传输到客户端IEQƈ且Servlet实例如何有效在Web容器中处理这些大数据量?/p>
2Q?对各UJDBC版本的测?/p>
即不同的数据库用其自己专用的JDBC来连接,在性能上应该要好一些?/p>
q里也可比较Weblogic Server中实现JDBC与各U数据库QMSSQL、OracleQ专用的差别Q从试的结果看出Weblogic Server的技术实例以?qing)是否真正做C(jin)数据库连接等处理的优化了(jin)吗?/p>
3Q?Weblogic Server的优化配|?/p>
3Q? 对象池配|?/p>
包括应用逻辑处理对象的对象池化以?qing)用数据源时的数据库连接对象池在各U具体应用环境下的优化配|?/p>
3Q? U程池配|?/p>
以上两个斚w涉及(qing)到对象池化和串行化处理的{略?/p>
3Q? Weblogic Server 的配|的各种参数的相应情况下的配|?/p>
1> JAVA VM (JAVA 虚拟?参数在各U应用情况下的配|?/p>
2> Weblogic Server 本n的各U参数配|?/p>
鉴于以上的考虑对Servlet版的试规划Z下几U测试用例:(x)
序号 部v包名(*.JAR *.WAR *.EAR {? 数据源配|?Weblogic Server
的配|?预期l果 说明 可能出现的问题和现象
1 ServletQueryForPerConn.war 在每此业务处理时创徏数据库连接,操作完毕后关闭ƈ释放?/p>
通过Web.xml配置文g来配|JDBC的驱动类型和q接?直接部vServletQueryForPerConn.jar部v包?/p>
Web容器中只有一个Serverlet实例?/p>
配置较多的线E数量?/p>
性能差?/p>
在每此业务处理时创徏数据库连接,操作完毕后关闭ƈ释放?/p>
此包中没有设计到U程同步的有关代码?数据库很忙(因ؓ(f)数据库要接收频繁的数据库q接Q?/p>
可能瓉在数据库寚wJ的q接处理?/p>
数据库事务方面:(x)׃是在每次处理时就调用数据库连接ƈ查询Q因此数据库的事务处理应该是单独在一个独立的处理q程中,与ƈ行的其他U程的处理没有关pR?/p>
2 ServletQueryForOnceConn.war Servlet对象只是的初始化时连接与数据库的一个连接,在以后的操作中式中用这个连接?/p>
通过Web.xml配置文g来配|JDBC的驱动类型和q接?直接部vServletQueryForOnceConn.jar包;
Web容器只有一个Servlet实例?/p>
配置较多的线E数量?/p>
性能较差?/p>
Servlet对象只是的初始化时连接与数据库的一个连接,在以后的操作中式中用这个连接?/p>
此包中没有设计到U程同步的有关代码?数据库连接只有一个?/p>
可能瓉在Web容器的多个线E对同一个数据库q接对象的同步等处理Q这些同步处理是Web容器自己理的)(j)?/p>
可能出现查询的数据在多个客户h中打乱(因ؓ(f)同时使用同一个数据库通信通道Q;
q且多个U程Q单独的处理单元Q可能会(x)在同一个处理事务中Q可能各个处理单元会(x)串行操作数据库(q要看数据库的具体实C(jin)Q?/p>
3 ServletQueryForConnPool.war 直接使用Web容器的数据源和数据库q接池?配置数据源及(qing)数据库连接池?/p>
Ҏ(gu)实际情况优化配置数据源和q接池。如可徏立多个连接池{配|?性能好?Servlet实例不管数据库连接,而是直接从Web容器中取得数据库q接。数据库的连接对象有Web容器全权理?/p>
此包中没有设计到U程同步的有关代码?对Web容器的数据库q接池的配置可能要根据具体情况进行有效的调整Q如数据库连接对象个数和W(xu)eb容器配额的线E个数的关系{)(j)。如果配|不?jng)_能是性能瓉在Web容器或者在数据库方?/p>
4 ServletQueryForConnPool.war
Q同试3Q?同测? Web容器的数据源重新配置为数据库产品专用的JDBC驱动器?性能好?试目的是比较各U不同的JDBC数据q接驱动器的性能Q以便得出根据不同的数据库品选择最佳的JDBC驱动器?/p>
只测试数据库产品提供的专用JDBC驱动器?/p>
Q说明:(x)因ؓ(f)试3在理Z性能是最好,因此选用试3。测试方法和试3一Pq样才有可比性。)(j) 同测??/p>
5 servletQueryDS_Cache.war 同测? 同测? 性能一?/p>
使用一变量来缓存查询的数据Q用户以后的分页查询查询操作是直接从此缓存中取得的?/p>
q种方式对Web容器的内存要求高Q效果不是很好,Ҏ(gu)据量查询的效果可能?x)好些?优点Q?/p>
减少的了(jin)Ҏ(gu)据库讉K的次数?/p>
~点Q?/p>
需要较大的内存。对Weblogic容器的内存要求高Q对于有大量用户的查询操作,q且查询的结果集较大Ӟ可能Ҏ(gu)个系l的性能是个很大的瓶颈?/p>
对大量数据的分页处理
问题描述Q?/p>
背景1Q一客户通过IEhWeb服务器查询数据,而查询结果是上千条甚x上万条记录,要求查询l果传送到IE客户端ƈ分页昄?/p>
背景2Q一客户通过IE或者其他方式请求Web服务器查询数据,而查询结果是上千条甚x上万条记录,q要求查询结果把包传送到客户的E-mail中?/p>
问:(x)对于q样的有大量数据的结果集Q在Web服务器端如何有效的处理?
可能涉及(qing)到的问题Q?/p>
1Q?内存占用
大量数据的结果集Q可能要
2Q?传输速度?qing)策?/p>
具体的分处理技?/p>
序号 名称 处理Ҏ(gu) 针对的数据库 例子说明 备注
1 游标查询 直接使用ResultSet来处理。ResultSet是直接在数据库上建立游标Q然后通过ResultSet的行位置定位接口来获得指定行位置的记录?/p>
当用L(fng)一h数据查询Ӟ执行SQL语句查询Q获得的ResultSet对象?qing)其要用的q接对象都保存到其对应的?x)话对象中?/p>
以后的分|询都通过W一ơ执行SQL获得的ResultSet对象定位取得指定行位|的记录?/p>
最后在用户不再q行分页查询时或?x)话关闭Ӟ释放数据库连接和ResultSet对象{数据库讉K资源?/p>
说明Q在用例分页查询的整个会(x)话期_(d)一个用L(fng)分页查询p占用一个数据库q接对象和结果集的游标,q种方式Ҏ(gu)据库的访问资源占用比较大Qƈ且其利用率不是很高?所有的数据库品?优点Q?/p>
减少?jin)数据库q接对象的多ơ分配获取,减少?jin)对数据库的SQL查询执行?/p>
~点Q?/p>
占用数据库访问资源-数据库连接对象,q占用了(jin)数据库上的资源-游标。而这些资源都是十分宝늚有限制的?/p>
l论Q?/p>
q种的数据库查询分页处理方式不是最佳的。一般不适用q种方式?/p>
2 定位行集SQL查询 主要是直接用数据库产品的提供的Ҏ(gu)询的l果集可定位行范围的SQL接口技术?/p>
在用L(fng)分页面查询请求中Q每ơ可取得查询h的行范围的参敎ͼ然后使用q些参数生取得指定行范围的的SQL查询语句Q然后每ơ请求获得一个数据库q接对象q执行SQL查询Q把查询的结果返回给用户Q最后释放说有的数据库访问资源?/p>
说明Q这U方式需要每ơ请求时都要执行数据库的SQL查询语句Q对数据库的讉K资源是用完q即释放,不白白占用数据库讉K资源?对特定(提供?jin)对查询l果集可定位功能的)(j)的数据库产品?/p>
如:(x)Oracle,DB2, PostgreSQL,mySQL{?MS SQL Server 没有提供此技术? ?
1Q?Oracle数据库用关键字Qrowid或rownum
2Q?DB2:
rowid或rownum ()
3Q?PostgreSQL 使用LIMIT ?OFFSET
4Q?MySQL 使用Limit 优点Q?/p>
q种技术是直接使用数据库品自己提供的可对查询l果集定位行范围qo(h)的功能,因此直接利用?jin)数据库的性能Ҏ(gu)分页查询的优化功能?/p>
Ҏ(gu)据库的访问资源(数据库连接对象,数据库游标等Q没有浪费,q些资源的充分重复的利用?/p>
Ҏ(gu)询的l果对Web容器没有什么特别要求?/p>
~点Q?/p>
要执行多ơ数据库SQL查询操作。对每次的分面操作h都要指定相应范围的结果集来执行SQL语句的数据库查询操作Q这Ҏ(gu)据库有一定的影响?/p>
Ҏ(gu)ơ分面查询h要频J的从Web容器中获得数据库讉K资源Q数据库q接对象和数据库游标Q?/p>
要依赖于具体的数据库产品。因为对没有实现没有提供此技术的数据库品不能用此方式?/p>
l论Q?/p>
׃每次Ҏ(gu)据库的SQL查询操作相对而言耗用的数据资源比较少Qƈ且在实际用户的操作中Q有可能用户Ҏ(gu)询的所有结果集只是需要查看其中的部分面?/p>
因此q种方式是最佳的?/p>
3 特别处理的定位行集SQL查询 q种方式是在方式2的基上针对不提供Ҏ(gu)询结果集行范围定位的数据库品?/p>
其在Web容器端的操作逻辑大致和方?相同?/p>
只是先要对要查询的数据库表要有一字段的数据能区别每条不同的数据记录。第一ơ查询时Q获得用来可唯一标识不同记录的字D늚所有结果集Qƈ~存h以备后面的分面查询指定要查询的l果集的行范围?主要是针对不同对查询行集可定位范围获得的数据库品,如MS SQL Server{?假设从AQBQC三个表中选取数据。且A有字DID用来可唯一区别不同的记录?/p>
那么W一ơ查询的时候,?x)查询两?. select A.id from A,B,C where condition.
2. 把A的ID~存到SESSION?3.从Session中。现可按照次序来取得相应面范围的ID来,q构造下一个查询语句:(x)select A.name, B.add from A,B,C where condition && (
A.ID in 本页面范围的 ID )
以后每次页的时候,依次获得对应늚ID只要表中唯一的就可以?jin)。无所谓大,序?q样QSESSSION~存的就只是一列而不是所有列?jin)。当?dng)对于列数不多的,效果q不好?/p>
也可使用存储q程实现Q可参照Q?a taggedby="hylanda">http://expert.csdn.net/Expert/topic
/2365/2365596.xml?temp=.7529261
优点Q?/p>
同方?
~点Q?/p>
同方?Q?/p>
q要在要查询的数据库表中建立一个相应的ID,用来唯一区别每条记录?/p>
l论Q?/p>
同方??/p>
4 ~存一ơSQL查询的结果集 优点Q?/p>
~点Q?/p>
既然我们要缓存结果,那么用户可能会(x)看到q期的数?/p>
说明Q对于实际情늚应用来说Q一般结合实际情况,l合使用方式2Q或方式3Q和方式4。如Q一个应用场景:(x)对公司的产品的查询是l常的,但是产品的种cM是很多,q时可用缓存方式;但是Ҏ(gu)些查询结果集较大Q数据库和W(xu)eb容器之间的网l访问由可能是远E的Q这时候可考虑使方?Q或者方?Q?/p>
试用例代码实现说明
一Q测试用?QServletQueryForConnPool 版本
1Q结构图
2Q代码实现结?/p>
3Q运行时序图
4Q测试运行情况说?/p>
4Q? 数据库连接和数据库游标占用可能比较大
׃数据库的查询?qing)其分页处理是直接用JDBC的,q在分页中是使用RseultSet的查询结果集Q游标Ş式实现的Qƈ且每个客户对应一个会(x)话,每个?x)话对应一个数据库q接和一个结果集Q游标)(j)Q数据库q接和游标是在会(x)话终止时才释攄。因此在多个客户的请求过E中Q可能对数据库的讉K资源Q数据库q接和用于数据操作的游标Q占用比较大?/p>
因此数据库访问及(qing)其数据库的处理可能是个瓶颈?/p>
4Q? 资源没有释放的问?/p>
?x)话对应的数据库q接和游标可能在?x)话l止时没有释放?/p>
Z(jin)更好的体现出使用Web容器数据库连接池的优点,应该合理的设|连接池中连接对象的“非zd时旉”,ơ值和Servlet对象的会(x)话超时时间长度一直?/p>
5Q此试用例操作说明
5Q? 部v的包的位|:(x)
ServletQueryForConnPool.war
5Q? 部v
1Q通过Weblogic 的控制台工具部v此包
2Q相关的参数L(fng)ServletQueryForConnPool.war包中的配|文件web.xml中相应的servlet配置参数
5Q? 试URL
http://ServerQport/WebAppName
卻I(x)
http://Web服务器名Q端?Servlet部v的应用程序名
二:(x)试用例4 ServletQueryForConnPool_cache 版本
1Q结构图
和“一Q测试用?”相?/p>
2Q代码实现结?/p>
3Q运行时?/p>
说明Q用第四种“缓存一ơSQL查询的结果集”的分页面查询技术,即一ơSQL查询Q把从数据库查询出来的结果保存到?x)话中,以后的客户分|询操作都从此~存中取得?/p>
4Q测试运行情况说?/p>
׃使用的是~存l果集的方式Q对Web容器服务器的内存要求比较高,可能在测试过E中QW(xu)eb容器服务器因内存问题而媄(jing)响整个系l的响应性能?/p>
5Q此试用例操作说明
5Q? 部v的包的位|:(x)
ServletQueryForConnPool_cache.war
刚开始用SQL Server的时候,我没有用昄执行计划来对查询q行分析。我曄一直认为我递交的SQL查询都是最优的Q而忽略了(jin)查询性能I竟如何Q从而对“执行计划”重视不够。在我职业初期,我只要能获取数据很开?j),而不去考虑数据是如何返回的Q“执行计划”对我的查询作了(jin)什么工作。我以ؓ(f)SQL Server?x)自己去处理查询的性能问题的。作Z个刚q入IT行业或者刚学到新技术的软g工程师,在编写代码前不太可能有时间去学习(fn)其实必须掌握的知识。也许这是因为IT行业竞争太激烈的~故?
随着旉的流逝,数据库容量慢慢变大了(jin)。终于某天,客户对应用系l的查询性能感到不满意了(jin)。他面带怒容来找我,抱怨由于查询太慢,使得他需要花更多的时间来处理公务。最初,我徏议客户升U其pȝ资源Q例如作Z(f)时解x案,增加盘定w。虽然硬盘h(hun)格现在很便宜?jin),但是客户q是要求我提供一个永久性的解决Ҏ(gu)Q检查和好好调试查询语句Q来替代那种无休止地升资源的(f)时方案。因为客L(fng)满意度对IT行业来说是十分重要的Q因此我不得不考虑他的个h。我{应他一定会(x)(g)查和调整我的代码?
如何入手?
在刚q入IT行业Ӟ我知道SQL Server的基只是。说实话Q向客户承诺(g)查系l的时候,我还没有一点入手的头A。不q我怿我可以通过GOOGL和BOL来获取相应的信息?
我阅M(jin)一些关于SQL Server的书c,BOLQ以?qing)在|上搜烦(ch)的信息。于是我知道?jin)“显C执行计划”的概念。可以在查询理器中该选项的开兌|ؓ(f)ON。“显C执行计划”是一个图形化工具Q可以帮助开发者和DBA分析Q优化查询,从而改善性能?
“显C执行计划”中不同的Q务具有不同的图标。本文中我主要对“Table Scan”、“Index Scan”、“Index Seek”、“Cluster Index Scan”以?qing)“Clustered Index Seek”感兴趣。也许在以后Q可以对别的dq行另外介绍?
旉以F1方程式的速度开始流逝,我觉得该是我全面理解“Table Scan”、“Index Scan”、“Index Seek”、“Clustered Index Scan”、和“Clustered Index Seek”如何工作的时候了(jin)?
我准备开始分析ƈ优化我的查询。在分析之前Q我惛_?jin)一些问题?
我主要关注SQL Server是根据什么来使用“执行计划”分析查询的。在l过一D|间学?fn)后Q我?jin)解了(jin)一些相关知识。这些知识应该对开发和DBA新手有帮助。于是我军_写这文章,׃n我的知识以帮助别人来理解“执行计划”?
如果你喜Ƣ,可以慢慢dQ也可以在SQL Server上,模拟我下面做的实验?
开始入?/p>
Z(jin)解释“显C执行计划”中的“Table Scan”、“Index Scan”、“Index Seek”、“Clustered Index Scan”和“Clustered Index Seek”,先创建新表,q添加一些示例数据进厅R下面是创徏新表的脚本:(x)
Create Table PerformanceIssue |
表创建后需要添加一些数据。用下面的脚本d100,000条记录进厅R脚本执行时间可能比较长Q请耐心(j){待其执行完毕?
Declare @Loop Int |
脚本成功执行后,数据添加进M(jin)?
用下面语句来看一下表的内容:(x)
Select PRID, PRCode, PRDesc |
׃记录较长Q因此这里就不列出查询结果了(jin)?
正如我前面讲刎ͼ我想解释何时?x)有“Table Scan”、“Index Scan”、“Index Seek”、“Clustered Index Scan”和“Clustered Index Seek”。上q哪个会(x)改善性能呢?
当SQL Serverq回数据Ӟ我们想知道SQL Server采取何种扫描机制来协助获取数据。首先看一下“Table Scan”。我们想?jin)解什么时候“Table Scan”会(x)产生?
选择“显C执行计划”或者用热键“Alt + Q”来ȀzZ显C执行计划”,当然也可以用快捷键“Ctrl+K”?
看一下执行下面查询后的“执行计划”结果?
Select PRID, PRCode, PRDesc |
上面的“执行计划”中QSQL Server用到?jin)“Table Scan”。我问自׃ؓ(f)什么会(x)有“Table Scan”,SQL Server是根据什么来使用该方法的。难道是因ؓ(f)我想获取所?00,000条记录吗Q于是我换了(jin)一个角度进行思考,如果来避免查询中出现“Table Scan”呢Q此时我对SQL Server的扫描机制还不是很清楚,那么该如何优化查询呢Q下面的SELECT查询中仅选择两列Q[PRID, PRCode]?
Select PRID, PRCode |
查询执行后,执行计划和第一个查询一栗于是将查询改变为只(g)索一个字D?[PRID]?
Select PRID |
查询执行后,执行计划仍然和第一个查询的相同。对“Estimated row size”属性不需要太大关注。意思我立刻军_只获取一条记录,看看执行计划?x)如何。查询语句如下:(x)
Select PRID, PRCode, PRDesc |
执行完成后,执行计划昄Q?
查询仍然使用?jin)“Table Scan”方法来昄数据?
那么Q我需要想其它办法来避免“Table Scan”。首先我惛_应该l表加上索引。于是我在PRID字段上创建非聚集索引。添加了(jin)索引后是否就能避免“Table Scan”?下面我们开始讨论关于“Index Scan”和“Index Seek”的主题?
Index Scan ?Index Seek
首先在PRID字段上创建非聚集索引?
CREATE UNIQUE NONCLUSTERED INDEX UNC_PRID |
本文假定读者已l知道非聚集索引如何工作的知识。了(jin)解非聚集索引更详l的信息Q请阅读BOL相关主题Q也可参?http://www.sql-server-performance.com/gv_index_data_structures.asp。下面我们详l讲q“Index Scan”是如何工作的?
执行下面语句q查看执行计划的l果?
Select PRID, PRCode, PRDesc |
奇怪了(jin)Q“Table Scan”仍然用C(jin)。ؓ(f)什么SQL Server没有用到那个非聚集烦(ch)引?于是l箋优化查询语句Q选择(g)索两个字D?[PRID, PRCode] ?
Select PRID, PRCode From PerformanceIssue |
执行l果是和上一个查询结果一怸栗于是修Ҏ(gu)询ؓ(f)只检索一个字D?[PRID] ?
Select PRID |
执行计划l果如下Q?
“Index Scan”在查询中被用到?jin),q很好。很自然Q接下来的问题就是“Index Scan”什么时候会(x)被用到。字DPRID上有一个烦(ch)引,查询语句中选中的字Dؓ(f)PRID。执行查询的时候,SQL Server扫描索引,因此用到?jin)“Index Scan”方法。前面的查询中选择?jin)有索引的和没有索引的字D,SQL Server无法使用“Index Scan”。当查询中只选择有烦(ch)引的字段ӞSQL Server׃用了(jin)“Index Scan”。我不清楚SQL Server底层到底是如何判断的Q不q通过q些试验Q我认ؓ(f)当查询中只选择有烦(ch)引的字段ӞSQL Server׃用“Index Scan”方?/strong>?
下面看“Index Seek”方法何时生。当我看到“Seek”这个词ӞW一反应是条g查询q个L?
我尝试三U不同的带WHERE语法的查询语句,以找出那U会(x)用“Index Seek”。第一U语句如下:(x)
Select PRID, PRCode, PRDesc |
l果昄Q执行计划用了(jin)“Table Scan”?
W二U语句如下:(x)
Select PRID, PRCode, PRDesc |
执行计划仍然使用“Table Scan”方法?
W三U查询语句如下:(x)
Select PRID, PRCode, PRDesc |
查询用到?jin)“Index Seek”和“Bookmark Lookup”方法。用到“Index Seek”是因ؓ(f)WHERE后面使用带烦(ch)引的字段PRID来进行过滤。“Bookmark Lookup”方法被用到是因为查询中选择?jin)没有?ch)引的字段。如果去掉这两个没有索引的字D,那么“Bookmark Lookup”方法就可以L。当然如果只q回PRID字段Q那么该查询没什么意义了(jin)Q因为WHERE语句后面已经l出PRID具体取g(jin)?
我认为“Index Seek”在性能改善上比“Index Scan”和“Table Scan”要好,q主要表现在下面几个斚wQ?
当我完成q些试后,我同事问我一个很有意思的问题QSQL Server什么时候用“Clustered Index Scan”和“Clustered Index Seek”?下面对“Clustered Index Scan”和“Clustered Index Seek”进行实验?
我决定在PRCode上徏一个聚集烦(ch)引来试“Clustered Index Scan”和“Clustered Index Seek”?
Clustered Index Scan & Clustered Index Seek
下面的脚本删除PRID字段上的索引Qƈ在PRCode字段上创集烦(ch)引?
Drop Index PerformanceIssue.UNC_PRID |
关于聚集索引的基知识h阅联机帮助的相关主题或?http://www.sql-server-performance.com/gv_index_data_structures.asp。下面我们将重点攑֜“Clustered Index Scan”和“Clustered Index Seek”如何被使用上?
执行下面查询语句Q?
Select PRID, PRCode, PRDesc |
查询执行后,可以看到执行计划中用C(jin)“Clustered Index Scan”?
下面用三U不同的WHERE方式来试验何时SQL Server?x)用到“Clustered Index Seek”。第一UŞ式如下:(x)
Select PRID, PRCode, PRDesc |
查询执行后,可以看到执行计划中用C(jin)“Clustered Index Scan”?
W二UŞ式如下:(x)
Select PRID, PRCode, PRDesc |
查询执行后,发现执行计划中用到的仍然是“Clustered Index Scan”?
W三UŞ式:(x)
Select PRID, PRCode, PRDesc |
q次执行计划用到?jin)“Clustered Index Seek”?
当在WHERE后用到PRCode字段的时候,“Clustered Index Seek”被用到。执行计划对聚集索引表检索的时候,因ؓ(f)在选取的字D中Q包括没有烦(ch)引的字段Q所以不用用到“Bookmark Lookup”方法?
我个为,从改善性能角度考虑Q“Clustered Index Seek”比“Clustered Index Scan”和“Index Seek”要好?
通过q些试验Q我Ҏ(gu)行计划的应用U篏?jin)实际经验。我知道哪种扫描机制可以提高性能Q从而是的客h意?/p>