本帖最后由 WxmJun 于 2011-09-09 10:43:02 编辑

解决方案 »

  1.   

    数据表结构:CREATE TABLE [iecm_Org] (
    [ID] [varchar] (100)   NOT NULL ,
    [bsid] [varchar] (256)   NULL ,
    CONSTRAINT [PK_IECM_ORG] PRIMARY KEY  CLUSTERED 
    (
    [ID]
    )  ON [PRIMARY] 
    ) ON [PRIMARY]
    GO
    CREATE TABLE [iesk_StockTransfer] (
    [ID] [varchar] (100)   NOT NULL ,
    [orgID] [varchar] (100)   NULL ,
    CONSTRAINT [PK_iesk_StockTransfer] PRIMARY KEY  CLUSTERED 
    (
    [ID]
    )  ON [PRIMARY] 
    ) ON [PRIMARY]
    GO
    CREATE TABLE [iesk_StockTransItem] (
    [ID] [varchar] (100)   NOT NULL ,
    [billID] [varchar] (100) NULL ,
    [inAmt] [numeric](19, 6) NULL , 
    [outAmt] [numeric](19, 6) NULL , 
    CONSTRAINT [PK_iesk_StockTransItem] PRIMARY KEY  CLUSTERED 
    (
    [ID]
    )  ON [PRIMARY] 
    ) ON [PRIMARY]
    GOcreate index orgid1 on iesk_StockTransfer(orgid)
    create index billId on iesk_StockTransItem(billId)
    create index bsid on iecm_org(bsid)
      

  2.   

    SET STATISTICS IO ON 输出
    SQL Server 分析和编译时间: 
       CPU 时间 = 46 毫秒,耗费时间 = 55 毫秒。(所影响的行数为 1482 行)表 'iesk_StockTransItem'。扫描计数 721,逻辑读 6945 次,物理读 0 次,预读 0 次。
    表 'iesk_StockTransfer'。扫描计数 102,逻辑读 319 次,物理读 0 次,预读 0 次。
    表 'iecm_Org'。扫描计数 2,逻辑读 7 次,物理读 0 次,预读 0 次。SQL Server 执行时间: 
       CPU 时间 = 45 毫秒,耗费时间 = 45 毫秒。
    SQL Server 分析和编译时间: 
       CPU 时间 = 63 毫秒,耗费时间 = 63 毫秒。(所影响的行数为 1482 行)表 'iesk_StockTransItem'。扫描计数 1,逻辑读 8937 次,物理读 0 次,预读 0 次。
    表 'iesk_StockTransfer'。扫描计数 102,逻辑读 319 次,物理读 0 次,预读 0 次。
    表 'iecm_Org'。扫描计数 1,逻辑读 4 次,物理读 0 次,预读 0 次。SQL Server 执行时间: 
       CPU 时间 = 234 毫秒,耗费时间 = 235 毫秒。
      

  3.   

    一般是因为第4个表具有很好的数据过滤特性,帮忙把其他3个表的关联结果也筛选掉了,所以变快.SQL Server会自动选择最优的关联顺序的.
      

  4.   

    B语句中o.bsid like '00001000180000200042%' 的bsid也是有用索引的按我的理解,B语句比A语句少了一个查询,理论是比A语快才对!本来这两语句是写得很复杂的,我优化成两个基本等价的了。
    A语句的(select bsid from iecm_org where id='14b284c-4808b795ef79b-8f337c973339dd7093883bd28ddb6588')
    完全可以用'00001000180000200042%' 代替的
      

  5.   

    select bsid from iecm_org where id='14b284c-4808b795ef79b-8f337c973339dd7093883bd28ddb6588'大数据量的时候先过滤以后再匹配比后面再过滤的效率高楼主可以去看看执行计划
    你也可以试试用少量数据 少量数据优化器会执行相同的查询计划
      

  6.   

    发现B语句慢的问题了
    两语句中有 m.id = s.billId
    A语句能用到billId索引,B语句没有用到索引 所以B语句慢在这里!但为什么B语句没用用到索引呢??
      

  7.   


    不是查询范围问题,而是服务器优化后就不用索引进行查询。应该是数据量的原因。
    我用上面的语句创建了三个空表,服务器就用billId索引,而数据量有19万时,却不用索引? 求解?
      

  8.   


    先传到CSDN空间  再引用地址