我现在有个表用来存商品信息的(有千万级以上的数据MS Sql 2000),其中型号是要被搜索的字段,数据量很大,like   'xxx% '搜索还行,like   '%xxx% ',搜索就慢了,搜索速度不够理想(此表已在型号字段上建索引了),型号一般都是字母、数字、空格、等组成,极少有中文 产品表结构:
ID:自增
UserID:会员ID,标识是哪个会员添加的产品
Model:型号
Price....字段1.把数据按型号首字母分流存在不同的37个表中,26字母+10个数字+中文,如IndexA....IndexZ,Index0....Index9,IndexCN 2.再建一个唯一索引的型号[UniqIndex]表,用来like   搜索用 
如:Select   型号   From   [UniqIndex]   Where   Like   '%xxx% ' 
搜索到有N条记录 a1xx 
1xxff 
.... 
gggxxg 3.现在按这些记录的第一个字母再到对应的表中搜索,再用UNION将结果组合起来 SELECT   型号   FROM   IndexA   Where   型号= 'a1xx ' 
UNION 
SELECT   型号   FROM   Index1   Where   型号= '1xxff ' 
UNION 
SELECT   型号   FROM   IndexA   Where   型号= '.... ' 
UNION 
SELECT   型号   FROM   IndexG   Where   型号= 'gggxxg ' 这样的实现方法会不会比存在一个表里快呢,UNION有没有限制最多能组合几个查询结果?现在有人说用分区视图来做,我对分区视图还不了解,现在有个疑问,请高手指点下,产品信息已经按型号首字母分流到各个小表中,现在有个会员登录后台,列出他的产品信息,这时可能信息跨多个表,可是约束列没有指定UserID这列,分区视图能取出所要的数据?CREATE TABLE IndexA (
型号  varchar(20) CHECK (型号 like'A%'),
......
)
....
CREATE TABLE IndexCN (
型号  varchar(20) CHECK (型号 like'CN%'),
......
)create view view_name  as 
select * from IndexA 
union all
...
select * from IndexCN

解决方案 »

  1.   

    分区视图 
    分区视图是提高查询性能的一个很好的办法 
    --看下面的示例 --示例表 
    create table tempdb.dbo.t_10( 
    id int primary key check(id between 1 and 10),name varchar(10)) create table pubs.dbo.t_20( 
    id int primary key check(id between 11 and 20),name varchar(10)) create table northwind.dbo.t_30( 
    id int primary key check(id between 21 and 30),name varchar(10)) 
    go --分区视图 
    create view v_t 
    as 
    select * from tempdb.dbo.t_10 
    union all 
    select * from pubs.dbo.t_20 
    union all 
    select * from northwind.dbo.t_30 
    go --插入数据 
    insert v_t select 1 ,'aa' 
    union  all select 2 ,'bb' 
    union  all select 11,'cc' 
    union  all select 12,'dd' 
    union  all select 21,'ee' 
    union  all select 22,'ff' --更新数据 
    update v_t set name=name+'_更新' where right(id,1)=1 --删除测试 
    delete from v_t where right(id,1)=2 --显示结果 
    select * from v_t 
    go --删除测试 
    drop table northwind.dbo.t_30,pubs.dbo.t_20,tempdb.dbo.t_10 
    drop view v_t /**//*--测试结果 id          name      
    ----------- ---------- 
    1          aa_更新 
    11          cc_更新 
    21          ee_更新 (所影响的行数为 3 行) 
    ==*/ 
      

  2.   

    我现在疑问就是查询、更新、删除等操作中的where的条件没有包含check所定义的列id,如
    select * from v_t where name='admin',这个name不在约束列中,可以吗?