数据库版本: SQL Server 2005
表结构:  
CREATE TABLE [dbo].[OGAInfo]
(
[OGA_ID] [varchar] (32) COLLATE Chinese_PRC_CI_AS NOT NULL,  --主键
[Tem_Detail] [varchar] (max) COLLATE Chinese_PRC_CI_AS NOT NULL,
[NodesAttrib] [varchar] (max) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
     其中,基于程序设计的原因(ASP.net C# +SQL Server 2005),Tem_Detail 列字段存储的值很大,存储的为json结构的字符信息,40KB以上,行记录大概为8000条。
     在程序的一个页面中,打开的时候,要执行一个查询的存储过程,这个存储过程的其中一条查询语句为:
            SELECT  Tem_Detail
            FROM    OGAInfo
            WHERE   OGA_ID = '9117a14fc56546e1bcf104b55efa67a7'
             AND Tem_Detail != ''
    这个查询语句,第一次执行的时候,非常慢,要等4-5分钟,由于响应时间太久,导致程序直接报错,错误信息为:System.IndexOutOfRangeException: Cannot find table 0。把报错的页面关闭掉,再次打开这个查询页面,可以打开,但要等待30秒左右,之后打开就在10秒左右。但是,如果等待1个小时以后,再次打开这个查询页面,又会显得非常慢。
    如果,重新启动数据库服务,打开这个页面的时候,跟第一次打开一样,会导致程序直接报错。    由于项目原因,无法快速修改Tem_Detail存储的值,请问如何提高第一次查询的速度?怎么去优化数据库,提高效率?

解决方案 »

  1.   

    1.可以考虑对Tem_Detail建立索引.
    2.如果是Tem_Detail != '',可以考虑使用len(Tem_Detail) = 0
      

  2.   

    Tem_Detail建立索引看下能不能快点。
      

  3.   

     OGA_ID 建立聚集索引 Tem_Detail 建立非聚集索引。
      

  4.   

    lz要解决无非是两个事情。
    1.第一次查询很慢
      lz可以考虑这样做,建一个数据库作业或者写一个定时程序,每半个小时(具体时间lz自己设,只要小于你的1个小时就行)执行一次,目的主要是把这个表的数据缓冲到数据库服务器上。这样,每次程序调用的时候,就不用每次都那么费劲了
    2.优化这条SQL
      lz需要把where条件后的字段都加上索引