一个表。算是字典表。xx
xx_id  xx_name主表 yy
yy_id xx_id1 xx_id2 xx_id3  ...为yy表xx_id1,xx_id2,xx_id3作为索引列建立索引yy记录表比较多,有几十万到上百万。
xx表是固定的记录。大概不到一千条记录.查询的时候需要查出
xx_id1,xx_id2,xx_id3对应的name建了个一函数 GetNameByID(),专门用来根据xx_id取[name]
查询的时候:
select GetNameByID(xx_id1) ,GetNameByID(xx_id2) ,GetNameByID(xx_id3) 
from yy
where ....问题:
这样查询。yy表上的索引不起作用。这种情况上采取什么方法好。

解决方案 »

  1.   

    一般能少用函数就少用。特别是where后面,函数会导致索引无效,引用不到索引。
      

  2.   

    写效率查询:http://www.cnblogs.com/cn_wpf/archive/2007/08/03/841911.html
      

  3.   

    根据id取name还用函数干吗,直接join就可以了
      

  4.   


    有多个ID需要取name
    如果JOIN?
      

  5.   

    select GetNameByID(xx_id1) ,GetNameByID(xx_id2) ,GetNameByID(xx_id3) 
    from yy 
    inner join xx 
    on (yy.xx_id1=xx.id or yy.xx_id2=xx.id or yy.xx_id3=xx.id)
    where .... 
    这样效率也低。
      

  6.   


    select 列怎么写?
    from yy 
    inner join xx 
    on (yy.xx_id1=xx.id or yy.xx_id2=xx.id or yy.xx_id3=xx.id)
    where .... 
      

  7.   


    select 
    id1_name=a.xx_name,
    id2_name=b.xx_name,
    id3_name=c.xx_name 
    from yy t
    join xx a on a.xx_id=t.xx_id1 
    join xx b on b.xx_id=t.xx_id2
    join xx c on c.xx_id=t.xx_id3 
      

  8.   


    Select X1.xx_name as Name1,x2.xx_name as Name2,x3.xx_name as Name3
    From YY y Join xx x1 on y.xx_id1=x1.xx_ID
              Join xx x2 on Y.xx_id2=x2.xx_ID
              Join xx x3 on Y.xx_id3=x3.xx_ID
    用JOIN,这样效率还是低。
      

  9.   


    如何建?我这样建的不走索引seek
    还是scan

    create index [indexName]
    on xx(xx_id)
    include([name])
      

  10.   


    再次感谢参与讨论的csdner!
    结贴散分