先有3张表 产品表,生产厂商表,产品类型表如下:CREATE TABLE [dbo].[TSB_Product] (
[Pro_id] [int] IDENTITY (1, 1) NOT NULL ,
[Pro_name] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Par_ID] [int] NULL ,
[Pro_model] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Pro_decription] [ntext] COLLATE Chinese_PRC_CI_AS NULL ,
[Pro_image] [image] NULL ,
[Pro_Key] [nvarchar] (4000) COLLATE Chinese_PRC_CI_AS NULL ,
[Pro_intime] [datetime] NULL ,
[Com_id] [numeric](18, 0) NULL ,
[Pro_counter] [numeric](18, 0) NULL ,
[Pro_deleteTag] [bit] NULL ,
[Pro_ShowImage] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
CREATE TABLE [dbo].[TSB_Commpany] (
[Com_id] [numeric](18, 0) IDENTITY (1, 1) NOT NULL ,
[Com_name] [varchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,
[Com_tel] [nvarchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[Com_connect] [nvarchar] (40) COLLATE Chinese_PRC_CI_AS NULL ,
[Com_infomation] [nvarchar] (1000) COLLATE Chinese_PRC_CI_AS NULL ,
[Com_Email] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Com_address] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,
[Com_web] [nvarchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,
[Com_productweb] [nvarchar] (80) COLLATE Chinese_PRC_CI_AS NULL ,
[Com_parterner] [bit] NULL ,
[User_id] [int] NULL 
) ON [PRIMARY]
CREATE TABLE [dbo].[TSB_Parmater] (
[Par_ID] [int] IDENTITY (1, 1) NOT NULL ,
[Par_TypeID] [int] NOT NULL ,
[Par_data] [nvarchar] (200) COLLATE Chinese_PRC_CI_AS NULL ,
[Par_description] [nvarchar] (150) COLLATE Chinese_PRC_CI_AS NULL 
) ON [PRIMARY]
现在的所有搜索是对PRO_KEY字段模糊搜索,具体搜索存储过程如下,
create proc DefaultPageSearch2
@StrKey nvarchar(4000)
as 
beginSELECT top 9 tsb_product.pro_id,tsb_commpany.com_web,tsb_commpany.com_productweb,TSB_Product.Pro_name,TSB_Parmater.Par_description,TSB_Product.Pro_decription,TSB_Product.Pro_model,
tsb_partype.par_typename,tsb_commpany.com_name ,'ShowImage.aspx?pID='+cast(tsb_product.pro_id as char) as ShowImage FROM TSB_Parmater,TSB_Product,tsb_commpany,tsb_partype
 WHERE TSB_Parmater.Par_ID = TSB_Product.Par_id AND tsb_Product.com_id=tsb_commpany.com_id and  pro_key like '%'+ltrim(rtrim(@StrKey))+'%'  AND TSB_Product.Pro_deleteTag = 0 and tsb_parmater.par_typeid=tsb_partype.par_typeid order by pro_intime
end
目前产品表中大约有10条数据,每次搜索至少需要4分钟,严重超时,我的程序中已经使用了分页,每次只返回9条符合条件的数据,曾经尝试给PRO_KEY加上CLUSTERED INDEX,但是以为其数据类型为TEXT,所以加索引失败了,如果强行改为NVARCHAR,需要等待半天的时间,有没有什么好的方法能加快搜索效率!
分数不够我可以加分!谢谢拉

解决方案 »

  1.   

    SELECT top 9 ...... order by pro_intime
    分两次:
    1.select ... from ... insert into aaa
    2.SELECT top 9 ... from aaa order by pro_intime
      

  2.   

    使用 inner join。你的那种关联多表的方法是 SQL Server 很多年前刚出道的时候采用的,现在还支持。但是两种关联的处理算法其实完全不同(不知道SQL Server2005怎么样,反正Sql Server2000还不能自动优化成inner join)。使用inner join,数据库可以在关联表各个表之前首先剔出多余数据,而不是形成巨大的迪卡尔积之后再处理。其次,当然是在设计数据库结构的时候考虑到索引的需要。你的设计问题,只能自己承担。