首页 数据库 mysql教程 select * from table 时间长_MySQL

select * from table 时间长_MySQL

May 30, 2016 pm 05:10 PM
时间

优化中发现一个存储过程执行20秒通过profiler 抓取发现时间主要消耗在一个select * from 表,那么问题来了select几万数据竟然花了将近20秒?

 

问题排查清了程序前端使用了datareader获取数据,那么datareader对数据库有什么影响呢?下面来做个实验测试一下。首先我们创建测试表并插入200条数据。

 

1 CREATE TABLE [dbo].[table_2](

2     [a] [int] NULL,

3     [b] [datetime] NULL,

4     [c] [uniqueidentifier] NOT NULL

5 )

7 insert into [table_2]

8 select 1,getdate(),newid()

9 go 200

 

编写一段简单的C#小程序,使用datareader读取一个select * from table 在datareader的循环中我们设置线程等待50毫秒。System.Threading.Thread.Sleep(50);

protected void Button1_Click(object sender, EventArgs e)
        {


            //SqlCommand sqlCmd = new SqlCommand("p_datareader_test", con);
            //sqlCmd.Connection = con;
            //sqlCmd.CommandType = CommandType.StoredProcedure;//设置调用的类型为存储过程  

            //SqlParameter sqlParme = new SqlParameter();
            //sqlParme = sqlCmd.Parameters.Add("@p", SqlDbType.Int);
            //sqlParme.Direction = ParameterDirection.Input;
            //sqlParme.Value = 0;

            //SqlDataReader reader = sqlCmd.ExecuteReader();

            SqlConnection con = new SqlConnection();
            con.ConnectionString = "server=vpc-new3;database=replication;uid=sa;pwd=sa_123456";
            DataTable dt = new DataTable();


            //SQL直接查询测试-------------------------------
            con.Open();
            SqlCommand com = new SqlCommand();
            com.Connection = con;
            com.CommandType = CommandType.Text;
            com.CommandText = "select * from table_2";


            SqlDataReader reader = com.ExecuteReader();

            DataRow dtr  = dt.NewRow () ;

            try
            {
                DataTable objDataTable = new DataTable();
                int intFieldCount = reader.FieldCount;
                for (int intCounter = 0; intCounter < intFieldCount; ++intCounter)
                {
                    objDataTable.Columns.Add(reader.GetName(intCounter), reader.GetFieldType(intCounter));
                }
                objDataTable.BeginLoadData();

                object[] objValues = new object[intFieldCount];
                while (reader.Read())
                {
                    //系统等待
                    System.Threading.Thread.Sleep(50);
                    reader.GetValues(objValues);
                    objDataTable.LoadDataRow(objValues, true);
                }
                reader.Close();
                objDataTable.EndLoadData();

                GV .DataSource = objDataTable;
                GV.DataBind();
                
            }
            catch (Exception ex)
            {
                throw new Exception("转换出错!", ex);
            }
            reader.Close();
            con.Close();

        }
登录后复制

 

 

下面来测试执行一下:

 

点击按钮出发btnclick

select * from table 时间长_MySQL

执行时间0毫秒?竟然不像想象中的时间会长? 这是为什么呢?

 

测试继续! 我们加大数据,继续添加200条。

 

insert into [table_2]

select 1,getdate(),newid()

go 200

 

测试效果一样0毫秒。

 

继续增加200 条 目前数据600条

select * from table 时间长_MySQL

看一下效果:

select * from table 时间长_MySQL

效果神奇的出现了 600条记录的查询需要12秒!!

 

我们再一次执行观察一下竟然12秒才执行完肯定会有等待!

 

select wait_type,brt.text from sys.dm_exec_requests br 

         OUTER APPLY sys.dm_exec_sql_text(br.sql_handle) AS brt

         where brt.text like '%table_2%'

select * from table 时间长_MySQL

没错就是他 传说中的ASYNE_NETWORK_IO 

 

疑问:按照之前的理解datareader 一次只是读取一条记录...那么为什么我400条记录的时候就不会出现等待呢?

 

想到了发送的网络包大小,mssql默认为4096

select * from table 时间长_MySQL

那么我们继续用200条数据测试这次加大表的长度

 

drop table table_2

 

CREATE TABLE [dbo].[table_2](

    [a] [int] NULL,

    [b] [datetime] NULL,

    [c] [uniqueidentifier] NOT NULL,

    d char(4000)

)

 

insert into [table_2]

select 1,getdate(),newid(),'test'

go 200

 

再次测试执行观察效果

select * from table 时间长_MySQL

好吧我猜对了....

 

后续用dataset接收返回结果就不会出现上述问题,所以如网上所说datareader接收结果集使用要注意接收结果后要避免在循环中有大量的耗时处理。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

抖音10级灯牌多少钱?10级粉丝灯牌需要几天? 抖音10级灯牌多少钱?10级粉丝灯牌需要几天? Mar 11, 2024 pm 05:37 PM

在抖音平台上,许多用户都渴望获得等级认证,其中10级灯牌更是展示用户在抖音上的影响力和认可度。本文将深入探讨抖音10级灯牌的价格以及达到这一等级所需的时间,以帮助用户更好地了解这一过程。一、抖音10级灯牌多少钱?抖音10级灯牌的价格会受市场波动和供需情况的影响而有所差异,一般价格在几千元到万元之间。这个价格主要包括灯牌本身的成本和可能的服务费用。用户可以通过抖音官方渠道或第三方服务机构购买10级灯牌,但在购买时要留意选择合法渠道,以免遭遇虚假或欺诈交易。二、10级粉丝灯牌需要几天?达到10级灯牌

linux 可以重置系统时间吗 linux 可以重置系统时间吗 Mar 13, 2023 am 10:50 AM

linux可以重置系统时间,其重置方法是:1、使用date命令查看时间;2、使用“yum install ntp”命令安装ntp;3、通过“ntpdate -u ntp.api.bz”命令实现网络时间同步即可。

艾尔登法环通关需要多久 艾尔登法环通关需要多久 Mar 11, 2024 pm 12:50 PM

玩家在艾尔登法环中进行游戏时可以体验游戏主线剧情,以及收集游戏成就,有很多玩家不知道艾尔登法环通关需要多久,玩家的通关流程在30个小时。艾尔登法环通关需要多久答:30个小时。1、这个30个小时的通关时长指的虽然不是高手般的速通,但是也省略了很多的流程。2、如果你想获得更好的游戏体验或者是体验完整的剧情,那么时长上肯定要花费更多的时间。3、如果玩家是全收集大约要100-120小时。4、如果是只走主线刷BOSS大约:50-60小时。5、如果是想全部体验:150小时打底。

php 怎么实现时间把时分秒去掉 php 怎么实现时间把时分秒去掉 Mar 13, 2023 am 11:20 AM

php实现时间把时分秒去掉的方法:1、创建一个php示例文件;2、使用strtotime函数将日期时间转换为时间戳;3、通过date函数对日期或时间进行格式化即可去掉时分秒。

为什么我的Go程序需要更长的时间来编译? 为什么我的Go程序需要更长的时间来编译? Jun 09, 2023 pm 06:00 PM

近年来,Go语言已经成为了越来越多开发者的选择。但是,相比其他编程语言而言,Go语言的编译速度却不够快。很多开发者在编译Go程序时都会遇到这样的问题:为什么我的Go程序需要更长时间来编译?本文将会从几个方面探讨这个问题。Go语言的编译器架构Go语言的编译器架构采用的是三阶段设计,分别是前端、中间层和后端。前端负责将源代码翻译成Go语言的中间代码,中间层则将中

小红书发布作品时间怎么设置?发布作品时间准确吗? 小红书发布作品时间怎么设置?发布作品时间准确吗? Mar 24, 2024 pm 01:31 PM

小红书,一个充满生活气息与知识分享的平台,让越来越多的创作者在此畅所欲言。要想在小红书上获得更多的关注和点赞,除了内容质量之外,发布作品的时间也是至关重要的。那么,如何设置小红书发布作品的时间呢?一、小红书发布作品时间怎么设置?1.了解用户活跃时间首先,需要明确小红书用户的活跃时间。通常来说,晚上8点到10点以及周末下午是用户活跃度较高的时段。然而,这个时间段也会受到受众群体和地域等因素的影响而有所不同。因此,为了更好地把握用户活跃时段,建议对不同群体的行为习惯进行更详细的分析。通过了解用户的活

Linux 文件时间查看技巧详解 Linux 文件时间查看技巧详解 Feb 21, 2024 pm 01:15 PM

Linux文件时间查看技巧详解在Linux系统中,文件的时间信息对于文件管理和跟踪变更非常重要。Linux系统通过三种主要时间属性来记录文件的变更信息,分别是访问时间(atime)、修改时间(mtime)和更改时间(ctime)。本文将详细介绍如何查看和管理这些文件时间信息,并提供具体的代码示例。1.查看文件时间信息通过使用ls命令结合参数-l可以列出文

如何使用Python中的时间和日期模块 如何使用Python中的时间和日期模块 Oct 16, 2023 am 08:11 AM

如何使用Python中的时间和日期模块导言:在编程中,处理时间和日期是非常常见的任务。Python提供了强大的时间和日期模块,使得处理时间和日期的操作变得更加简单和方便。本文将介绍Python中的时间和日期模块,并提供具体的代码示例,帮助读者更好地理解和应用它们。一、引入时间和日期模块Python内置的时间和日期模块是datetime模块,我们需要先引入该模

See all articles