SQL Server 2008 SqlDataReader读取100万数据超慢,高手帮忙。

SQL Server 2008 SqlDataReader读取100万数据超慢,高手帮忙。,第1张

这就是执行计划重编译和数据缓存。

可以分成两个部分解说,LZ红包也要给双份的!

执行计划简单的说就是SQL怎么读取 *** 作数据。

你这个属于基于优化的重编译(optimality-based recompilation---你可以去国外网站查这个关键词),主要是由统计信息发生改变导致(比如记录十万百万的增加)。

如果你想印证的话,可以用profiler跟踪重编译事件。

其下你可以用我这个方式测试一下你的SQL。

select
pusecounts,pcacheobjtype,pobjtype,ttext 
from sysdm_exec_cached_plans p
cross apply sysdm_exec_sql_text(plan_handle) t
where pcacheobjtype='Compiled Plan' and ttext like '%dboStrText%' 
and ttext not like '%dm_exec_cached_plans%'

你把上边红框里改成你那个查询的关键字

以上只是测试方法。

第二:数据缓存,这个跟时间有关系,用的是最近最少使用的数据优先清空的原理。

你可以把服务器内存整到 64G。然后配置一番,基本可以缓存多一些。

原因找到了:具体怎么做呢?

第一:如果版本可以的,你可以用索引视图

第二:分页,这个就是小块优化了!

第三:我看了一下你这个查询,可以整合到一个表中,独立建表

《P8百万数据分析架构师》课程由现任竞技世界首席数据科学家,中国计算机学会技术前线委员会数据科学研讨会主席,奈学教育数据首席内容官巴川老师领衔,携手多为10年+数据分析专家共同打造。从建立全局数据分析视角到搭建数据分析框架,从掌握数据分析方法到构建BAT级数据指标体系,从数据化运营到精益数据分析等,手术室级讲解数据分析专家工作必备的10+ 核心技能;史无前例的多行业,多场景案例12+多行业,多场景数据业务解决方案;数据分析专家必备的20+管理必备技能。全程教学实战,全阶段老师陪伴式教学服务,简历指导与大厂直推,全方位助力学员能力提升。

篇章1:大数据分析架构设计哲学本质篇

大数据分析架构哲学本质

大数据分析架构师6大顶级思维模型

大数据分析架构师三板斧

大数据分析架构师架构设计能力

百万大数据分析架构师交付形式

篇章2:大数据分析架构总体设计与实践篇

大数据分析中台架构设计与实践

大数据分析架构体系全局设计与实践

大数据分析架构设计方法哲学实践

大数据分析结论的价值判断

篇章3:大数据分析数据驱动全链路设计与实践

数据分析指标体系构建设计与实践

数据分析方式设计与实践

数据建模设计与实践

数据采集与埋点设计与实践

数据驱动业务迭代

数据驱动案例剖析

篇章4:大数据分析数据埋点体系设计与实践

数据埋点体系总体架构设计与实践

数据埋点关键架构设计与实践

数据埋点技术架构设计与实践

篇章5:大数据分析 A/B Test 中台架构设计与实践

A/B Test 企业级案例剖析

A/B Test 关键系统设计与实践

A/B Test 总体架构设计与实践

A/B Test 核心流程设计与实践

A/B Test 经验建议

篇章6:大数据分析用户画像中台架构设计与实践

标签案例一:算法标签的生产设计与实践

标签案例二:加入内容标签的生产设计与实践

用户画像中台从0到100的构建设计与实践

用户画像中台从0到101的构建设计与实践

用户画像中台从0到102的构建设计与实践

用户画像中台总体架构设计与实践

用户画像中台的效果验收设计与实践

用户画像中台设计关键事项

用户画像单个用户标签的设计与实践

篇章7:万亿级数据驱动业务智能设计与实践

数据中台以及用户智能

数据分析应用与用户智能设计与实践

用户分析智能应用:个性化推荐设计与实践

用户分析智能应用:用户画像设计与实践

篇章8:万亿级 B 站动漫番剧播放量影响因素案例数据分析

回归分析设计与实践

建议与结论

描述分析

数据采集设计与实践

背景详细介绍以及总体架构设计与实践

篇章9:万亿级金融领域投资交易数据分析案例

算法交易数据分析

衍生品数据分析

金融投资交易数据分析目标

篇章10:万亿级各行业真实海量大数据分析实践案例剖析

互联网金融(滴滴)数据驱动分析实践案例

企业服务(腾讯)数据驱动分析实践案例

在线教育行业(新东方)数据分析实践案例

外卖行业(美团)数据驱动分析实践案例

手机行业(华为)数据驱动分析实践案例

搜索行业(百度)数据驱动分析实践案例

服务器日志数据的异常监控分析与可视化实践案例

生活服务行业(58)数据驱动分析实践案例

电子商务(阿里)数据驱动分析实践案例

短视频行业(字节)数据驱动分析实践案例

股票交易行业(深交所)数据分析实践案例

银行行业(招商银行)数据驱动分析实践案例

零售行业(京东)数据驱动分析实践案例

篇章11:万亿级数据科学应用与实践

万亿级企业真实数据人工智能(AI)应用案例实践

万亿级企业真实数据挖掘算法与模型设计与案例实践

万亿级企业真实数据推荐系统设计与实践

万亿级企业真实数据文本挖掘与 WEB 挖掘案例实践

万亿级企业真实数据网络挖掘算法与案例实践

篇章12:百万大数据分析新技术探索与实践之道篇

大数据分析新技术探索与实践

大数据分析架构未来发展演进

篇章13:百万大数据分析架构师人生与管理人生

百万大数据分析架构师人生

百万大数据分析架构师管理人生

篇章14:百万架构师通用能力打造篇

百万大数据分析架构师通用能力要素拆解

篇章15:百万大数据分析架构师组织影响力打造篇

优秀学员定期直播分享

百万大数据架构师组织影响力刻意练习

线上社区互动

线下社交互动

100万?同时在线? 人气最高的天涯论坛 同时在线 才30多万
酷狗 同时在线 才几万 24小时加起来 也就1000W撑死了
一个音乐网站 你要超过百度? 百度也是在近两年才突破的100万大关
哥们干什么不都要着急 小心倾家荡产!!!
100万同时在线 的刀片式集群服务器 占用机房就几个 价格也最少百万以上
带宽 我只能说 很宽很宽 四五千兆 是不可能 满足 100万同时在线的估计像百度一样流畅都得上万兆 千兆光纤 不一定得多少根
哥们我跟你说个概念 100万同时在线 1天的IP流量大约是5000万~1亿
而PV流量 1天大约是 10亿 我刚刚查的百度进一个月日均PV流量超过11亿
也就是说 1天有 至少有5000万人在你的网站上听歌是不太可能的!
竞争这么激烈 你怎么才能超过前辈的音乐网站不知道多少倍

关于mysql处理百万级以上的数据时如何提高其查询速度的方法

最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法。

由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时,其查询速度简直无法容忍。曾经测试对一个包含400多万条记录(有索引)的表执行一条条件查询,其查询时间竟然高达40几秒,相信这么高的查询延时,任何用户都会抓狂。因此如何提高sql语句查询效率,显得十分重要。以下是网上流传比较广泛的30种SQL查询语句优化方法:
1、应尽量避免在 where 子句中使用!=或<> *** 作符,否则将引擎放弃使用索引而进行全表扫描。

2、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0

4、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20

5、下面的查询也将导致全表扫描:(不能前置百分号)
select id from t where name like ‘%c%’
若要提高效率,可以考虑全文检索。

6、in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3

7、如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num

8、应尽量避免在 where 子句中对字段进行表达式 *** 作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=1002

9、应尽量避免在where子句中对字段进行函数 *** 作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)=’abc’–name以abc开头的id
select id from t where datediff(day,createdate,’2005-11-30′)=0–’2005-11-30′生成的id
应改为:
select id from t where name like ‘abc%’
select id from t where createdate>=’2005-11-30′ and createdate<’2005-12-1′

10、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

11、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使 用,并且应尽可能的让字段顺序与索引顺序相一致。

12、不要写一些没有意义的查询,如需要生成一个空表结构:
select col1,col2 into #t from t where 1=0
这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
create table #t(…)

13、很多时候用 exists 代替 in 是一个好的选择:
select num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=anum)

14、并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段 sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

15、索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。

16应尽可能的避免更新 clustered 索引数据列,因为 clustered 索引数据列的顺序就是表记录的物理存储顺序,一旦该列值改变将导致整个表记录的顺序的调整,会耗费相当大的资源。若应用系统需要频繁更新 clustered 索引数据列,那么需要考虑是否应将该索引建为 clustered 索引。

17、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会 逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

18、尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

19、任何地方都不要使用 select from t ,用具体的字段列表代替“”,不要返回用不到的任何字段。

20、尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。

21、避免频繁创建和删除临时表,以减少系统表资源的消耗。

22、临时表并不是不可使用,适当地使用它们可以使某些例程更有效,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使 用导出表。

23、在新建临时表时,如果一次性插入数据量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果数据量不大,为了缓和系统表的资源,应先create table,然后insert。

24、如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

25、尽量避免使用游标,因为游标的效率较差,如果游标 *** 作的数据超过1万行,那么就应该考虑改写。

26、使用基于游标的方法或临时表方法之前,应先寻找基于集的解决方案来解决问题,基于集的方法通常更有效。

27、与临时表一样,游标并不是不可使用。对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。如果开发时 间允许,基于游标的方法和基于集的方法都可以尝试一下,看哪一种方法的效果更好。

28、在所有的存储过程和触发器的开始处设置 SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。无需在执行存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。

29、尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。

30、尽量避免大事务 *** 作,提高系统并发能力。

金数据采用网银级别的256位>

如果按照一个SNS网站从零到大的这么一个过程来讲的话,随着访问量的上升,按照我的经验,硬件容易出现瓶颈和顺序如下:

1先是IO的瓶颈,当动态请求增加,IO的瓶颈是最先出现的。这个问题可以通过读写分离,加cache来解决。或者直接升级硬件,或者通过负载均衡,在水平层面上增加机器。

2然后是数据库的瓶颈,这个时候就要靠业务层表的拆分啊,或者mysql这样的分发复制机制,达到多台数据库server同时提供读的服务的要求,来跨越这个瓶颈,当然也可以通过增加cache和升级数据库server的方法。

3然后是存储空间的问题,内容增加,包括等静态文件和数据。这需要增加存储容量或者存储服务器,可以用上各种分布式文件系统,有钱的话可以直接上cache。

4到达这个层面,就是机柜空间的问题了,你的服务器多了,机柜可能装不下,到了这时,你应该不差钱了,IDC的建设也应该提上日程。

还有对所有大公司来说,cdn,网络带宽和中国特色的双网互联的情况也是很大的一笔投入,像阿里为了联通和电信的双网联通,投了很多钱做一条专线。

同样技术水平也是很重要的一点,如果有能力做优化,硬件的成本就能降下来,举个例子,人人网的邵军辉在volocity上的分享我听过,他们用c++重写了整个web层,原来用40台javaserver扛住的流量用6台C++server就解决了。

总体上的硬件运维上的问题就是这些,不包括一些故障,2A备份还有网络带宽的成本的问题,希望能满足你的提问。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10318392.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-07
下一篇 2023-05-07

发表评论

登录后才能评论

评论列表(0条)

保存