Analytic Functions A Developer’s Best Friend

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
okay so today you not know about a my name's Tim I love talking about texts so if you've seen me around the conference over the next four days and I'm not asleep come up and grab me and talk to me that's what I do I work as a DBA in developer at the moment a UK University I'm not student facing they don't let me talk to students because I'll scare them so I've spent 23 years doing Oracle Tech but never worked for Oracle I've spent 18 years doing my website Oracle based comm so if you've googled something and got there that's what I do in my spare time because I have no life I go home and play around with Oracle and write about it as a result of that I got invited to the ACE program and then subsequently the developer champion program that became the Oracle groundbreaker ambassadors and I've got to go around the world talking about this which is pretty cool so jump straight in oh that sounded weird let's jump straight in what our analytic functions as anyone used analytic functions before might have called them windowing functions okay so what I'm gonna do is try and break this down so that relates it back all the time to aggregate functions because a lot of people get quite confused about analytics but they've got a pretty clear idea of what about what aggregate functions do so I'll constantly refer back to that it's just the easiest way I find to explain this stuff to people so analytic functions were introduced in Oracle 8i I believe auricle was the first commercial database to do this I could be wrong but now you can get them in lots of other databases and from MySQL 8 onwards you also get them in MySQL this is actually a little bit of a lie but once again it helps to explain what it is I'm talking about think of these as and the ability to compute aggregate values but without reducing the number of rows and it's probably easier if I actually show you an example a very simple example and that will give you the idea of what it means I'm not going to talk about syntax in this example so don't kind of get scared if you haven't seen it before it's really important with any Oracle statement that if you want the data to appear on-screen in a certain order you actually have a proper order by okay you will see order by all over the place in analytic functions and it doesn't mean the data will necessarily necessarily be ordered that way what it means is that the data set is ordered so the analytic function can be processed and we'll see some examples of that but let me just show you a quick demo so you get a feel for what we're talking about okay so what I've got here is SQL CL the little Java kind of replacement for SQL plus connected to Oracle cloud running against the automatic transaction processing cloud service so that autonomous database cloud service this could be something running on your local PC it's the same thing nothing I'm doing here relies on autonomous proto database but I just thought it was kind of nice to to use it rather than doing what we all do day in day out so first of all I want to show you an example of a regular aggregate function here what we've got is select average salary from M I'm guessing you're all familiar with the amp table what I've done here is got the average of the salary and I've aggregated 14 rows down to a single row and that's the average so that's a really standard aggregate function if I need a bit more granularity what I can do is include a group by so now I'm saying give me the department number and the average salary and because of this group by I've now got the average salary per department and that's exactly what I see so remember those numbers let them burn into your mind will refer to them in a minute but they'll be off-screen so standard aggregate functions really simple let's have a look at a pretty basic analytic function don't worry about the syntax effectively what I'm saying is do this but give me the raw data and I'll talk about the syntax in a minute but when I run that what I can see I put a skip in there so it breaks the department's apart to make it clearer but I've got all of the raw data from departments 10 20 and 30 along with those average values so I think that's probably the easiest way to visualize the difference between analytics and aggregates they're kind of similar but you don't actually aggregate the number of rows down to a lesser number you still have access to all of the raw data so let's start talking about what analytics really are if we were to look in the manual you'd see the basic analytic clause looks like this you've got analytic function whichever one it is potential arguments and then you have an over Clause the over Clause is mandatory and it's what turns this function call into an analytic call but the analytic clause itself is optional so you can just have over open and closed parenthesis and you've now got an analytic function you'll understand what that means as we go along the analytic function is made up of three optional pieces a query partition and order by and a window Clause if we were to look at the manual for what these are you'd see this partitioning Clause looks fairly simple the order by clause looks a bit more complex and there okay that's pretty ugly so I'm going to forget all that and I'm gonna try and liken this to aggregate functions to make it as simple as possible so the first thing we're going to look at is the query partition Clause essentially this is group by two for all intents and purposes what we're saying is we're going to divide the row set that comes back from the query into groups or partitions the important thing now is that the analytic function can only process within the partition just like an aggregate function can only process within a group by so what I can do now is have a choice whether to have the partitioning Clause empty which means treat all of the results set as one big partition or break it down into vit into individual pieces so let's have a look at an example of that it's really bad to have scripts with long names when you've got to tighten them in front of an audience you can feel the performance anxiety thing as a so the first thing we're going to do is a very simple example I've got employee number Department number and salary so the raw data from the table and then I've got the average salary over nothing remember an empty over Clause is valid what this means is I want to treat the whole result set as one big partition there's no ordering there's no windowing anything like that and so not surprisingly I get the whole result set coming out and I get the individual raw data as well as an average for everything if I want to start making this more granular similar to the group by and make it like the example you saw before I can say average salary over partition by Department number and this is effectively like saying group by so now the analytic function is constrained by the individual partitions and we get that average per partition so it's kind of quite simple I think the partitioning Clause as long as you think this is effectively grouped by everyone's happy should be pretty simple the next thing to consider is the order by clause now this is not surprisingly ordering the rows within a partition or the whole result set if it's not partitioned why does this matter well some analytic functions are order sensitive so the order of the rows actually matters and we'll see that in an example if I'm doing an order by Oracle assumes I mean ascending unless I tell it descending and the way it handles nulls is if it's ascending it assumes I mean little nulls last but I can tell it to put nulls first or ignore knows if I'm doing descending it assumes I mean put noise first unless I tell it to do differently so remember that point about the order by Clause is just for the analytic processing it doesn't necessarily affect the output of the query so just keep that in mind so the other very interesting thing to consider is that I can have multiple analytic function calls in a single statement so the data might have to be ordered in different ways in order for each of those calls which is another reason why you can't rely on it to produce a specific order of data coming out it's just about the order of the data when the analytic is applied okay so first thing we're going to do is say first value what first value does is it grabs the first value it sees so it's pretty order sensitive okay we really need an order by for this so in my head what I've thought is I want to get the worst paid person out of this so if I grab the first value in each department I'm going to get the worst place paid person awesome so what I've done is give me first value ignoring nulls partition by Department and I'm super cool and oh that's failed abysmally right so what's happened here well we know first value is order sensitive and I've not ordered the function call so what I've got is literally the first value that came out not the lowest value so it's important when you have an order sensitive analytic function you actually include the order by what I should have done is this where I said order by salary in this case I've explicitly said ascending with nulls last but that's not important that's the default so now what I'll get is an ordered set within the partition and first value will keep hold of the first one it comes across so now what I get is the lowest value in each group so first value order sensitive I must have an order by but just to prove to you I can have multiple calls what I've done here is I've done first value ordered by salary ascending and then first value order by salary descending in the same call so what I've actually done is the lowest paid person in the department and the highest paid person in the department I've captured their details their salary so what I've got is all 14 rows the raw data including the individual salaries but I've also captured the lowest paid person in each department and the highest paid person person in each departments without reducing the total number of rows so it's really kind of cool when you're doing reporting and comparing things like for example where do I fit into the pace game this is really easy a lot easier than doing this programmatically I started my time in Oracle 7 and I used to have to write pl/sql that tracked old values and new values and tried to put it all together it was really annoying this is super easy so the last thing I want to talk about in terms of syntax is the windowing clause now this tends to freak people out at first but there's two things to say about it one as soon as you know what it's doing it's pretty easy and two you'll often not use it anyway so I would say maybe one percent of the time I'm using analytic functions I actually specify a windowing clause because most of the time I don't need to but just bear with me so what's the purpose of the windowing clause it's to reduce the size of the window of operation of the analytic function remember I said that the analytic function applies to the whole partition or to the whole result set if it's not partitioned well what we can do with the windowing function is actually reduce that size further so if there's a need we can actually say I want this to be applied to a smaller subset of the rows in the partition and we have an option of using range between which is a reporting range so that will be any rows that are within this range irrespective of how many up or down the result set I'm going or rows between where I explicitly say how many rows of data the window size is so imagine a situation like this where I say my window is actually one row preceding and one row following the current row if I were on the top of the partition this is the current row there is no preceding row but there is a following row that's the window of operation for the analytic function if I'm in the middle of the partition I have one row preceding one row following if I'm at the bottom there is no following row so I just have bro and the preceding row so it's important to remember what this is doing in the context of a partition how do we specify a window well we have a few presets so we have unbounded proceeding which means top of the partition we have unbounded following which means bottom the partition current row can you guess what that means but we also have the ability to have either exact values or reporting values using preceding and following the thing that tends to screw everyone over the first time they use this is this the default windowing Clause is range between unbounded preceding and current row so as soon as you put an order by in you get this if you don't understand that's what it's doing it can be quite confusing and I'm going to show you a really silly example now of a mistake you could easily make and I've made this and why it's so confusing if you don't understand that okay so what I've decided to do is I want to get the average part of the salary per department and I'm awesome so what I've done is this and I'm very proud of myself because I've just said yeah get me the average over the partition by department and that's all cool but what I haven't noticed is I've been a bit stupid and added in order by salary now average isn't order sensitive so this is pointless but I thought I was clever I'm gonna add it in what does that done it's actually not giving me the result I expected because I was expecting to average all three of these and get that out and it's actually given me a running average that's because the default windowing clause is range between unbounded preceding and current row so what it's done is said unbounded preceding doesn't exist average of one row unbounding preceding does exist average of two rows embodied preceding does exist average of three rows it's a running average this might look a little bit strange to you it's because it's ranged between so it's actually these two have the same value so what we get is average of this average of these three straightaway because it drops to the bottom of the reporting value and then this is the same average again average of all three if this were rows between unbounded proceeding to unbounded following a current row we would see that as a regular reporter running average so that's one silly mistake and you get a very different result because you didn't know about the default windowing clause the obvious solution is to remove the order by we've seen that work but if for some bizarre reason I wanted to keep the order by then I have to make sure the windowing Clause is correct and what I might do is something like this range between unbounded proceeding and unbounded following and that then gives me what I expected so I'm not suggesting you have an order vibe with average but it does highlight the point that the windowing clause can be a little bit confusing when you start using it and remember as soon as you have an order by you have a windowing clause okay so currently what we have is these analytic functions available so I'm going to talk a Dena sium about each and every one of them until your eyes start to bleed what I'm going to do is pick a few of them that I find myself using repeatedly obviously in your job you may do other things but I tend to find myself using a certain few of them all the time now there's a asterisk next to some of them what that means is they support a full analytic clause the partition order and queer and windowing clause the ones that don't typically because they don't need to the job they do doesn't really rely on having that full clause so it's not that they're broken or they're not up to date or something it's just they don't need it but you'll see that so I thought it's worth explaining what that means so let's just jump in and have a look sorry yeah come on let's just jump in and have a look at a few of them that I find myself using all the time so we'll start with ranking so you often want to apply a rank or a sort of number to a set of rows from top to bottom or bottom to top to say this is the top one or this is the bottom one what use is a function called rank so here we've got the raw data rank over partitioned by Department order by salary and what this is going to do is it's going to order the data in salary order and apply a rank to each row based on the salary so effectively what we've got is Olympic meddling now in this case it's order by salary so it's smallest to highest so what I've got is in each department number 1 2 3 notice what happens if I get a tie it's probably better to look at this one I get gold medal position the worst paid person in the department I'm not sure that's really gold medal position but then we have a tie for position 2 so just like the Olympics no one gets bronze there's a gap there's no third position and then we get fourth position so rank allows us to apply a rank to the data in a specific ordered set if you don't like this gap if you don't want it then we can use dense rank so dense rank does the same thing but then it compresses the numbering so that we don't have olympic-style meddling what we get now is one two two three four so it's no longer Olympic meddling but we still have a rank why is this important well often when we're reporting on data we want to do things like top end queries where we say hey give me the top 5 or the top 1 from each department well that's really easy to do because what I can do now is say here's the select statement I just run ran and I'm getting the rank out of it and then I'm going to put that in an inline view or maybe in a with Clause if I wanted to and say just give me the values where they're number one rank so effectively in this case because it's ordered by salary descending the top paid person in each department and I get that now because Department 20 has two people on the same salary the top person is actually two people ok so that sort of grouped top end query is really handy and ranking whether it's rank or dense rank allows us to do that we also have a very similar situation with row number so if you've ever used row num to limit numbers of rows this is kind of similar but it's processed as an analytic functions so it does actually on understand the order of the data unlike Ronan because if you say and Ronan is less than equal to 5 it's literally the first five rows you get and then the date is ordered so it's not a proper top n query it's very silly in Oracle but what we can do with row number is essentially the same as rank but it's no longer any form of Olympic meddling it's literally a number from one to end for every row so here I've got row number over order by salary so what I'm doing is saying this is one big partition the whole result set give me effectively a rank but there are no concept of ties so that's pretty straightforward and of course I can partition by department and get a rank per departments we're using row number but notice also that there is no concept of ties now so if you need an absolute number of rows then you're probably is row number once again this is really useful in a top-end type query where I can say run that other query just capturing the rank of each row and then only give me rows where in this case they're in the top two so this is order by salary so the top two is actually the bottom two people in every department and these are the unlucky people so any sort of ranking system whether use rank dense rank or row number really handy for those sort of top end queries let me just remind myself what's next list AGG okay so if you were to go onto my website I've got an article called string aggregation techniques and it's got about six or seven different ways of doing this then in Oracle 11g we got given list AG which really made every other example pointless with list AG what we do is say what I want to do is aggregate in this value in this case employee name I want the separator to be a comma that's the default and I want this to be done within the group so for example I've got group-by so it's not a normal analytic because it's based on the group and I want the names to be ordered so what does this give me it gives me Department number and a comma-separated list of employees so I virtually zero effort to get that and if you look at some of the other alternatives to doing this prior to this tag being introduced in 11g some of them are quite complicated so really useful thing I tend to use all the time the next thing we've got is lag lead okay lag and lead were the first things I ever used with analytic functions back in Oracle 8i days and it kind of blew my mind because I was writing real-time control systems the controlled cranes and conveyor belts and we were constantly having to look at previous and next values in a result set so you had to just keep the rows and work your way down it was really ugly then a tie came out and just thought wow I can just do this in a simple select statement so let's have a look at that what we've got is our raw data salary again but what I'm saying is give me the lag look up the result set by one row if there's no row there give me back the default value of zero order by salary so I've got the result set I've got my current row of data but then I'm looking up one row to get the salary of the previous row and lead looks down the results set and it's giving me the following row so what we can do then is see that my salary is 800 previous salary doesn't exist because I'm the worst paid the next salary is 950 and that's correct I'm paid 950 previous salary is 800 next salary is 100 and row is 111 I've got a feeling that tonight's going to be a bad night not a good night okay so laggin lead allow you to look up and down the results set really handy if you're having to do those running reporting of what's going on in a can Harrison luckily that was the end of that demo first value we've already seen I'll show you that again though and then show you a comparison to last value which kind of sounds obvious but may not be so obvious for a different reason [Music] okay so first value we've seen this give me the first salary ignoring knowles over department number or by salary so effectively the lowest paid person in each department we've seen that already that's cool what I can also do is and this is really only showing you for an example of something that's great and also bad about analytics what I've done here is said partition by Department ordered by salary rows one preceding so what this does is effectively mimics lag because what I've got is hey give me the previous the the lowest value out of the current row and the one before it well there isn't one before it so that's the current row but hey this is me and that's the lowest out of these two and that's the lowest out of these two so it's almost like mimicking lag but by using first value and a windowing clause one of the things that's kind of great about analytic functions is they're so flexible but it can also make them very hard in the early days because you can often find two or three solutions to the same problem and that can be quite confusing if you prefer to pick one and someone you work with the first to pick another so you know you've just got to add this to your tool belt and just keep playing with it until it becomes natural but first value you've seen that before but there's a lot of variation with the windowing clause last value seems pretty obvious and it kind of is but there is a little bit of a gotcha so last value order by say partition by Department ordered by salary that's going to give me the highest paid person in every department isn't it oh it's not done that why well I had an order by without a windowing clause and we now know the default windowing clause for an order by is unbounded proceeding to current row so we get that situation where it's effectively a running total again so if I'm going to use last value I have to be sure that I have decided what my window of operation is so probably in this scenario what I needed to do is see say range between unbounded proceeding and unbounded following that way I would get the highest paid person in the department I would get right to the end of the partition and do that so the gotcha with last value is you've got to understand the window in clause because by default it won't give you what you expect it to unless you understand the default I often find myself not using last value but using first value with an alternate ordering the only reason why this is a good idea though is the Oracles pretty clever and the optimizer if it sees multiple analytic function Clause with the same ordering it doesn't have to reorder the data so if you're already ordering the data say in ascending for a first value it probably makes sense to do ascending again and use last value rather than order by descending and use last value otherwise you've got two sets of ordering when you could get away with one so even though I tend not to use it on its own it's still valuable because you want to reduce the total amount of ordering that's happening because it takes time and effort what else have we got oh yeah okay I'll so I'll show you an example of actually doing something vaguely analytical so let's have a look at core so what core do does is a Pearson correlation or a coefficient of correlation and what this means is for this particular test if I get plus one it means there's a positive linear correlation that the longer you've been employed by the company the more money you get paid if I get a zero out it means there's no correlation so it means there's no evidence to suggest that time served equals pay if I get a negative linear correlation what it means is the the longer you work the less you get paid so imagine market rate was shooting up and you were employed ten years ago and you've just got a little pay rise every year you're the worst paid person even though you've been there twenty years it's kind of like that situation so what we're going to do is use Coar to actually look at the data so I've got the empty ball again not surprisingly because it's nice and simple and what I'm saying is I want to see a Pearson correlation coefficient of these two values the amount of time served which is sysdate minus the date you were hired compared to salary and I'm doing this on the whole result set with no partition and what I can see is there's not really anything if I look at the company as a whole there's not really anything that outstanding guy pre I'm getting very close to like no correlation so there's no indication that pay is linked to length of time served in the company so let's have a look at what happens if I partition the data up so in this case I'm saying hey let's do this comparison based on departments so I want to compare how long you've worked to how much you've got paid on a department basis and let's see what we see okay in Department 10 there is a very small positive correlation but it's way off being one so I'm going to count that as being no correlation Department 20 similar well actually no it's yeah it's it's similar it's a bit worse but notice how when we get to Department 30 with manage the manager and the sale a lot of sales people we suddenly get a much stronger correlation so that does start to be something that indicates that longer they've work the more money they get let's try it based on job instead of on Department so now what I've got is the same correlation but notice partition by job and what we see now is the way this works is if it can't really make a good conclusion because it's either an empty set or a set it can't make a conclusion on you get a null back which is why we've got those and what we can see is if we look at Clark's then there's actually a little bit of a negative correlation so the longer they're there you know the worse they get paid but it's not that close to one but holy cow if you're a manager you know those people that don't understand what to do and shout at you a lot then there's quite a strong correlation between how long you've served and how much you get paid but if you're a sales person that correlation is a lot less which I think is correct because sales people are liars and therefore we shouldn't please that video that bit so you know it's quite easy using analytic functions to start drilling into your data without having to have cool tools to do it I'm not suggesting you do this rather than use cool tools but this is actually your fingertips and this could be maybe you know an interactive report in Apex or something sitting behind on top of this query you know you can get some quite good information out of it and the important thing is this is done on the database the data and this functionality is so close together that you're not wasting a lot of time if you would either pulling all of this data into say tableau and then ordering it you've got a lot of network traffic if you were trying to do this programmatically with pl/sql or Java or.net you've got a lot of loops and stuff to do this is actually doing it in SQL so I would do this at some conferences and people would say no I should do this in no js' or something and that's fine if that floats your boat but to me having this processing as part of the SQL ANSI standard you know it just seems like a no-brainer so one of the things I want to mention is a feature that appeared in 12c it's not apparently anything to do with analytic functions and it's a little bit of syntax candy so what we have is the ability now to say from 12c release 1 onwards give me an ordered set of data and say fetch the first 5 rows only so if you've used MySQL and used the limit clause this is like that I don't have to worry about doing say in line views ordering the data and pulling the data right I can just do this I also have the ability to use offsets so I can page through data have the ability to say fetch first 20% of rows only things like that so it's kind of nice so why am i mentioning this in an analytic functions talk well this is just syntax candy you put this in and the optimizer does something with it if you were to do a one zero zero five three trace and look in the huge trace file that's produced you'll find a section that says final query after transformations and it shows you what the server's actually run in order to do that whoops in order to do that and what it's run is this and so what the optimizer has done is rewritten that syntax candy into an analytic function so even when you don't know you're using analytic functions maybe you are I'm not suggesting that you should write this straight away because that's super nice and super easy and I'm happy that the optimizer is doing some of my job for me but just so you know analytic functions are being used all over the place another thing that's worth mentioning that appeared in 12c is another type of analytic function called much recognize this is for pattern matching you can go and see whole talks on this so I'm just going to be very brief but I do think it's important that you are at least aware of it what does this do it allows me to look for patterns in the data so rather than very simple things I might do something like say look for fraudulent transactions what you'll see with things like betting or with say credit card type fraud is people often make a series of smaller interactions in a certain pattern and some companies literally employ departments of people looking for this so what we can do with pattern matching and it looks a little bit scary is we can actually define a few scenarios so I've defined up as the unit sold is higher than the previous units sold flat is they match and down is that the unit sold has gone down and then what I've done is I've defined a pattern here that is the pattern starts and I'm looking for it to go up flat and go down and this will find all occurrences of that in my data so we you might look for a specific thing like a small rise a drop a big rise things like that you can do that with pattern matching the syntax is a little bit scary at first it's a bit like the model clause you look at it and just think now I'm not going to do that but once you get used to it's pretty straightforward so once again another type of analytic that might be useful for you depending on what you're trying to do so in summary I'm guessing I'm pretty close to the end of my talk I hope I am otherwise it's going to be a long question-and-answer session analytic functions incredibly flexible I'd like to think of them as being post query processing I started life as an Oracle forms programmer and so I often think of things back to that sort of scenario where hey this is my data and I want to do something for every row it isn't actually doing that but in my head that's how I visualize it typically this is going to be much faster than a programmatic version of doing this because you're so close to the data of course every time you make something more complex you that's more work for the database to do but it's probably better that we're he's done close to the data than somewhere else five minutes left they're very flexible which as I said before is a great thing but also a little bit scary at times because there's always multiple ways of achieving it but what will often happen with me is you'll see me on Twitter say something like analytic functions save the day again because I've been doing something and just thought I don't understand how to solve this problem with SQL I'm just not good enough at it and then my brain kicks in and says oh yeah there's a really easy solution to this with analytic functions I do it and then go on Twitter and say analytic functions save the day again so if you follow me and you see that you know that my brain has just kicked in okay like everything in life it's all about the amount of time you spend with it if today is the first day you've heard heard of analytics you'll walk out the door and think I don't know what that fat guy from Birmingham has been saying to me for the last 45 minutes if you have been playing with them they'll be easier the more you use them the easier they'll get so just try and keep using them even if it's I've got a good solution anyway but I'll see if I can do that again in a different way just to get more familiar because the more you use them the easier it'll get so before I open up to questions remember I have this website Oracle based com I told most people at the start it's what I do in my spare time because I have no life there's a very plain page called Oracle based calm slacks workshops on there you can see analytic functions a developer's best friend the PDF the slides themself demo code that I've ran here but more importantly this article I tend to have an article for every talk I do but in this case because it's mostly live demos the article is really just links to all the individual articles on the functionality I've discussed and that is the wrong one sorry when I walked in I thought I was doing a different talk today let's have a look - oops functions I suppose I could have really just used that link that was on the previous page which you'd be more sensible there you go so actually this is a lot clearer because what you get in this article is not surprisingly everything I said today so if I'd be nice I could have shown you that and you wouldn't have had to sit through this listening to me but if you're interested search for analytic functions I think if you google analytic functions this is what you get anyway I think on top of the rankings for that so has anyone got any questions ok ok so the question was can I say something about the CPU usage analytic functions is nearly always gonna have some ordering involved ordering is takes time ok so certainly if I just do select star from table and compare that to something that's got even a conventional order by in there's going to be an impact on that because the data has got to be sorted in order to apply the analytic function assuming it is data that requires a sort like an order sensitive analytic function so effectively think of this as you've got as many order bys as it takes to apply the analytic function so let's say I'm I'm asking for ordered by salary then that's a conventional order by in order to then apply the analytic function if my query then has a proper order by at the very end then that's another sort operation again so I'm not trying to make out this is free it's free and monetary cost but it's not free in processing power cost but the alternative is to pull all of that data out into the middle tier and do that crunching there which involves network traffic and CPU there if you happen to be processing in a way that you think that's more efficient because you've got great work and unlimited amounts of middle tier servers to crunch that by all means go ahead and do it but what I tend to find is it's a lot more efficient to do this at the database level we've gone through this cycle where we've been told that doing stuff on the database is evil and the database is a bit Bukit and what is starting to happen a lot more as you're seeing people move back towards the database for some operations there are some things that are very good in the middle tier and should never be done in the database and some things that are very good in the database and I think this is one of them but there will always be an exception I'm sure there are things that Google and Twitter do that this would not work for because they are not what I do okay so you always have to be a little bit careful about how you judge a piece of technology because we're not all doing the same thing that Google and Twitter are doing therefore their solutions are not necessarily appropriate to me so yeah there is a cost and it's the cost of ordering the data anything else if you do shy to ask a question in front of the crowd just come and grab me outside I'll hang around for a bit or comment to the front when we finished thank you very much for coming and being registered early enough to come well done you okay I've got a few talks this week on various things if you're interested what have I got I think I've got them listed here so that I don't forget even though I totally forgot this morning tomorrow I've got cool new features for developers for 18 C and 12 C they're just things that I think are cool I've got a 5 minute sort of slot in a multi slot talk about a time that I destroyed my database but didn't get the sack which is going to be fun I'm on the beer demo for blockchain down at the groundbreakers ambassador's booth so if you want to come and get free beer whilst listening to me talk about blockchain for about 2 seconds between 2:00 and 4:00 tomorrow and then on Thursday I've got to talk about docker so if you're interested in docker from a DBA perspective feel free if ever you see me and I am awake prod me and say I need to talk to you about X and I'll do my best if I don't know the answer after 23 years of doing this and 12 years in Evangelist programs I'm pretty sure I know someone that does know the answer so I'm happy to help thank you very much for coming enjoy the conference [Applause]
Info
Channel: Oracle Developers
Views: 7,405
Rating: 5 out of 5
Keywords: oracle, oracle cloud, oracle developers, cloud, cloud computing, platform, infrastructure
Id: 50HOQBA19T4
Channel Id: undefined
Length: 47min 6sec (2826 seconds)
Published: Mon Oct 22 2018
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.