我有两个数据表,Table1和Table2,Table1记录数的数量级是百万,Table2是千万级。
Table1的字段:
    Id 主键
    Name
    UserId  已建索引Table2的字段:
    Id  主键
    Table1Id  已建索引
    Field1
    Field2
    ......查询语句:
select Table1.Id, Table1.Name, Table2.Id
from Table1
    inner join Table2
        on Table1.Id = Table2.Table1Id
where Table1.UserId = 9999上述查询没有问题,性能不错
但是一旦在在查询语句的返回列中增加了Table2的其它任何字段,性能就变得很差,比如:select Table1.Id, Table1.Name, Table2.Id, Table2.Field1
from Table1
    inner join Table2
        on Table1.Id = Table2.Table1Id
where Table1.UserId = 9999而且无论增加的是什么类型的字段,无论其是否有否索引。
请教这是怎么回事,如何解决?

解决方案 »

  1.   

    出售全能空间 1G/1年 支持 SQL-SERVER 
    详情请查看下面网址:    http://www.aspxwork.com这是一个C#学习网站 有站长在线答疑
    用的是动网新闻。总体感觉还算不错。资料满全的。
    最有特点的是有站长在线答疑。感觉满有特色的。
      

  2.   

    理论情况下,不会因为加字段会影响性能。但数据库运行时会自己调整策略。比如:因为你加了这个字段,Table2.Table1Id
    这个索引就没有用。而直接表扫描了。解决方法:
    1.把没有加字段的语句执行,并查看执行计划。
    2.把加字段的语句执行,并查看执行计划。然后对比两个执行计划,看有什么异同。。一般这样能找出答案并优化。。如果还是没办法的话,
    终极解决方案:到Csdn的数据库板块上贴你的问题,那里高手太多了,应该很容易搞定。
      

  3.   

    如果你这样查询的话
    select Table1.Id, Table1.Name, Table2.Id
    from Table1
    inner join Table2
    on Table1.Id = Table2.Table1Id
    where Table1.UserId = 9999为什么不直接这样呢
    select Table1.Id, Table1.Name, Table2.Id
    from Table1, table2
    where Table1.Id = Table2.Table1Id
    where Table1.UserId = 9999
    用什么join语句。
      

  4.   

    to Knight94(愚翁) ( ) 信誉:110 应该是
    select Table1.Id, Table1.Name, Table2.Id
    from Table1, table2
    where Table1.Id = Table2.Table1Id
    where Table1.UserId = 9999
    and 不是where
      

  5.   

    to cic_wxf(应胡主席要求,我决定改名)汗,多谢!
    -_-||
      

  6.   

    我同时也在数据库板块中发贴了 http://community.csdn.net/Expert/topic/4747/4747442.xml?temp=8.758181E-02用where替代join没有什么改进,而且最终我是好几张表的join。
    谢谢大家,这个问题我想通了,就是我的做法根本就不对,无法优化了,要改条道。
      

  7.   

    用JOIN,SQL Server为Join语句提供了大量分析,会比直接查询两个表格性能更优 --From SQL Server7.0
      

  8.   

    libin_ftsafe(子陌红尘) 强人阿,向他致敬。咳,又学了一着。在非聚焦索引页里,是以主键做页索引的。所以当列出Table2。ID的时候,不需要到Talbe2中取数据,直接到非聚焦索引里取这个ID就可以了。
      

  9.   

    可以 Table2.Id, Table2.Field1一起加索引
    或者先查Table1,查出的结果再获配Tabel2
      

  10.   

    为什么不这样写呢
    select Table1.Id, Table1.Name, Table2.Id, Table2.Field1
    from Table1
        inner join Table2
            on Table1.UserId = 9999 and Table1.Id = Table2.Table1Id--如果在table1.userid和Table2.Table1Id有索引的话
    --速度一定很快