现在有一些表的数据已经上kw了,普通的一条查询都要20-30秒以上,高峰的时候超过1分钟,有没有什么办法提高查询速度,google了一些方法,大部分的意见是做分区,可在已存在数据的表上还能做分区么?分区后的查询语句是如何执行的?是不是需要更改所有涉及的存储过程和sql语句?

解决方案 »

  1.   

    1、逻辑处理
    2、SQL写法
    3、建立合理的index,分区对一般查询没提高效率可言
      

  2.   

    加个逆序索引,如果原来已存在就先删除
    create index idx_date on tb(date desc)--建立索引
    create index idx_date on tb(date desc)
    goselect top 100 * from tab;还建议你在前台分一下页,分页用存储过程 这样会很快的,
    给你个分页的存储过程 是通用的啊SQL code
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    goALTER PROCEDURE [dbo].[Psp_SetPagination]
    (
      @vc_Table varchar(50),--表名
      @vc_SqlWhere varchar(1000)='',--条件
      @vc_SqlOrder varchar(1000)='',--排序规则
      @vc_SqlFile varchar(1000)='*',--选取字段
      @vc_Key varchar(50)='',--关键字
      @vc_FieldType varchar(50)='',--字段类型
      @i_PageSize int=1,--分页大小
      @i_PageIndex int=1,--页面索引
      @bt_Count bit  --在统计吗?
    )
    As
    set nocount on
    Declare @vc_Sql varchar(5000)
    if @bt_Count=1
    BEGIN
        set @vc_Sql='select count(*) from '+@vc_Table+' '+@vc_SqlWhere
    END
    ELSE
    BEGIN
        set @vc_Sql='Declare @indexTable Table(Id decimal identity(1,1),Temp_Key '+@vc_FieldType+ ')'+char(13)
        set @vc_Sql=@vc_Sql+
                    'Declare @PageLowerBound int'+char(13)
        set @vc_Sql=@vc_Sql+
                    'Declare @PageUpperBound int'+char(13)
        set @vc_Sql=@vc_Sql+
                    'set @PageLowerBound='+cast((@i_PageIndex-1)*@i_PageSize as varchar(8))+char(13)
        set @vc_Sql=@vc_Sql+
                    'set @PageUpperBound=@PageLowerBound+'+cast(@i_PageSize as varchar(8))+char(13)
        set @vc_Sql=@vc_Sql+
                    'set rowcount @PageUpperBound'+char(13)
        set @vc_Sql=@vc_Sql+
                    'Insert into @indexTable(Temp_Key)'+
                    'Select '+@vc_Key+' from '+@vc_Table+' '+@vc_SqlWhere+' '+@vc_SqlOrder+char(13)
        if @vc_SqlWhere<>''
            begin
                set @vc_SqlWhere=@vc_SqlWhere+' and '+@vc_Key+'=t.Temp_Key and t.Id>@PageLowerBound and t.Id<=@PageUpperBound'
            end
        else
            begin
                set @vc_SqlWhere='Where '+@vc_Key+'=t.Temp_Key and t.Id>@PageLowerBound and t.Id<=@PageUpperBound'
            end
        set @vc_Sql=@vc_Sql+
                    'Select  '+@vc_SqlFile+'  from '+@vc_Table+',@indexTable t '+@vc_SqlWhere+' Order by t.Id'
    END
    EXEC(@vc_Sql)http://wenku.baidu.com/view/48569e1e650e52ea55189813.html
      

  3.   

    根据where子句的需求,建立合理的索引。
    建立分区也可以,但你要知道所查询的数据在哪个区,然后修改部分相关的存储过程和sql。如果查询需要跨区,用分区就没有意义了。
      

  4.   

    优化一下你的表机构,建立复合索引虽然能提高效率但也增加了对磁盘I/0,但这种I/O操作不会影响太大的。
    对大表我的建议还是做分区表,关于对分区表的查询。
      

  5.   

    一、了解存储引擎和基本优化原理
    二、参考Database Engine Tuning Advisor
    DTASHELL.EXE