现在有一些表的数据已经上kw了,普通的一条查询都要20-30秒以上,高峰的时候超过1分钟,有没有什么办法提高查询速度,google了一些方法,大部分的意见是做分区,可在已存在数据的表上还能做分区么?分区后的查询语句是如何执行的?是不是需要更改所有涉及的存储过程和sql语句?
解决方案 »
- sql2000 数据库正在使用中,能否清除日志?应该怎么清除呢?
- 关于存储过程的问题,为什么什么都不做,一按保存就出错呢?请各位帮忙!
- 怎么将每一条记录的第二个字段值插入第一个字段???????????
- 求一个PROC 在线等
- 排序规则找个错
- SQL重复多列不同条件的聚合查询问题,坐等高人
- SQL2000繁体系统下查看简体系统的问题
- 关于Xml数据类型的问题(请高手解决一下)
- 请教error: 40 - Could not open a connection to SQL Server
- 如何比较两个表的结构,表中内容是否相同(Ms SqlServer7.0)?
- 服务器为什么别人做的ASP程序无法连接到SQL2005,我自己的ASP.NET 可以的啊,他的程序本地测试都是好的
- 高手帮我看看是否安全~
2、SQL写法
3、建立合理的index,分区对一般查询没提高效率可言
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
建立分区也可以,但你要知道所查询的数据在哪个区,然后修改部分相关的存储过程和sql。如果查询需要跨区,用分区就没有意义了。
对大表我的建议还是做分区表,关于对分区表的查询。
二、参考Database Engine Tuning Advisor
DTASHELL.EXE