一个 Sql语句优化的问题- STATISTICS 统计信息

  前段时间,同事遇到一个 Sql语句的问题,一个列表分页功能响应在30 s以上,看数据库里面的数据条数,数据量也不大,相关字段的一些索引也都有,可就是慢。于是找出具体的sql 语句出来分析,分页功能主要有个sql 语句,select 查询和 count 两条语句。 select 查询字段的时候,速度挺快,执行时间在1 s以内 ,但是执行count(1)  的时候,速度巨慢,执行时间增加到10 s以上。奇怪的是count 语句为什么会比select 语句还慢呢。总之可以确定的就是count语句导致的。定位到具体的语句之后,查看具体的执行计划。发现select 语句的查询计划和count(1)的查询计划,有一些不同。

Select 语句 的执行计划

 

count(*)的查询计划

 

以为是索引的问题。于是往各个表里面都加上的相关的索引,情况依旧,于是判断可能不是索引的问题。

然后猜测是IO的问题。

于是在两条sql 前后 加上SET STATISTICS IO ON; 查看IO情况。

 

Select 语句的IO 输出

 

Count(1) 语句的IO 输出

 

对比后发现,ChannelBussinessInfo 这个表的逻辑读取,从2028次猛增到了631722 次,

估计就是ChannelBussinessInfo 这个表的问题,于是尝试着给这个表加了一些相关的索引,但是依然没有效果。

 

没有办法了,于是猜测是不是统计信息有问题,因为统计信息会影响 执行计划和io读取。

顺着这个思路,尝试着把ChannelBussinessInfo这个表统计信息更新了,

UPDATE STATISTICS ChannelBussinessInfo;

 

果然,sql 执行时间降低到1秒。IO 读取降到2028次。

 

关于UPDATE STATISTICS 的相关说明:

  http://technet.microsoft.com/zh-cn/ms187348

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我将提供一个简单的高校科研管理系统的SQL Server建表示例,包括用户表、项目表、论文表和成果表。 1. 用户表 ``` CREATE TABLE [dbo].[User]( [UserID] [int] NOT NULL, -- 用户ID [UserName] [nvarchar](50) NOT NULL, -- 用户名 [Gender] [nvarchar](10) NOT NULL, -- 性别 [Title] [nvarchar](50) NOT NULL, -- 职称 [Department] [nvarchar](50) NOT NULL, -- 所属部门 [ContactInfo] [nvarchar](50) NOT NULL, -- 联系方式 [Role] [nvarchar](50) NOT NULL, -- 用户角色 CONSTRAINT [PK_User] PRIMARY KEY CLUSTERED ( [UserID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] ``` 2. 项目表 ``` CREATE TABLE [dbo].[Project]( [ProjectID] [int] NOT NULL, -- 项目ID [ProjectName] [nvarchar](50) NOT NULL, -- 项目名称 [Principal] [nvarchar](50) NOT NULL, -- 项目负责人 [Member] [nvarchar](max) NOT NULL, -- 项目成员 [Funding] [decimal](18, 2) NOT NULL, -- 项目经费 [Status] [nvarchar](50) NOT NULL, -- 项目状态 CONSTRAINT [PK_Project] PRIMARY KEY CLUSTERED ( [ProjectID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] ``` 3. 论文表 ``` CREATE TABLE [dbo].[Paper]( [PaperID] [int] NOT NULL, -- 论文ID [PaperTitle] [nvarchar](50) NOT NULL, -- 论文标题 [Author] [nvarchar](max) NOT NULL, -- 作者 [Journal] [nvarchar](50) NOT NULL, -- 期刊名称 [SubmissionTime] [datetime] NOT NULL, -- 投稿时间 [ReviewStatus] [nvarchar](50) NOT NULL, -- 审稿状态 CONSTRAINT [PK_Paper] PRIMARY KEY CLUSTERED ( [PaperID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] ``` 4. 成果表 ``` CREATE TABLE [dbo].[Achievement]( [AchievementID] [int] NOT NULL, -- 成果ID [AchievementName] [nvarchar](50) NOT NULL, -- 成果名称 [AchievementType] [nvarchar](50) NOT NULL, -- 成果类型 [Principal] [nvarchar](50) NOT NULL, -- 成果负责人 [Member] [nvarchar](max) NOT NULL, -- 成果成员 [Award] [nvarchar](50) NOT NULL, -- 成果获奖情况 CONSTRAINT [PK_Achievement] PRIMARY KEY CLUSTERED ( [AchievementID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] ``` 以上是一个简单的高校科研管理系统的SQL Server建表示例,具体实现还需要根据实际情况进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值