??xml version="1.0" encoding="utf-8" standalone="yes"?>狠狠色综合网,在线黄色国产视频,久久精品一偷一偷国产http://www.aygfsteel.com/Archangelsy/articles/136060.htmlarchangelarchangelSat, 11 Aug 2007 10:57:00 GMThttp://www.aygfsteel.com/Archangelsy/articles/136060.htmlhttp://www.aygfsteel.com/Archangelsy/comments/136060.htmlhttp://www.aygfsteel.com/Archangelsy/articles/136060.html#Feedback0http://www.aygfsteel.com/Archangelsy/comments/commentRss/136060.htmlhttp://www.aygfsteel.com/Archangelsy/services/trackbacks/136060.html阅读全文

archangel 2007-08-11 18:57 发表评论
]]>
VC中ؓ普通程序添加ODBC应用http://www.aygfsteel.com/Archangelsy/articles/135659.htmlarchangelarchangelThu, 09 Aug 2007 15:17:00 GMThttp://www.aygfsteel.com/Archangelsy/articles/135659.htmlhttp://www.aygfsteel.com/Archangelsy/comments/135659.htmlhttp://www.aygfsteel.com/Archangelsy/articles/135659.html#Feedback0http://www.aygfsteel.com/Archangelsy/comments/commentRss/135659.htmlhttp://www.aygfsteel.com/Archangelsy/services/trackbacks/135659.html
  关键字:VC++ 、ODBC、数据库

  一?引言

  数据库属于最行的应用程序之一Q几乎每个商业部门都使用数据库来记录、管理各U各L数据。在VC下我们可以在创徏工程旉择数据库支持,q定数据源和相关的表Qƈ选择CRecordView作ؓ我们q个E序的基c,q样做可以毫不费力的应用程序和数据库徏立了兌Q而几乎不用编什么代码,但这样做的前提是在新建工E时已明知道用到哪个数据库Qƈ且有相关的数据库。事实上我们往往有许多已做好的应用程序和c,其功能除了未和数据源建立兌外以基本满要求Q我们只要在其基上添加ODBC接口Q之与数据库徏立关联即可,q样做避免了与数据库无关部分代码的重新编写所造成的重复性操作,大大提高了代码的重用性和利用率。所以在普通程序上通过dODBC应用而与数据库徏立关联的Ҏ是完全行之有效的?br />
  二?ODBC技?br />
  ODBCQOpen Database Conectivity 开攑ּ数据库互联)技术,作ؓMicrosoft公司Ҏ据库q行讉K的标准应用程序接?API)和Windows开攑ּ服务体系l构OSA的一个重要组成部分已qؓ众多的WindowsE序员所熟悉、认可。ODBC的工作依赖于数据库制造商提供的驱动程序,使用ODBC API的时候,Windows的ODBC理E序Q把数据库访问的h传递给正确的驱动程序,驱动E序再用SQL语句指示DBMS完成数据库访问工作,因此QODBC的存在ؓ我们开发应用数据库E序提供了非常强大的能力和灵zL?

  三?E序CZ

  (一)打开Visual C++Q在"File"菜单上点?New?Q然后在弹出?New"对话框中选定"MFC AppWizard(exe)"cȝ目Q?Project name"为NormalQ按下OK键,下一Step 1屏幕中?Single document"单文档支持,用到后面的选项除在最后一步选择"CFormView"作ؓ本工E视cȝ基类外均为确省|此时卛_按下Finish键,l果pȝ生成一个新的项目Normal?br />
  我们将此工E当做原有的工程Q接下来我们便在此工E基上对其添加ODBC应用Q该工E能同数据源建立兌Q能Ҏ据库中的数据q行操作和管理?br />
  (?打开"控制面板"上的"ODBC (32bits)"Q对数据源进行注册。ؓ了ODBC能与数据库一起工作,必L数据库注册到ODBC驱动E序理器,q项工作可以通过定义一个DSN或数据源名字来完成。在弹出?ODBC数据源管理器"中选择"User DSN"属性页Q点?Add?按钮。选择"Microsoft Access Driver(*.mdb)"作ؓ数据源的驱动器,点击"完成"按钮。在弹出?ODBC Microsoft Access 97 Setup"对话框中?Data Source Name:"栏添入RP97,"Description:"栏只h释说明的作用Q可以不填,然后点击"Select?按钮Q选择所要注册的数据源,然后点击"OK"完成了Ҏ据源的注册,到这一步,本机上的LE序只要通过ODBC接口和数据源?RP97"p完成Ҏ据库的访问了?br />
  (?在VC?Workspace"zdH口中选择"FileView"属性页Q打开标准框架头文?StdAfx.h",q在最后一?include后面d?afxdb.h"的引用:#include

  (? ?Workspace"zdH口中选择"ClassView"属性页Q在"Normal Classes"上右键,?New Class?,在弹出的"New Class"对话框的"Base Class"栏选择"CRecordSet"做ؓ新添加的cȝ基类Q在"Name"栏填写类?CODBCSet",点击"OK"Q在随后弹出的对话框?ODBC"栏选择刚注册的"RP97"数据源,点击"OK"后选择该数据库的一个表Q点?OK"?ClassView"里就多了一个以CRecordSet为基cȝ新类"CODBCSet"。下面三个函数完成了数据库各U元素的l定工作Q?br />
CString CODBCSet::GetDefaultConnect()
{
 return _T("ODBC;DSN=RP97");
}

CString CODBCSet::GetDefaultSQL()
{
 return _T("[单据表]");
}

void CODBCSet::DoFieldExchange(CFieldExchange* pFX)
{
 //{{AFX_FIELD_MAP(CODBCSet)
 pFX->SetFieldType(CFieldExchange::outputColumn);
 RFX_Text(pFX, _T("[单据ID]"), m_column1);
 RFX_Text(pFX, _T("[单据名称]"), m_column2);
 RFX_Text(pFX, _T("[报帐人]"), m_column3);
 //}}AFX_FIELD_MAP
}

  (?按同LҎ再添加一个基?generic CWnd"的新c?CConnectDB"。在该类的源文g里添加对"ODBCSet.h"的引用:#include "ODBCSet.h"。在该类的头文g?class CconnectDB"前添加class CODBCSetQƈ在该c里d公有型成员变量和函数Q?br />
CDatabase m_dbData;
CODBCSet* m_pSet;
void CConnectDB::Initial()
{
 //打开数据源RP97
 CString os=_T("odbc; dsn=RP97");
 m_dbData.Open(NULL,FALSE,FALSE,0);
 m_pSet=new CODBCSet(&m_dbData);
 //通过SQLl构化查询语a打开RP97里的单据?br /> CString sql="SELECT * FROM 单据?;
 m_pSet->Open(AFX_DB_USE_DEFAULT_TYPE,sql);
}


  (?在Form上添加一?试"按钮及其响应函数OnTest()Q?br />
void CNormalView::OnTest()
{
 CConnectDB connectDB;
 //执行完Initial()后m_pSet指针才不为空Q方可安全用?br /> connectDB.Initial();
 if(connectDB.m_pSet==NULL)
  return;
 connectDB.m_pSet->MoveFirst();
 CString str=connectDB.m_pSet->m_column3;
 AfxMessageBox(str);
}

  最后在该文件开始处d两个引用Q?br />
#include "ConnectDB.h"
#include "ODBCSet.h"

  四?q行与测?br />
  ~译q行E序Q点?试"按钮Q就会将"RP97"数据库的"单据?的第一条记录的"报帐?字段所在的内容通过对话框弹出来?br />
  结Q?br />
  本程序的关键在于Ҏ据库指针m_pSet的获取,当类CConnectDB 的成员函数Initial()被执行完Ӟm_pSet已被获取到了,而在此之前该指针是空的,是不能用的Q所以在实际应用中必M证在使用m_pSet之前调用q函数Initial()。当m_pSet被获取到之后Q就可以惛_他ODBC应用E序一样用CrecordSetc里的各U函数对数据库进行各U需要的操作和管理了?img src ="http://www.aygfsteel.com/Archangelsy/aggbug/135659.html" width = "1" height = "1" />

archangel 2007-08-09 23:17 发表评论
]]>
Oracle9i 转化时区http://www.aygfsteel.com/Archangelsy/articles/113173.htmlarchangelarchangelTue, 24 Apr 2007 06:26:00 GMThttp://www.aygfsteel.com/Archangelsy/articles/113173.htmlhttp://www.aygfsteel.com/Archangelsy/comments/113173.htmlhttp://www.aygfsteel.com/Archangelsy/articles/113173.html#Feedback0http://www.aygfsteel.com/Archangelsy/comments/commentRss/113173.htmlhttp://www.aygfsteel.com/Archangelsy/services/trackbacks/113173.html在Oracle9i之前Q虽然有一个NEW_TIME函数可以改变DATE的时间戳部分Q但是还没有专门用来存储时区信息的数据类型。在Oracle9i中,我们可以使用DBTIMEZONE伪字D|询数据库的时区,使用SESSIONTIMEZONE伪字D|询会话的时区?

但是Q对于大多数数据库,q些值都?07:00之类的偏Ud|因此对于NEW_TIME函数是没有用的。Oracle9i有关NEW_TIME的文档徏议用FROM_TZ来替代,但是q可能会产生误导。FROM_TZ只将一个时区应用到一个时间戳上;它ƈ不能把一个时{换成另外一个时区?

其实有一个比较好的方法(从文档中得到q个Ҏ可能有点难)。首先,Z完成q个工作Q在正确的时区内需要一个TIMESTAMP WITH ZONE数据cd。然后,如果你将关键字AT TIME ZONE应用到那个|它就会自动地调整为新的时区和日期?

 

  

  select (timestamp '2003-04-06 01:59:59' at time zone 'PDT') 

    at time zone 'GMT'

  from dual;

  

  06-APR-03 08.59.59.00000000 AM GMT
  

q个语句ؓ太^z白天时_卛_切换到PST之前的时刻)构造一个TIMESTAMP WITH TIME ZONE然后再将其{换到GMT。AT TIME ZONE关键字也接受默认的偏UdD法:

 

  

  select (timestamp '2003-04-06 02:00:00' 

    at time zone '-07:00') at time zone

  '00:00' from dual;

  

  06-APR-03 09.00.00.000000000 AM +00:00

 
 

你还可以使用伪字D|自动调整当前会话的时区:

 

  

  selectcurrent_timestamp at time zone dbtimezone from dual;
  

上面的表辑ּq回一个当前会话的本地旉Q数据类型ؓ时区Q,重新调整数据库的时区Q调整后的时区将与SYSTIMESTAMP的结果相{?

有了以上的这些信息,可以构造一个比较好的NEW_TIME函数Q?

 

  

  create or replace function my_new_time

  (

    p_dwtz timestamp with time zone,

    p_tz varchar2

  ) return date

  is

  begin

    return cast(p_dwtz at time zone p_tz as date);

  end my_new_time;

  /

  show errors;

  

  select my_new_time(sysdate,'+08:00') from dual;
  

即ɽW一个参数被标记Z个timestamp with time zoneQ你依然可以传入一个TIMESTAMP和DATEQ这L于Oracle的自动{型操作,得到的时间将是会话在本地时区的当前时间。这个函数接受包括偏Ud在内的M可以被TIMESTAMP识别的时区,然后接受的时区调整为正的倹{?/p>



archangel 2007-04-24 14:26 发表评论
]]>
selectq回记录的顺序(转)http://www.aygfsteel.com/Archangelsy/articles/110450.htmlarchangelarchangelFri, 13 Apr 2007 06:45:00 GMThttp://www.aygfsteel.com/Archangelsy/articles/110450.htmlhttp://www.aygfsteel.com/Archangelsy/comments/110450.htmlhttp://www.aygfsteel.com/Archangelsy/articles/110450.html#Feedback0http://www.aygfsteel.com/Archangelsy/comments/commentRss/110450.htmlhttp://www.aygfsteel.com/Archangelsy/services/trackbacks/110450.html关键词:selectQ顺序,优化Q备份,扫描Q烦?
文章摘要Q?
   当我们执行了select语句Qselectq回的记录的序Ҏ们编E方式有较大影响Q对数据库记录备份清除以及sql性能优化都有很大的关pR因此有必要明确selectq回记录的顺序。本文按数据库分c讨论oracle/sybase/sql serverq回记录的顺序,从原理探讨三U数据库各自的特点,q着重探讨了q些差异Ҏ据查询及记录备䆾的媄响?
~略语:
IAMQindex allocation map
PFSQpage free space
1.?
       当我们执行了select语句Qselectq回的记录的序Ҏ们编E方式有较大影响Q对数据库记录备份清除以及sql性能优化都有很大的关pR因此有必要明确selectq回记录的顺序?
selectq回记录的顺序与数据库类型有很大关系Q因此以下按数据库类型分别讨论。本文主要讨Zoracle/sybase/sql serverq回记录的顺序,从原理探讨三U数据库各自的特点,q着重探讨了q些差异Ҏ据查询及记录备䆾的媄响?
2. oracle
以下假设数据库查询优化方式均为基于rule的方式,ORACLE 采用两种讉K表中记录的方式:
  a. 全表扫描 (Full Table Scan)
  全表扫描是序地访问表中每条记? ORACLE采用一ơ读入多个数据块(database block)的方式优化全表扫描?
  b. 通过ROWID讉K?
你可以采用基于ROWID的访问方式情况,提高讉K表的效率QROWID包含了表中记录的物理位置信息。ORACLE采用索引(INDEX)实现了数据和存放数据的物理位|?ROWID)之间的联pR通常索引提供了快速访问ROWID的方法,因此那些Z索引列的查询可以得到性能上的提高。通常表现为按索引扫描?Index Scan)
2.1全表扫描
如果select语句不能使用索引Q则Oracle按全表扫描方式读取数据块Q对于返回的l果集,oracle按rowid的大顺序来q回记录。因?nbsp;select * from mytable ?nbsp;select * from mytable order by rowid效果是一L
       可以通过select rowid from table得到rowid伪列Q数据类型ؓROWIDcd。用查询语句返回的是ROWID的扩展格式(Extended RowidQ。扩展格式的ROWID?8个字W组成。这18个字W可以按照OOOOOO.FFF.BBBBBB.SSS的格式分?l。分别代表数据对象编PData Object NumberQ?数据文g~号QDatafile NumberQ,数据块编PData Block NumberQ?记录或记录片断的块内行号?
       必须说明的是Qƈ不是后插入记录的rowidp大,有可能后插入的记录rowidq要。下面给Z个论点加以证明:
1Q后插入的记录块内行号可能大Q也可能?
Ҏ我们的试验,假设现在表中有三条记录假设文件号相同Q按块号Q行h列如下:
108 0
108 1
108 2
删除中间一条记录后Q得?
108 0
108 2
再增加一条记录,可能会得?
108 0
108 1  <---新增加的记录
108 2
也可能是
108 0
108 2
108 3  <---新增加的记录
两种情况均有可能出现Q取决于oracle块内的分配算法。关于该情况的更深入的分析可以参见文??
2Q后插入的记录的块号有可能大Q有可能?
       插入记录的块号ƈ不是U性增加的Q而是受FreeList控制。有关FreeList的理论和法可以参见文献1?
       
因此对于全表扫描可以得出以下l论Q?
1.         在oracle?nbsp;select * from mytable不能保证q回的记录顺序是按插入的先后序Q而是按rowid序?
rowid的顺序与记录行存储的“物理?#8221;一致。在没有索引情况下,select作全表扫描,是按“物理?#8221;Q此时select q回记录?#8220;物理?#8221;最快?
2.         对于已经插入的记录其ROWID不会发生变化?
如果全表扫描方式下,直接使用rownum作ؓ选择条gQ根据结?Q两ơ得到的记录可能是不一L。如果sql有时间条件或其他条g作ؓsql语句辅助的筛选(排出当前插入的|Q那么再用rownum作ؓ选择条gQ则q回的记录及记录的顺序均是一L?
l论2的特性可用于某些日志表的清除-备䆾机制中。对于某些日志表Z提高insert性能Q可能没有烦引,q且在存储过E中对这些日志表q行清除和备份。利用insert into select 先将部分记录选入到备份表中,再用delete语句删除日志表中的记录。通过rownum来控制操作的行数Q避免回滚段问题Q通过旉条g来实施结?Q保证记录一致?
2.2按烦引扫?
对于一D范围的按烦引选择Q在oracle内部表现为烦引叶节点的扫描,索引叶节炚w常已经排序q且叶节点之间存在指针,便于扫描。由于此时select按烦引扫描表Q因此返回的记录按“索引?#8221;排列?
利用上述特征Q对于按索引扫描可以有以下的应用方式Q?
1Q通过索引可以使返回记录事先排序?
在oracle中用烦引就可以使返回的记录得到排序Q而无需再用order by。对于不同的排序方式可以用不同的索引完成Q通过hint/*+*/指示可以控制索引按不同的扫描方式工作Q从而达C同的效果。如/*+INDEX(TABLE INDEX_NAME)*/?*+INDEX_DESC(TABLE INDEX_NAME)*/指示按烦引升序扫描或按烦引降序扫描,从而实现返回的记录按字D늚升序排列或按字段的降序排列?
例如对于表T(a int,b int)在a上有索引index_aQb上有索引b
则select * from t得到的记?
 
AB
1943
211
310
58
112

select /*+INDEX(T INDEX_A)*/* from t where a>0 或?
select * from t where a>0 order by a
AB
310
58
112
1943
211

从执行计划来看,按烦引扫描和按烦引ROWID方式讉K?
select /*+INDEX_DESC(T INDEX_B)*/* from t where b>0 或?
select * from t where b>0 order by b
AB
211
112
58
310
1943
从执行计划来看,按烦引扫描和按烦引ROWID方式讉K?
2Q通过以时间、流水号{字Dؓ索引字段Q可以记录实现按插入的序q回
       同样利用上述Ҏ,来说?.1中的备䆾问题。当日志表有索引Ӟ选择限定扫描范围的烦引字D,使之保证后插入的记录是在l果集后面的Q如旉或流水号{,该顺序就保证了按rownum控制行数时insert和delete操作的记录是完全一致的Q同时基于烦引的扫描保证了sql的性能?
3.sybase
不管你的select 语句中是否在where后面使用了烦引,sybase均可能基于代价对索引的用进行调整。即使没有where语句也有可能使用索引Q即使有where语句也有可能不用索引。当Ӟ如果表本w就没有创徏M索引p定不会用到索引?
3.1没有索引的表
       没有索引的表在称为堆表。堆表在sysindexes表中有一条对应的记录Q其indid=0。first字段表示堆表的首,root表示堆表的尾c堆表中所有的数据Ş成从sysindex.first <-> sysindex.root的双向链表?
       对于插入记录Q插入到堆表中的所有数据会加到该表的尾部。sybase 利用sysindex表的indidQ?0Q和root|扑և该表的最后一个数据页。如果在该页上有I间Q在数据的尾部插入新的记录行。如果最后一上没有可获得的I间Ӟ如果在该扩展单元的下一|可获得的I间Q这是用它;如果最后一已l是扩展单元的最后一,则开始用一个新的扩展单元,对于新加入的|L会链到链表的NQ同时更新sysindex.root的倹{?
       对于记录删除Q当删除一条记录时Q页内紧随被删除记录后的记录向该前部移动,所有未使用的空间相d保留在页的底部。当一中所有行均被删除Q这一就会脱该堆表的数据链?
    对于更新Q堆表按下面的原则: 
        如果行的长度没有变化,在原来的行上直接更斎ͼq且没有内数据的移动?nbsp;
        如果行的长度变化Qƈ且页的空闲空间够。行q是在页上的相同位置Q但是其它行上UL下移以保持页内行的连l?nbsp;
        如果该页不能容纳行。在Allpages-locked堆表中,行会被删除,q且“?#8221;行插入到最后页。Data-only-lockedthe 堆表中,行插入到另外的页中,在原来的位置采用转向指针指到该页面,q样保证行的ID位置不变?
对于扫描Q按sysindex.first <-> sysindex.root链表方式d数据c?
对于堆表Q根据上q插入、删除、更新、扫描特性,可以得到下面的结论:
1Q对于不带Q何烦引的堆表Q如果确保不使用updateQ或保update不生插入操作,可以放心的使用select 完成自然排序Q此时记录按插入的先后顺序返回?

3.2有烦引的?
对于sybase执行计划没有带烦引的?selectq回记录的顺序和堆表扫描q回的顺序相同?
对于sybase执行计划带烦引的表,select  按烦引字D늚序q回记录。sybase烦引组lؓ B 树。烦引内的每一包含一个页首,首后面跟着索引行。每个烦引行都包含一个键g及一个指向较低|数据行的指针。烦引的每个늧为烦引节炏VB 树的端节点UCؓ根节炏V烦引的底层节点UCؓ叶节炏V每U烦引中的页链接在双向链接列表中?
       对于有烦引的表,得到以下l论Q?
1Q以通过控制索引来控制查询方式,从而控制返回顺序?
       如我们可以通过(index index_name)来指定对某个索引的用,从而达到按索引index_name排序。也可以使用(index 0)指示强制不用烦引,从而ɘq回的记录顺序按堆表方式?
2Q如何没有强制指定烦引,不管你的select 语句中是否在where后面使用了烦引,sybase均可能基于代价对索引的用进行调整。由于sybaseZ代h执行计划会对索引的用进行调_因此不能像oracle那样利用非聚烦引完成返回记录的自然排序Q这时最好加上order by以保证排序的准确?
3Q如果需要排序的字段是聚烦引,那么可以放心用该索引完成排序。这Ӟ不论执行计划怎样Qsybase均按聚簇索引字段序q回记录。对于聚烦引表Q在插入数据Ӟ会引起页内部分记录(值大的记录)的移动,通过Udsybase保证了数据的物理序与聚烦引顺序一致?
4.Ms Sql Server
       不管你的select 语句中是否在where后面使用了烦引,Sql Server均可能基于代价对索引的用进行调整。即使没有where语句也有可能使用索引Q即使有where语句也有可能不用索引。当Ӟ如果表本w就没有创徏M索引p定不会用到索引?
4.1没有索引的表
没有索引的表在称为堆表或堆集。堆集?nbsp;IAM理扩展盘区Q多个IAM形成IAM链。堆集在 sysindexes 内有一行,?nbsp;indid = 0。sysindexes.FirstIAM 列指?nbsp;IAM 链?nbsp;IAM 首页QIAM 链理分配l堆集的I间。SQL Server 2000 使用 IAM 在堆集中浏览。堆集内的数据页和行没有M特定的顺序,也不链接在一赗数据页之间唯一的逻辑q接是记录在 IAM 内的连接?
对于插入操作Q当SQL Server 2000 需要插入新行而当前页没有可用I间Ӟ它?nbsp;IAM ?nbsp;PFS |扑օ有够空间容U行的cSQL Server 使用 IAM |扑ֈ配给对象的扩展盘区。对于每个扩展盘区,SQL Server 搜烦 PFS 以查看是否有一具有够的I间容纳q一行?
SQL Server 只有当无法在现有的扩展盘区内快速找C|_I间容纳正插入的行时Q才l对象分配新的扩展盘区。SQL Server 使用按比例分配算法,从文件组内的可用扩展盘区中分配扩展盘区。如果一个文件组有两个文Ӟ其中一个的可用I间是另一个的两倍,那么每从后者分配一,׃前者分配两c这意味着文gl内的每个文件应该有q似的空间用百分比?
对于删除操作Q在堆表中,即删除了记录,该记录所在页不会作页内移动?
对于数据更新QSQL Server可以采用多种方式来进行。更新可能是现场发生的,也可能是以先删除然后插入的方式进行的Q还可以是通过查询处理器或存储引擎来管理更新。但是在堆表中,L采用现场更新方式Q对于更新的内容原来的页不能容纳的情况,sql server 2000采用转向指针处理Q保证了更新后该记录位置的不变?
通过扫描 IAM 可以对堆集q行表扫描或串行读,以找到容U个堆集的늚扩展盘区。因?nbsp;IAM 按扩展盘区在数据文g内存在的序表示它们Q所以这意味着串行堆集扫描一律沿每个文gq行?
Ҏ上述堆表的插入、更新、删除、扫描原则,可以得到以下的结论:
1Q?nbsp;IAM 设|扫描顺序意味着堆集中的行一般不按照插入的顺序返回?
2Q对于已l存在的记录Q记录的位置Q数据库P文gP号Q行P不会变化?
       l论2可应用到备䆾-清除机制中。如果日志表是没有烦引的堆表Q就可以通过旉、流水号{字D|除当前插入的记录Qselect和delete两次操作q回的结果集及顺序完全一_再通过set rowcount来控制每ơ操作的记录条数Q得备?清除操作能够安全q行?
4.2有烦引的?
对于Sql Server 执行计划没有带烦引的?selectq回记录的顺序和堆表扫描q回的顺序相同?
对于Sql Server 执行计划带烦引的表,select   按烦引字D늚序q回记录。SQL Server烦引组lؓ B 树。烦引内的每一包含一个页首,首后面跟着索引行。每个烦引行都包含一个键g及一个指向较低|数据行的指针。烦引的每个늧为烦引节炏VB 树的端节点UCؓ根节炏V烦引的底层节点UCؓ叶节炏V每U烦引中的页链接在双向链接列表中?
对于有烦引的表,得到以下l论Q?
1Q可以通过控制索引来控制查询方式,从而控制返回顺序?
       如我们可以通过with(index(index_name))来指定对某个索引的用,从而达到按索引index_name排序?
2Q如何没有强制指定烦引,不管你的select 语句中是否在where后面使用了烦引,Sql Server均可能基于代价对索引的用进行调_即没有where语句也有可能使用索引Q即使有where语句也有可能不用索引。不你的delete 语句中是否在where后面使用了烦引,Sql Server均可能基于代价对索引的用进行调_即没有where语句也有可能使用索引Q即使有where语句也有可能不用索引。带相同where语句的select ?nbsp;delete 执行计划很可能不一栗?
       因此select ?nbsp;delete 得到的记录顺序很可能不一_如果要选取前n条记?那么得到的记录集管条数一致但内容不一致。尽我们可以通过with(index(index_name))来强制select对烦引的使用Q但delete却不能够强制指定索引Q因为delete涉及对烦引本w的删除?
       q种情况下,如果数据库的性能够好Q要备䆾的数据不多,׃要用set rowcount来控制条数。但如果需要控制一ơ删除的条数Q可以直接在where条g中控制更的范围Q如旉范围控制到小Ӟ一天的数据通过24时的@环来备䆾?
       要么采用DTS作备份?
3Q如果需要排序的字段是聚烦引,那么可以放心用该索引完成排序。这Ӟ不论执行计划怎样Qsql server均按聚簇索引字段序q回记录?/font>



archangel 2007-04-13 14:45 发表评论
]]>
վ֩ģ壺 ߰| | | | ̩| | | ղ| ̩| ͭ| | | | | | ̨| | | ¹| ¯| ƽ| ӳ| | | | | | ʱ| | | ̨| ɽ| ̨| | | ຣʡ| | ̩| ߺ| | |