以下是小编为大家准备的天堂地狱读后感,本文共14篇,仅供参考,大家一起来看看吧。

篇1: 天堂地狱读后感
《天堂与地狱》这一则寓言故事,但读后都给人生有很大的启发。天堂与地狱只在一念间。当我们处处为他人着想时,我们生活在天堂,而当们念念只想着自己,那种自私的`念头充斥我们的大脑时,那么我们就生活在地狱了。
然而反观我们的生活时,似乎我们想到更多的是自己而不是别人,所以在更多时候我们都是生活在地狱里面,但我们却不知道?这是为什么呢?
这个东西是我们许久不曾听过了,那就是因果。因果之定律,是整个宇宙亘古不变的。因果通三世,在生时假如我们处处为他人着想,死后升天堂,也可以如那些长者一样受人尊敬。其实这个在现实生活顺,只要细心观察,我们处处可以见到,那些热心帮助他人的人,总是受到人们的尊重,而那些自私自利的人,处处争利,人们对之则是避之恐之。
然而,为人着想实为人生第一大学问,想起来比较容易,做起来总觉得困难重重。但是不管如何,我们总想做一个受人尊敬的人,那么不管如何困难,努力去做吧,时间久了,自然做到了,贵在坚持。
篇2: 天堂地狱读后感
我看了一篇文章,是写一位将军询问老禅师是否有天堂与地狱。老禅师不语,半晌,对将军道:“你是将军吗?我看不可能。”将军怒,老禅师笑道:“天堂地狱一念之间。”
看了这则故事,我的感触很多。试想,任何一个,都不容的他人的怀疑和辱骂吧!即使是大贤者,大圣人也会如此。
天堂地狱,只是两个极端,两种思想,所以,天堂与地狱在人的心里,如果心中的天堂没建好,把忧悲痛苦的地狱留在心间,就会带给你苦不堪言的人生。当然,你就算身处天堂之中而不明白她的美好,天堂就会变成地狱。
一个人在一天之中,时而天堂,时而地狱,来回不知多少次。人,不光要光顾心外的生活,最重要的是建造内心的天堂。
心是生命的本体,是人的主宰,人即使身体死亡,真心永远不死,将来轮回往生受报时都要靠这颗心。
有人说:
心中烦恼无明即地狱,心中菩提正见即天堂。
心中又悲苦恼即地域,心中安乐幸福既天堂。
天堂地狱一念之间。
篇3:天堂地狱读后感
最近,我读了《天堂和地狱》这本书,很有感受。
《天堂和地狱》是一部很经典的童话,大概意思是这样的:一个人被带去参观天堂和地狱。他先去魔鬼掌管的地狱,看到的情景令他十分吃惊:每个人面前都有丰富的佳肴,却没有音乐,更没有一张笑脸。尽管他们都坐在酒桌旁,但是人人都无精打采,瘦得皮包骨头。他发现他们每个人左臂上都捆着一把叉子,右臂上也都捆着一把刀,刀叉把手足有四尺长,但他们自己无法使用它们,所以就不能进餐。因此人人都在挨饿。
后来他又被带去天堂转了一圈,看到的景象却完全不一样。同样有许多人,同样有美酒佳肴,同样有刀叉把手,也是四尺长,但是天堂里的居民却人人都在唱歌、欢笑,一片幸福快乐的景象。
看完这则故事后,我感想颇深。地狱里的每个人都在试图喂自己,结果根本吃不到东西。而天堂里的每个人都在想法喂对面的人,而且也在被对面的人喂,因为他们互相帮助,所以他们过得很快乐。
生活中又何尝不是如此呢?如果一个人想到的只是自己,那么生活过得就像故事中的地狱;如果一个人想到的是别人,而且能和别人互相帮助,那么日子过得就像故事中的天堂。
篇4:天堂地狱成语
【拼音】:tiān táng dì yù
【简拼】:ttdy
【解释】:原为佛家语。指善人死后升入天堂,恶人死后堕入地狱。佛家用以劝善惩恶。后常用以比喻幸福和凄苦两种截然相反的生活境遇。
【出处】:《宋书?天竺迦毘黎国传》:“且要天堂以就善,曷若服义而蹈道;惧地狱以敕身,孰与从理以端心。”
【示例】:~门相对,任君拣取那边好。 元·无名氏《度柳翠》第二折
【语法】:作主语、宾语、定语;用于比较
篇5:天堂地狱一线间作文
天堂地狱一线间作文
对于斗地主游戏或许很多人都不陌生,我们可以在游戏之中找到快乐,可以在游戏中消磨时间,然而我们依旧可以在游戏里学会一些道理,尽管这些东西仅仅就是一瞬间的想法,也许这些想法只可以存在几天,或许就是一秒不到,可是这一切真的已经发生了!
这个夜晚我突然之间明白了,天堂与地狱仅仅就是一线之差,因为当我刚刚进入游戏,我也不是很富裕,也就刚刚过一千而已,可能真的是因为有运气吧,我不断的赢,不断的拿到好牌,可是我发现自己在有资本以后,整个人就不想继续在新手场玩耍了,所以我准备在初级场尝试一下,刚刚开始的两次真的有一些顺利,我已经突破一万关卡,并且这个时候的牌真的是不错,可是没有想到运气也有不好的`时刻,输牌仅仅就是在一瞬间,而且还是在不断的连续着,所以我最终输完全部的资本!
这不就是一念天堂,一念地狱吗?我终于知道了那句话:知足常乐。为什么会有赌徒不断的输,或许他们就是我当初的心情,存在着侥幸自大心理,而且最主要的还是自己可赢不可输!
一切只在人的一念之间,若是心善,就是天堂;若是心恶,便是地狱。
篇6:游人间天堂地狱作文
游人间天堂地狱作文
我是外星人,来自木星,我们土星人一直关注着地球。最近,我们发现地球十分寂静,感到奇怪,国王派我去地球查看。于是,我乘坐ufo前往地球。
终于抵达了地球,令我奇怪的是,人呢。我搜寻人的踪迹,这环境也太差了吧。‘嘿,站住’一个声音在叫我,我回头,‘哦,原来是老虎啊,你怎么跑到街上来了啊,胆子大了啊’‘胆子大,我天生胆子就不小,你在找人类吗,别找了,他们早就躲到天堂去了,你说好笑不好笑。
居然还有去地狱的',我们只能在地球,他们跑到地狱后,怕没空位,就把我们从生死簿上给勾了,哎长生不老有什么用,你看看酸雨又来了,我先走了,不然……’望着老虎的背影,我有点气愤,人类怎么可以这样?
不行,我得去天堂看看。
到天堂门口,看见3个神仙在扫地,我走上前问‘请问,你们是什么神仙,穿的如此尊贵,为何沦为扫地的了’一个老者回答‘哎,我是太上老君,这是观音娘娘,这是嫦娥。至于我们为何扫地啊,都是那人类啊,来了天堂以后也不知他们做了什么,天堂整天乌烟瘴气的,垃圾满天飞。
这可如何是好,只能各扫门前雪了,我年纪大,所以观音她们好心来帮我一把,否则……咳咳,天堂迟早会被毁的,你也要保护好你们的星球,爱护环境啊’我点点头,看来我不用进去了,我已经可以想到了,哎,可怜了这些老神仙。
离开天堂,我直奔地狱。
‘求求你让我进去吧’刚到地狱门口,就听到这样的哀求。‘不行,地狱已经满了,你还是回人间吧’‘求你了,人间那个地方生不如死啊,你让我下18层地狱也行啊’‘你想的好,18层,28层都有了,这属于高危建筑了,凭什么你们人类自己犯的错让我们帮忙,看你也可怜,可是我只是一个狱卒,让你进去我就活不成,你还是走吧,这只能怪你们自己,哎,快走吧。’接着,一个红衣女孩走出来,看样子十分绝望,她抬头,看见了我,疯了般的跑来‘你是外星人,求你带我走吧,我不想回地球’接着,很多人跑来。我吓的连忙离去。
我好象虎口脱身般,钻进ufo,逃离这个地方。
回到土星我把一切报告给国王,国王眉头紧皱,说‘马上把地球的卫星炸掉,收回我们的卫星,封锁星球,不准一个地球人进入’我领命,这必须要办,为了我们的星球,地球人,我们帮不了,他们毫无悔改之意,就让他们自食恶果吧,只是,可怜了天堂和地狱。
篇7:天堂地狱态度之差抒情散文
天堂地狱态度之差抒情散文
亲爱的约翰:
有一则寓言很有意味,也让我感触良多。那则寓言说:
在古老的欧洲,有一个人在他死的时候,发现自己来到一个美妙而又能享受一切的地方。他刚踏进那片乐土,就有个看似侍者模样的人走过来问他:“先生,您有什么需要吗?在这里您可以拥有一切您想要的:所有美味佳肴,所有可能的娱乐以及各式各样的消遣,其中不乏妙龄美女,都可以让您尽情享用。”
这个人听了以后,感到有些惊奇,但非常高兴,他暗自窃喜:这不正是我在人世间的梦想嘛!一整天他都在品尝所有的佳肴美食,同时尽享美色的滋味。然而,有一天,他却对这一切感到索然无味了,于是他就对侍者说:“我对这一切感到很厌烦,我需要做一些事情。你可以给我找一份工作做吗?
他没想到,他所得到的回答却是摇头:“很抱歉,我的先生,这是我们这里惟一不能为您做的。这里没有工作可以给您。”
这个人非常沮丧,愤怒地挥动着手说:“这真是太糟糕了!那我干脆就留在地狱好了!”
“您以为,您在什么地方呢?”那位侍者温和地说。
约翰,这则很富幽默感的寓言,似乎告诉我:失去工作就等于失去快乐。但是令人遗憾的是,有些人却要在失业之后,才能体会到这一点,这真不幸!
我可以很自豪的说,我从未尝过失业的滋味,这并非我运气,而在于我从不把工作视为毫无乐趣的苦役,却能从工作中找到无限的快乐。
我认为,工作是一项特权,它带来比维持生活更多的事物。工作是所有生意的基础,所有繁荣的来源,也是天才的塑造者。工作使年轻人奋发有为,比他的父母做得更多,不管他们多么有钱。工作以最卑微的储蓄表示出来,并奠定幸福的基础。工作是增添生命味道的食盐。但人们必须先爱它,工作才能给予最大的恩惠、获致最大的结果。
我初进商界时,时常听说,一个人想爬到高峰需要很多牺牲。然而,岁月流逝,我开始了解到很多正爬向高峰的'人,并不是在“付出代价”。他们努力工作是因为他们真正地喜爱工作。任何行业中往上爬的人都是完全投入正在做的事情,且专心致志。衷心喜爱从事的工作,自然也就成功了。
热爱工作是一种信念。怀着这个信念,我们能把绝望的大山凿成一块希望的磐石。一位伟大的画家说得好,“痛苦终将过去,但是美丽永存”。
但有些人显然不够聪明,他们有野心,却对工作过分挑剔,一直在寻找“完美的”雇主或工作。事实是,雇主需要准时工作、诚实而努力的雇员,他只将加薪与升迁机会留给那些格外努力、格外忠心、格外热心、花更多的时间做事的雇员,因为他在经营生意,而不是在做慈善事业,他需要的是那些更有价值的人。
不管一个人的野心有多么大,他至少要先起步,才能到达高峰。一旦起步,继续前进就不太困难了。工作越是困难或不愉快,越要立刻去做。如果他等的时间越久,就变得越困难、可怕,这有点像打枪一样,你瞄的时间越长,射击的机会就越渺茫。
我永远也忘不了做我第一份工作——簿记员的经历,那时我虽然每天天刚蒙蒙亮就得去上班,而办公室里点着的鲸油灯又很昏暗,但那份工作从未让我感到枯燥乏味,反而很令我着迷和喜悦,连办公室里的一切繁文缛节都不能让我对它失去热心。而结果是雇主不断地为我加薪。
收入只是你工作的副产品,做好你该做的事,出色完成你该完成的工作,理想的薪金必然会来。而更为重要的是,我们劳苦的最高报酬,不在于我们所获得的,而在于我们会因此成为什么。那些头脑活跃的人拼命劳作决不是只为了赚钱,使他们工作热情得以持续下去的东西要比只知敛财的欲望更为高尚——他们是在从事一项迷人的事业。
老实说我是一个野心家,从小我就想成为巨富。对我来说,我受雇的休伊特—塔特尔公司是一个锻炼我的能力、让我一试身手的好地方。它代理各种商品销售,拥有一座铁矿,还经营着两项让它赖以生存的技术,那就是给美国经济带来革命性变化的铁路与电报。它把我带进了妙趣横生、广阔绚烂的商业世界,让我学会了尊重数字与事实,让我看到了运输业的威力,更培养了我作为商人应具备的能力与素养。所有的这些都在我以后的经商中发挥了极大效能。我可以说,没有在休伊特—塔特尔公司的历练,在事业上我或许要走很多弯路。
现在,每当想起休伊特和塔特尔两位先生时,我的内心就不禁涌起感恩之情,那段工作生涯是我一生奋斗的开端,为我打下了奋起的基础,我永远对那三年半的经历感激不尽。
所以,我从未像有些人那样抱怨他的雇主,说:“我们只不过是奴隶,我们被雇主压在尘土上,他们却高高在上,在他们美丽的别墅里享乐;他们的保险柜里装满了黄金,他们所拥有的每一块钱,都是压榨我们这些诚实的工人得来的。”我不知道这些抱怨的人是否想不定期:是谁给了你就业的机会?是谁给了你建设家庭的可能?是谁让你得到了发展自己的可能?如果你已经意识到了别人对你的压榨,那你为什么不结束压榨,一走了之?
工作台是一种态度,它决定了我们快乐与否。同样都是石匠,同样在雕塑石像,如果你问他们:“你在这做什么?”他们中的一个人可能就会说:“你看到了嘛,我正在凿石头,凿完这块我就可以回家了。”这种人永远视工作为惩罚,在他嘴里最常吐出的一个字就是“累”。
另一个人可能会说:“你看到了嘛,我正在做雕像。这是一份很辛苦的工作,但是酬劳很高。毕竟我有太太和四个孩子,他们需要温饱。”这钟人永远视工作为负担,在他嘴里经常吐出来的一句话就是“养家糊口”。
第三个人可能会放下锤子,骄傲地指着石雕说:“你看到了嘛,我正在做一件艺术品。”这种人永远以工作为荣,工作为乐,在他嘴里最常吐出的一句话是“这个工作很有意义”。
天堂也地狱都有由自己建造。如果你赋予工作意义,不论工作大小,你都会感到快乐,自我设定的成绩不论高低,都会使人对工作产生乐趣。如果你不喜欢做的话,任何简单的事都会变得困难、无趣,当你叫喊着这个工作很累人时,即使你不卖力气,你也会感到精疲力竭,反之就大不相同。事情就是这样。
约翰,如果你视工作为一种乐趣,人生就是天堂;如果你视工作为一种义务,人生就是地狱。检视一下你的工作态度,那会让我们都感觉愉快。
爱你的父亲November9,1897
格言:
1。辛苦劳动的最高报酬,不在于我们从中获得了什么,而在于我们会因此成就什么。
2。倘若你将劳苦的工作看作是一种生活的乐趣,那么人生对于你来说就是敞亮的天堂,倘若你将劳苦工作看作是一种必进的义务,那么人生对于你来说就是黑暗的地狱。
3。天堂也好,地狱也罢,其实都是取决于你自己的抉择的,天堂是你自己搭建的,地狱也是你自己筑造的。
篇8:天堂地狱的成语解释
天堂地狱的成语解释
【成语释义】原为佛家语。指善人死后升入天堂,恶人死后堕入地狱。佛家用以劝善惩恶。后常用以比喻幸福和凄苦两种截然相反的'生活境遇。
【成语出处】《宋书·天竺迦毘黎国传》:“且要天堂以就善,曷若服义而蹈道;惧地狱以敕身,孰与从理以端心。”
【感情色彩】中性
【成语结构】联合式成语
【成语用法】作主语、宾语、定语;用于比较
【产生年代】古代成语
成语例句
天堂地狱门相对,任君拣取那边好。(元 无名氏《度柳翠》第二折)
英语释义
heaven and hell
网络英语释义
1. HEAVEN & HELL
2. Kooroano
3. Heaven and hell
4. heaven or hell
双语例句
1. God, heaven, hell - all are fictions to comfort people.
上帝,天堂,地狱-- 一切都是用来安慰人们的虚构.
2. Hell was built on spite, and heavn on pride.
地狱建立在怨恨之上,天堂建立在自豪之上.
来自《辞典例句》
3. No man knows Hell like him who converses most in Heaven.
在天堂里谈话最多的人对地狱最了解.
来自《辞典例句》
篇9:天堂地狱,中小企业人力资源管理困局
当下的中小企业,人力资源管理的危局,我想很多职业经理人尤其是人力资源经理人都是感同身受的,可是当我们那些理论一层层的剥开,发现所谓的理念、技术、经验,背后其实都是简单的常识,这些常识因为简单,所以常用,可见常识是多么的重要!我们也可以发现中小企业人力资源管理解困之道,其实就是老板的一念之间, 我们列举一下所谓的乱象:高层不重视人力资源管理;岗位没有合适的人在岗;招聘不到合适的人才;员工对绩效考核怨声载道;培训,走过场而已,没有效果;薪资没有吸引力等等。人力资源从业人也是压力很大,人心惶惶、四面楚歌,职位朝不保夕。这样的三输局面,其实背后的原因,分析之后,发现解决之道,其实也很简单。 中小企业,主要看老板,这句话,很对。透过这些企业的管理,你会发现很多决策和结果,往往都是老板的一念之间。业绩和态势很好、团队稳定的企业,老板基本上正确的发挥其影响力,老板个人人格和企业人格紧紧融为一体;反之,个人和企业就是阳奉阴违,表里不一、人格缺陷。
困局之困,不在事情本身,而在一人身上,即是老板。 企业文化,既要看上去很美,又要落地生根。这需要老板的智慧。企业文化硬件部分和软件部分,都需要老板智慧和人格魅力。都说企业文化需要沉淀,诚哉斯言。可是联想如果不是创始人柳传志步步为营,脚踏实地,善始善终,善待员工,他会成为今天民营企业标杆的联想吗?企业竞争,归根结底是企业文化的竞争,对于中小企业,其实就是老板有多大的胸怀和爱!今天我们看联想、阿里巴巴、日航、蒙牛等企业文化中,无不显示着创始人的智慧,以及他们包容、尊重、欣赏的人文关怀,
而这些,都是从头开始做的,并一以贯之。 这里我想说,最好的培训,不是技术的培训,而是文化的滋润,那种随风潜入夜、润物细无声的境界,才是培训的最高境界。员工才能把个人自知自觉变为自愿、志愿。 太多民营企业失败,归咎于老板的人格缺陷了。如果老板有向往百年基业的心,愿意学习他们的人文关怀,愿意建立基业长青的决心,我想所谓的困局,就是过眼云烟。对于当下的中国的中小企业面临的所谓80、90后特殊的就业群体,我想只要老板有这样的心,这何尝不是弹指一灰间的事情呢?
天堂or地狱,仅在老板的一念之间;功成名就or身败名裂,也仅在老板的一念之间;昙花一现or 基业长青,也在于老板的一念之间。迷途知返or执迷不悟,看来不仅靠造化,还要靠自我修炼,自我选择。 关心,从心开始。企业文化建设其实就是将心比心,以心换心的坦诚互动过程,老板如何对自己的员工、顾客、是否承担社会责任,他的员工、顾客和社会也会怎样对他,他收获的也是对等的。都说牛根生、马云、俞敏洪等智慧超人,如果不是他们从点滴做起,一步一步树立个人品牌,又岂能一蹴而就。 良性互动,一定是良心互动。就看老板的抉择。所谓的人力资源管理的困局也一定会被老板的一念之间化解为灰飞烟灭。 历史的滚滚车轮已然来到越来越注重文化多元的21世纪,老板能不能有那种“美人之美,各美其美”的人文精神显得越来越重要了,能不能度过眼前的大环境,从容划过21世纪,对绝大多数的老板,无疑显然是个重大课题,机遇大于挑战,也全在一念之间。就看老板们如何选择了。
欢迎与作者探讨您的观点和看法,电子邮件:chad-@163.com
篇10:天堂地狱-天堂地狱的故事-天堂地狱的寓意-天堂地狱的意思
【成语】天堂地狱
【拼音】tiān táng dì yù
【简拼】ttdy
【感情色彩】褒义词
【成语结构】联合式
【成语解释】原为佛家语。指善人死后升入天堂,恶人死后堕入地狱。佛家用以劝善惩恶。后常用以比喻幸福和凄苦两种截然相反的生活境遇。
【成语出处】《宋书・天竺迦忱韫传》:“且要天堂以就善,曷若服义而蹈道;惧地狱以敕身,孰与从理以端心。”
【成语用法】作主语、宾语、定语;用于比较
【例子】天堂地狱门相对,任君拣取那边好。(元・无名氏《度柳翠》第二折)
【产生年代】古代
【常用程度】常用
篇11:天堂地狱之间没有墙诗歌
天堂地狱之间没有墙诗歌
一梦梦到了天大亮,
要不是梦中的她用劲在推搡。
仍然还在和她话短长,
她说赶快走出家门看太阳。
在梦中和我细说别后去过啥地方,
各处的见闻实在难以忘。
到现在仍住地狱还未上天堂,
天堂里落户难难于见玉皇。
须交大笔钱孝敬办事的爹和娘,
你们给我寄的钱不够啥用项。
买一张空格表叫人晕头又转向,
落户过程的钱就能填满一间房。
要过多少关卡只有问玉皇,
杀猪宰羊一道工序吃不到肉香。
不用说从人间落户到天堂,
人常说登天难难到登不上。
就算上了天也难住天堂,
人间开的户口本也能用得上,
不交办亊费用等于瞎白忙,
钱能买来鬼推磨一点儿不夸张。
人说穷人地獄富人的天堂,
这话说的也真够漂亮。
不管走到啥地方,
舍不得孩子套不住狼。
我也想享受幸福住天堂,
带着你们寄给的款项到天上。
那知因为钱少白白跑一趟,
还需要几十万块才能够用项。
只好返家和你梦中来商量,
我答应帮她实现条件和理想。
她又说了住地狱的生活和状况,
原来和天堂大同小异一个样。
地狱里是穷人住的穷地方,
阎王收费要比天堂低很多。
没钱人全部扑进黄泉路上,
有个遮风避雨处总比孤魂野鬼强。
听说阎殿的开销也紧张,
尽管没有赤字还能平衡帐。
每年日月过的还免强,
叫办事的小鬼不准浪费和铺张。
下面提出加大各种收费项,
阎君否定了提议不准瞎想望。
咱们的名声不好叫人骂脊梁,
次次办事埃打受气尽带伤。
来咱们这里的.穷人日子也难过,
少收费够开销减轻点儿臭名望。
也算积点阴德脸皮也光强,
做事不能太过分要牢牢记心上。
咱们穷人多积少成多还象样,
收入的总数量也不差于它天堂。
每天吃香的喝辣的也算是小康,
小日子难过尽量要免强。
贪得无厌遭报应没有好下场,
地狱中的十八层里面空荡荡。
谁愿意进去坐在第一把交椅上,
据说小鬼们默不作声心里服阎王。
我听后哭笑不得笑断肠,
这样的亊情第一次叫人疑思量。
不管怎么说还是让她住天堂,
想办法打开天门为她达理想。
篇12:穿插于天堂地狱间500字作文
穿插于天堂地狱间500字作文
“看庭前花开花落,往窗外云卷云舒。”
走在黄昏的小道,前方是金沙撒下般的夕阳余晖,回首是树影拉长的'柔和色彩,没有温度的路灯提醒着夕阳即将西下。
一深一浅地踩在片片落叶铺满的地面,听着脚下“咯,咯”树叶碾碎的声音。漫无目的地走着,想起的却又被忘了,当我不再想了去又记起来了。
黑夜降临,夜是如此神秘与性感,它想昭示着纯洁,却又因漫天的繁星而显得成熟。
从阳光普照的花开飘云,到月光轻吹的花落云散,不生不灭,不垢不净,不增不减,一切都没减少,而一切有没有增多,就像生死相扣,代代繁衍一样。一样的天堂,一样的地狱,而由生如死,则是从天堂而穿插到地狱。
一沙一世界,一叶一菩提,一花一天堂,每件事物都是由简入繁,而又由繁化简。当一沙破碎,一叶枯萎,一花凋零,这也只是生死循环,而无所谓悲伤,无所谓欢愉,仅仅只是穿插于天堂地狱。
“乾坤震巽,坎离艮兑。”八卦相生相灭,也只不过是世界的组成而已,天地雷风,水火山泽。乾坤象征这生命,有乾必有坤,乾坤扭转,则生命循环也。同样可义为:“亢龙有悔,盈不可久也。”此之谓,否极泰来,也是穿插于天堂地狱。
隐身黑暗中,同样由天堂而穿插于地狱。
篇13:通往性能优化的天堂地狱 JOIN方法说明
前言
不管是博客园还是CSDN,看到很多朋友对数据库的理解、认识还是没有突破一个瓶颈,而这个瓶颈往往只是一层窗纸,越过了你将看到一个新世界,
04、做项目的时候,用SQL Server ,核心表(大部分使用频繁的关键功能每次都要用到)达到了800万数据量,很早以前查过一些相关表,有的达到了3000多万,磁盘使用的光纤盘,100G空间,每周必须备份转移数据,否则100G空间一周会满掉,这个系统几年来,目前仍然保持非常良好的性能。还听说过朋友的SQL Server 2000数据库工作在几十TB的环境下,高并发量,对这种级别的驾驭能力我还是差的很遥远。
想当年,也是一提SQL Server,就觉得它的性能没法跟Oracle相比,一提到大数据处理就想到Oracle。自己一路走来,在本地blog上记录了很多优化方面的post,对的错的都有,没有时间系列的整理出来,这篇文章将join方法的概念稍微整理在一起,给大家个参考。通过查资料了解里面提到的各种概念,在实际中不断验证总结,完全可以对数据库一步步深入理解下去的。
我只对SQL Server 2000比较了解,但这并不阻碍我在Oracle、MySql进行SQL调优、产品架构,因为在数据库理论原理上,各大数据库基本出入不大,对数据库的深入理解,也不会影响你架构设计思想变坏,相反给你带来的是更深层次的思考。
RicCC:.06.26
关于执行计划的说明
在SQL Server查询分析器的Query菜单中选择Show Execution Plan,运行SQL查询语句,在结果窗口中有Grid、Execution Plan、Messages三个Tab。看图形形式的执行计划,顺序是从右到左,这也是执行的顺序。执行计划中的每一个图标表示一个操作,每一个操作都会有一个或多个输入,也会有一个或多个输出。输入和输出,有可能是一个物理数据表、索引数据结构,或者是执行过程中的一些中间结果集/数据结构。鼠标移动到图标上,会显示这个操作的具体信息,例如逻辑和物理操作名称、记录的数量和大小、I/O成本、CPU成本、操作的具体表达式(参数Argument)。鼠标移动到连接箭头上,会显示箭头起始端的操作输出结果集的记录数、记录的大小,一般情况下可以将这个输出结果集理解为箭头结束端的输入。
另外关于执行计划的一些补充说明:1. 执行计划中显示的信息,都是一个“评估”的结果,不是100%准确的信息,例如记录数量是取自统计信息,I/O成本、CPU成本来自执行计划生成过程中基于统计信息等得出的评估结果。2. 执行计划不一定准确,一方面受SQL Server维护的统计信息准确性的影响,另一方面SQL语句编译时刻与执行时刻的环境(内存使用状况、CPU状况等)可能会不一样。
关于统计信息、I/O成本和CPU成本的评估、SQL语句的编译和执行过程,这里不再深入。另外尽管执行计划不一定准确,但它仍是SQL语句分析最重要的依据,因为你可以理解为,绝大部分情况下,SQL Server是以这种方式来执行的。
JOIN方法说明
数据库中,象tableA inner join tableB、tableA left out join tableB这样的SQL语句是如何执行join操作的?就是说SQL Server使用什么算法实现两个表数据的join操作?
SQL Server 2000有三种方式:nested loop、merge、hash。Oracle也是使用这三种方式,不过Oracle选择使用nested loop的条件跟SQL Server有点差别,内存管理机制跟SQL Server不一样,因此查看执行计划,Oracle中nested loop运用非常多,而merge和hash方式相对较少,SQL Server中,merge跟hash方式则是非常普遍。
以SQL Server 2000为例对这三种方式进行说明,穿插在里面讲解执行计划的一些初级使用。
1. nested loop join
1.1 示例SQL
select ... from tableA inner join tableB on tableA.col1=tableB.col1 where tableA.col2=? and tableB.col2=?
tableA中没有建立任何索引,tableB中在col1上有建立一个主键(聚集索引)。
1.2 算法伪代码描述
foreach rowA in tableA where tableA.col2=?
{
search rowsB from tableB where tableB.col1=rowA.col1 and tableB.col2=? ;
if(rowsB.Count<=0)
discard rowA ;
else
output rowA and rowsB ;
}
join操作有两个输入,上面例子中tableA是outer input,用于外层循环;tableB是inner input,用于循环内部。下面针对执行计划描述一下SQL Server完成这个操作的具体步骤。
1.3 查看执行计划方法 移到文章最前面。
1.4 执行步骤
下面是示例SQL的执行计划图。nested loop操作的右边,位于上面的是outer input,位于下面的是inner input。你不能够根据join中哪个表出现在前面来确定outer input和inner input关系,而必须从执行计划中来确定,因为SQL Server会自动选择哪个作为inner input。
a) 对tableA执行Table Scan操作。这个操作的输入是tableA表中的数据,这些数据位于磁盘上,操作过程中被加载到内存;输出是符合条件的记录集,将作为b)的outer input。在这个操作中,tableA.col1=?的条件会被使用。
b) 执行上面伪代码描述的nested loop操作。对a)中的每个输出记录,执行步骤c)。
c) 对tableB执行Clustered Index Seek操作。这个操作是在nested loop循环里面执行的,输入是tableB表的聚集索引数据。它使用tableB.col1=rowA.col1和tableB.col2=?这两个条件,从tableB的聚集索引中选择符合条件的结果。
d) 构造返回结果集。从nested loop的输出中,整理出select中指定的字段,构造最终输出结果集。
1.5 进阶说明
上面例子对inner input使用的是聚集索引,下面看一下非聚集索引的情况,加强对执行计划的理解、分析能力。
把tableB col1上的主键修改为非聚集方式,示例的SQL语句执行计划如下:
前面三个执行步骤a)、b)、c)跟1.4中一样,有一点需要注意的是,步骤c)是执行Index Seek操作,它跟Clustered Index Seek有区别。聚集索引的根节点是每一条实际数据记录,而非聚集索引的根节点是对聚集索引根结点键值的引用(如果表存在聚集索引),或者是对实际数据记录rowid的引用(指没有聚集索引的表,这种表称为heap表)。Clustered Index Seek执行之后,实际的物理数据记录已经被加载到内存中,而Index Seek操作之后,并没有加载实际的物理数据记录,而只是非聚集索引的根结点数据,其中只包含了索引字段数据以及引用的聚集索引键值或者rowid。SQL Server在这个步骤中使用非聚集索引根结点数据中的索引字段值,与outer input中的记录(rowA)关联字段进行匹配,判断是否是符合条件的结果,如果是,则将非聚集索引根结点数据结构保存到nested loop操作的输出数据结构中,并且会创建一个书签(Bookmark),指示在必要的时候需要根据这个书签去获取引用的数据。
d) 执行Bookmark Lookup操作。nested loop操作的输出是一个内存数据结构,在从这个内存数据结构中整理出整个查询语句的输出结果集之前,需要处理前面的书签引用问题,Bookmark Lookup操作就是根据书签中引用的聚集索引键值或者rowid获取具体记录数据。
e) Filter过滤操作。回顾前面几个操作,在执行nested loop时只是使用非聚集索引的索引字段(tableB.col1)跟outer input的关联字段进行匹配,到目前为止还没有使用tableB.col2=?这个条件,这个操作就是使用tableB.col2=?对Bookmark Lookup的输出进行过滤。
看的仔细的人到这里后可能会有几个疑问,1. tableA.col2=?怎么没有一个Filter操作?2. 在1.4中为什么没有出现Filter操作?解释如下:1. 在tableA上面执行的是Table Scan操作,是直接对每条实际数据进行扫描,在这个扫描过程中可以使用tableA.col2=?这个条件进行过滤,避免一个额外的Filter操作。鼠标移动到Table Scan操作上,从提示信息的参数(Argument)里面可以看到tableA.col2=?的条件已经被运用上了。2. 前面说过,聚集索引的根节点是实际数据记录,执行Clustered Index Seek的时候,最终也是扫描到了实际数据记录,在这个过程中运用tableB.col2=?这个条件,同样避免一个额外的Filter操作。这就是1.4中没有Filter操作的原因。
f) 构造返回结果集。跟1.4步骤d)一样。
1.6 nested loop使用条件
任何一个join操作,如果满足nested loop使用条件,查询优化过程中SQL Server就会对nested loop的成本(I/O成本、CPU成本等)进行评估,基于评估结果确定是否使用这种join方式。
使用nested loop方式的条件是:a) outer input的记录数不大,最好是在1000-2000以下,一般超过3000就很难说了,基本不大会选择nested loop。b) 作为inner input的表中,有可用于这个查询的索引。
这是因为outer input记录数不大,意味着外层循环次数比较小;inner input上有可用的索引,意味着在循环里面搜索inner input表中是否存在匹配的记录时,效率会很高,哪怕inner input表实际记录数有几百万。基于这两个条件,nested loop的执行效率非常高,在三种join方式里面,是内存和CPU消耗最少的一种(不合理的强制指定nested loop方式除外)。
关于使用条件另外的说明:outer input的记录数,并不是指outer input表中实际记录数,例如示例SQL中,如果tableA在col2上有维护统计信息(存在col2的索引或者是单独维护的统计信息),并且tableA.col2=?的条件值符合SARG(可搜索参数)形式,那么查询编译时刻SQL Server就能够利用统计信息和条件值评估出符合条件的记录数,查询执行时刻符合条件tableA.col2=?的记录才被用于外层循环,
inner input表中有可用的索引,是指inner input表中用于和outer input表关联的字段(一个或多个字段)能够命中某个索引(这些字段的部分或者全部出现在某个索引字段的前面)。
符合上面的条件,也不是说SQL Server 100%就会选择nested loop。因为SQL Server的查询优化器是基于成本评估的,如果其它方案评估出的成本胜过这个,SQL Server会选择其它的join方式。举个例子,如果inner input上符合条件的索引是非聚集索引,这样SQL Server可能需要一个额外的Bookmark Lookup操作获取实际记录数据,如果inner input表数据量非常大,索引碎片程度很高等情况,可能导致Bookmark Lookup成本非常高,SQL Server会尝试其它join方案的评估选择。
1.7 强制指定nested loop方式
使用loop关键字实现,例如tableA inner loop join tableB,将强制SQL Server使用nested loop方式执行这个join操作。或者使用option选项,例如tableA inner join tableB option(loop join)
nested loop算法有它适用的范围,在这个范围之内效率是最高的,超出这个范围效率反而很差,除非你有十分的把握,不要随意强制指定join方式。
接下来就不再象上面这样详细的讲述了。
2. merge join
merge join第一个步骤是确保两个关联表都是按照关联的字段进行排序。如果关联字段有可用的索引,并且排序一致,则可以直接进行merge join操作;否则,SQL Server需要先对关联的表按照关联字段进行一次排序(就是说在merge join前的两个输入上,可能都需要执行一个Sort操作,再进行merge join)。
两个表都按照关联字段排序好之后,merge join操作从每个表取一条记录开始匹配,如果符合关联条件,则放入结果集中;否则,将关联字段值较小的记录抛弃,从这条记录对应的表中取下一条记录继续进行匹配,直到整个循环结束。
在多对多的关联表上执行merge join时,通常需要使用临时表进行操作。例如A join B使用merge join时,如果对于关联字段的某一组值,在A和B中都存在多条记录A1、A2...An、B1、B2...Bn,则为A中每一条记录A1、A2...An,都必须在B中对所有相等的记录B1、B2...Bn进行一次匹配。这样,指针需要多次从B1移动到 Bn,每一次都需要读取相应的B1...Bn记录。将B1...Bn的记录预先读出来放入内存临时表中,比从原数据页或磁盘读取要快。
merge join操作本身是非常快的,但是merge join前进行的排序可能会相当耗时(SQL Server最消耗内存和CPU的操作,一个是大数据排序,一个是大数据的hash运算,这都是指查询计划里面的Sort以及Hash相关的操作,例如hash join、使用hash算法实现的Distinct操作等,而不是指你的SQL中order by关键字),尤其是对数据量非常大的记录集,因此导致使用merge join的查询成本变得非常高。对于数据量非常大的表,如果merge join的关联字段可以使用聚集索引,merge join是最快的Join方法之一。因此优化方案是在表结构设计层面良好的设计关联关系和表的索引结构,SQL语句充分利用索引,尽可能减少merge join前的排序操作,减少Bookmark Lookup操作。
一般情况下,如果无法满足nested loop条件,会考虑对merge join方法的评估。merge join的选择,主要是考虑两个输入的数据量,以及分别对应于关联字段是否能够命中索引。例如tableA join tableB,关联字段在两个表中都能命中索引,数据量超过了nested loop的选择范围,则会考虑使用merge join方法。当然,如果tableA和tableB的数据量过大导致评估出来的成本过高,则会放弃merge join而评估hash join了。
使用inner merge join或者option(merge join)强制使用merge join方法。
3. hash join
hash join有两个输入:build input(也叫做outer input)和probe input(也叫做inner input),不仅用于inner/left/right join等,象union/group by等也会使用hash join进行操作,在group by中build input和probe input都是同一个记录集。
同nested loop,在执行计划中build input位于上方,probe input位于下方。
hash join操作分两个阶段完成:build(构造)阶段和probe(探测)阶段。
Build阶段
这个阶段主要构造hash table。在inner/left/right join等操作中,表的关联字段作为hash key;在group by操作中,group by的字段作为hash key;在union或其它一些去除重复记录的操作中,hash key包括所有的select字段。
Build操作从build input输入中取出每一行记录,将该行记录关联字段的值使用hash函数生成hash值,这个hash值对应到hash table中的hash buckets(哈希表目)。如果一个hash值对应到多个hash buckts,则这些hash buckets使用链表数据结构连接起来。当整个build input的table处理完毕后,build input中的所有记录都被hash table中的hash buckets引用/关联了。
Probe阶段
在这个阶段,SQL Server从probe input输入中取出每一行记录,同样将该行记录关联字段的值,使用build阶段中相同的hash函数生成hash值,根据这个hash值,从build阶段构造的hash table中搜索对应的hash bucket。hash算法中为了解决冲突,hash bucket可能会链接到其它的hash bucket,probe动作会搜索整个冲突链上的hash bucket,以查找匹配的记录。
关于hash算法的细节,可以查看数据结构的一些资料。hash算法主要是用于大数据量的搜索,为了避免每次都象merge join一样在全部的数据中进行搜索匹配,通过合适的 hash函数,先给要搜索的数据根据hash key建立hash值作为索引,在搜索时,先通过hash值定位到一个较小的搜索范围,然后在这个范围中搜索匹配符合条件的结果,以提高效率。
SQL Server将数据量较小的表作为build input,尽量使根据build input构造的hash table能够完全放在内存中,这样probe阶段的匹配操作就完全是在内存中进行,这样的hash join叫做In-Memory Hash Join。
如果build input记录数非常大,构建的hash table无法在内存中容纳时,SQL Server分别将build input和probe input切分成多个分区部分(partition),每个partition都包括一个独立的、成对匹配的build input和probe input,这样就将一个大的hash join切分成多个独立、互相不影响的hash join,每一个分区的hash join都能够在内存中完成。SQL Server将切分后的partition文件保存在磁盘上,每次装载一个分区的build input和probe input到内存中,进行一次hash join。这种hash join叫做Grace Hash Join,使用的Grace Hash Join算法。
伴随着大数据的hash join运算,还会有standard external merge sorts、multiple merge levels、multiple partitioning steps、multiple partitioning levels,SQL Server还可能会使用Recursive Hash Join等算法或其它的优化手段。
hash join一般都用于大数据量的操作,例如join中某个表的数据达到一定程度或者无法一次加载到内存,另外如果你的关联字段在两个join表中都不能够命中索引,也是使用hash join来处理。因此一般情况下,hahs join处理代价非常高,是数据库服务器内存和CPU的头号杀手之一,尤其是涉及到分区(数据量太大导致内存不够的情况,或者并发访问很高导致当前处理线程无法获得足够的内存,那么数据量不是特大的情况下也可能需要进行分区),为了尽快的完成所有的分区步骤,将使用大量异步的I/O操作,因此期间单一一个线程就可能导致多个磁盘驱动器出于忙碌状态,这很有可能阻塞其它线程的执行。
使用inner hash join或者option (hash join)强制使用hash join方法。
建议
三种join方法,都是拥有两个输入。优化的基本原则:1. 避免大数据的hash join,尽量将其转化为高效的merge join、nested loop join。可能使用的手段有表结构设计、索引调整设计、SQL优化,以及业务设计优化。例如冗余字段的运用,将统计分析结果用service定期跑到静态表中,适当的冗余表,使用AOP或类似机制同步更新等。2. 尽量减少join两个输入端的数据量。这一点比较常犯的毛病是,条件不符合SARG(光这一点就有很多高超的技巧可以发挥),在子查询内部条件给的不充分(SQL过于复杂情况下SQL Server查询优化器经常犯傻,写在子查询外部的条件不会被用在子查询内部,影响子查询内部的效率或者是跟子查询再join时候的效率)。另外也是设计、业务端尽量限制这两个输入的数据量了。
关于业务设计方面的优化,参考以前写的一篇post:系统分析设计 一个JOIN问题解决方案的感想 重视业务分析设计。
补充(2007.06.27):关于SQL Server
大致看了下SQL Server 2005,执行计划的显示确实有一些不一样,但主要部分或者说原理上是差不多的,不会有多少偏差。上面的示例SQL,在tableB上面使用非聚集索引时,SQL Server 2005的执行计划图如下:
一个主要的不同点是SQL Server 2000下面Bookmark Lookup操作,在2005下面显示成一个RID Lookup操作 + 一个Nested Loops操作实现,其实这也是很好理解的,可以说这样显示执行计划更合理一点,让你一看到这个操作,就知道它是通过一个循环机制到tableB中获取实际数据。
另外一点是,将鼠标移动到执行计划的图标上面后,弹出的提示信息的一些改变,例如2005里面会显示每个操作的输出列表(output list),而我上面的文章中基本都使用“输出数据结构”这样一个词汇在表达。通过查看output list,你更能明白RID Lookup(Bookmark Lookup)这样的操作存在的理由了。
最后,2005里面可以将图形显示的执行计划保存下来,以后可以打开再以图形方式进行查看分析,这个在2000下面是不行的,2000只能保存执行计划的文本。这样一些小功能对于分析SQL性能非常有用,在图形界面上的分析更直观。
篇14:通往性能优化的天堂地狱 JOIN方法说明性能调优
前言
不管是博客园还是CSDN,看到很多朋友对数据库的理解、认识还是没有突破一个瓶颈,而这个瓶颈往往只是一层窗纸,越过了你将看到一个新世界,
04、05年做项目的时候,用SQL Server 2000,核心表(大部分使用频繁的关键功能每次都要用到)达到了800万数据量,很早以前查过一些相关表,有的达到了3000多万,磁盘使用的光纤盘,100G空间,每周必须备份转移数据,否则100G空间一周会满掉,这个系统几年来,目前仍然保持非常良好的性能。还听说过朋友的SQL Server 2000数据库工作在几十TB的环境下,高并发量,对这种级别的驾驭能力我还是差的很遥远。
想当年,也是一提SQL Server,就觉得它的性能没法跟Oracle相比,一提到大数据处理就想到Oracle。自己一路走来,在本地blog上记录了很多优化方面的post,对的错的都有,没有时间系列的整理出来,这篇文章将join方法的概念稍微整理在一起,给大家个参考。通过查资料了解里面提到的各种概念,在实际中不断验证总结,完全可以对数据库一步步深入理解下去的。
我只对SQL Server 2000比较了解,但这并不阻碍我在Oracle、MySql进行SQL调优、产品架构,因为在数据库理论原理上,各大数据库基本出入不大,对数据库的深入理解,也不会影响你架构设计思想变坏,相反给你带来的是更深层次的思考。
RicCC:2007.06.26
关于执行计划的说明
在SQL Server查询分析器的Query菜单中选择Show Execution Plan,运行SQL查询语句,在结果窗口中有Grid、Execution Plan、Messages三个Tab。看图形形式的执行计划,顺序是从右到左,这也是执行的顺序。执行计划中的每一个图标表示一个操作,每一个操作都会有一个或多个输入,也会有一个或多个输出。输入和输出,有可能是一个物理数据表、索引数据结构,或者是执行过程中的一些中间结果集/数据结构。鼠标移动到图标上,会显示这个操作的具体信息,例如逻辑和物理操作名称、记录的数量和大小、I/O成本、CPU成本、操作的具体表达式(参数Argument)。鼠标移动到连接箭头上,会显示箭头起始端的操作输出结果集的记录数、记录的大小,一般情况下可以将这个输出结果集理解为箭头结束端的输入。
另外关于执行计划的一些补充说明:1. 执行计划中显示的信息,都是一个“评估”的结果,不是100%准确的信息,例如记录数量是取自统计信息,I/O成本、CPU成本来自执行计划生成过程中基于统计信息等得出的评估结果。2. 执行计划不一定准确,一方面受SQL Server维护的统计信息准确性的影响,另一方面SQL语句编译时刻与执行时刻的环境(内存使用状况、CPU状况等)可能会不一样。
关于统计信息、I/O成本和CPU成本的评估、SQL语句的编译和执行过程,这里不再深入。另外尽管执行计划不一定准确,但它仍是SQL语句分析最重要的依据,因为你可以理解为,绝大部分情况下,SQL Server是以这种方式来执行的。
JOIN方法说明
数据库中,象tableA inner join tableB、tableA left out join tableB这样的SQL语句是如何执行join操作的?就是说SQL Server使用什么算法实现两个表数据的join操作?
SQL Server 2000有三种方式:nested loop、merge、hash。Oracle也是使用这三种方式,不过Oracle选择使用nested loop的条件跟SQL Server有点差别,内存管理机制跟SQL Server不一样,因此查看执行计划,Oracle中nested loop运用非常多,而merge和hash方式相对较少,SQL Server中,merge跟hash方式则是非常普遍。
以SQL Server 2000为例对这三种方式进行说明,穿插在里面讲解执行计划的一些初级使用。
1. nested loop join
1.1 示例SQL
select ... from tableA inner join tableB on tableA.col1=tableB.col1 where tableA.col2=? and tableB.col2=?
关 键 字:MYSQL
★读后感
★读后感.
★读后感
文档为doc格式