Tags: Oracle 11g Database, technical tips
If you’ve been using the Oracle database for as many years as I have, I’m sure you’ve noticed how Oracle tends to tweak the contents of the SGA from one release to the next. Oracle release 11g is no exception to that trend, and starting with this release we now have two more caches in the Shared Pool: one called the SQL Query Result Cache and another called the PL/SQL Function Result Cache. These two caches differ from virtually all of the remaining memory areas of the SGA in that the data stored in these two buffers are NOT blocks of data. Rather, the data stored is stored in terms of returned rows from either a SQL or PL/SQL command.
Why might Oracle choose to store the results of a user’s SQL command or the return results of a user’s PL/SQL function? Simply put, if a request for a query comes along that is identical to a previous query request that Oracle had stored in one of these buffers, then it’s possible for Oracle to re-use that prior result set. This technique is even better than checking to see if the commands are identical, so you can potentially save reparsing. If the prior result set matches the new request, and the prior result set is stored in the buffer, then we can skip the effort of parsing as well as any logical or physical reads to bring blocks into the database buffer cache. Obviously, Oracle has to be sure that the result set is still accurate before deciding to use it based on a subsequent SQL statement.
Oracle has the overall responsibility for managing these two new memory areas, but you can influence the optimizer using hints such as RESULT_CACHE, the DBMS_RESULT_CACHE package, and the RESULT_CACHE_MODE init.ora parameter. The following link in the Oracle 11gR2 documentation set,
will take you to an overview explanation of these two buffer caches. It will also provide links to the details of the SQL Result Cache and another to the PL/SQL Function Result Cache.
Until next time,
– Bob the OrclTestGuy
Tags: cloud computing ellison oracle
It’s possible that you may have seen Larry Ellison, the CEO of Oracle Corporation, discussing Oracle’s philosophy, offerings, and advantages as it relates to cloud computing. It’s one of Larry’s favorite topics, and to hear him speak he’d say that cloud computing is something that Oracle has been working on for almost 7 years. And what Larry is referencing is Oracle’s efforts to rewrite all of Oracle’s ERP applications into something called Fusion. Fusion is Oracle’s Open Source project to replace the entire stack of applications from Oracle’s e-business suite, PeopleSoft, and JD Edwards. The fusion applications (of which there are just over 150) and its associated 11g R2 database, along with the Enterprise Manager 12c Cloud Control, provide you with the power to monitor and manage all of these features, regardless of whether your application is sitting on a server in your own datacenter (private cloud) or a server in Oracle’s datacenter (public cloud). And because of the Open Source standards, it’s easy to move your application from your datacenter to Oracle’s, or from Oracle’s datacenter back to your own.
Oracle’s initial Application Services offerings appear to be in the areas of Fusion CRM and Fusion HCM. Customer Relationship and Human Capital comprise a big chunk of the ERP, but it’s certainly not all-inclusive. I think we can safely assume that more components should be arriving shortly. Each application also provides “built-in” social networking to identify teams and provide tools for collaboration among the team members. This appears to be something Oracle picked up in its recent acquisition of the social media company Involver. And the data that Oracle collects from its social media links will be thoroughly analyzed to detect trends, buying habits with the help of the purchase of another company specializing in social analytics, All Things Digital.
Oracle hasn’t ignored those who may want to build their own custom cloud solutions using open standards. Oracle’s public cloud currently provides platform services for a Java Application Server as well as the 11gR2 database. And Oracle emphasizes the ease of moving applications from your private cloud to a public cloud, and then to another public cloud, and so on back to your own private cloud. According to Oracle, this is all made possible because open standards (such as SQL and Java) are used to build the apps. And the tool which allows Oracle to deliver the database as a service is called vFabric Data Director 2.0 from VMware.
I believe the jury is still out on whether this technology is here to stay. For organizations who want to simplify their investment in IT or provide opportunities for their developers to pursue more challenging opportunities this may be a wise decision. If you have any experience with any vendor’s public cloud, please share them with us on this blog.
Thanks for reading and sharing!
Tags: Oracle, tech tips
Hello, Oraclites. Have you taken a look at the new (well, relatively new) MERGE command that is now part of ANSI SQL? In many cases, incorporating the MERGE command into your application can replace writing a 10 to 20 line program in PL/SQL. And that will lead to significantly improved performance. This is definitely one of those cases where “less is more.”
How does MERGE work?
The MERGE command functions as either an INSERT command or an UPDATE command all in one, depending upon a condition that you specify. And just like INSERT and UPDATE, the new MERGE command is a DML command. If you totally hose your data trying out the new MERGE command, you can do a ROLLBACK. No harm, no foul.
Here’s an example that everyone can probably relate to. WIDGETS Incorporated has 10,000 active and inactive employees, and thus 10,000 rows in the emp table. The column status contains an I for inactive employees, and an A for active employees.
Here is the description of the emp table:
id NUMBER(5) PRIMARY KEY name VARCHAR2(20) NOT NULL dept VARCHAR2(10) NOT NULL salary NUMBER(10,2) hire_date DATE status CHAR(1)
There’s also a new_emp table created by HR and used nightly to update the emp table. HR assigns a new unique ID to new employees who have never worked for WIDGET before, but those who have are reassigned their previous ID. The number of rows in new_emp varies night by night, but averages around 20 rows. Usually one or two out of the 20 represents a rehire. The structure of the new_emp table is exactly the same as the emp table; only the data is different.
What HR wants to do, and the MERGE command allows them to accomplish, is to add the personnel data for a new hire who has never before worked for the company, and assign that employee a status of A (for active). In the same pass through the data, the command should update the emp table by locating inactive employees who have been rehired. When those records are found, the status should be changed from Inactive to Active, and the starting salary when this person is rehired should be updated in his or her row in the emp table. We’ll take care of updating the other columns later.
MERGE INTO emp E USING (SELECT id, name, dept, salary FROM new_emp) N ON (e.id = n.id) WHEN MATCHED THEN UPDATE SET E.dept = N.dept, E.salary = N.salary, E.hire_date = sysdate, E.status = ‘A’ WHEN NOT MATCHED THEN INSERT VALUES (N.id, N.name, N.dept, N.salary, SYSDATE, ‘A’);
This should solve their problem! The merge (either Inserts or Updates) are going to happen to the emp table. We are going to use the data returned by the SELECT to compare each returned row with each row in emp to determine if the values of id are equal. If they are, we’ll do the update in the “WHEN MATCHED” clause. If they aren’t equal, we’ll do the INSERT in the “WHEN NOT MATCHED” clause.
That’s pretty neat, and what’s really great is we don’t need to write a program to accomplish it. Furthermore, we can deal with all the rows in a single pass of the data.
If you like this, take a look at multitable INSERTS, another great feature for developers and DBAs.
–Bob the OrclTestGuy
Tags: function-based index, oracle tuning tips
There are a number of reasonably easy steps that database administrators and database developers can take to improve the performance of both an Oracle database and the applications that run against the database. Some of these steps would probably be considered the responsibility of the DBA; others would typically be handled by the application developer. Of course, there are a number of shops where the IT professional wears multiple hats, so I’ll just provide the tuning information and leave it to you to determine who in your shop might find this useful.
Let’s take a look at the world of indexes when it comes to speeding up data retrieval. Normally, it would be good practice to put an index on a column of a table when the following conditions are met:
- The table is relatively large.
- The column doesn’t have many nulls.
- The data in the column has good cardinality.
- There isn’t a lot of DML activity against that column going on in your database.
- Your application code often uses that column to search or sort.
- The indexed column isn’t typically involved in a mathematical expression or a function.
Take a look at this code:
SELECT student_id, major, class, advisor FROM students WHERE last_name = ‘Monsalvatge’
Assuming there are thousands of rows in the students table, and that there are very few rows where last_name is NULL, there are very few last names that are identical, last names don’t need to be updated often, and that our statement runs many times during the day, then according to the 6 rules above it would be a good idea to create a B-tree index on that column. (I wrote more about B-tree indexes in this post here.)
But now consider this situation. Suppose the way last names got entered into the table wasn’t very well controlled. Different users used different capitalization standards when they entered the last names. Some had the last name in all caps, some had it in mixed case, and others had it in all lowercase. If the last name stored in the database is ‘MONSALVATGE’ or ‘monsalvatge’ or ‘MonSalvatge’, it will not match the literal ‘Monsalvatge’ string in the SELECT statement, regardless of whether there is or isn’t an index on the last_name column.
But you’re a smart person, so you have a fix. You write your code like this:
SELECT student_id, major, class, advisor FROM students WHERE INITCAP(last_name) = ‘Monsalvatge’
Now the SELECT statement will find what it’s supposed to find regardless of how the capitalization of last_name is stored in the database. Good job!
That’s the good news, but there’s some bad news as well. Remember that index we built on the last_name column? It’s still there, but guess what? According to rules above, the column we have indexed (at least in this specific SELECT statement) is having the function INITCAP applied to the column before the WHERE clause comparison is made. When that happens, the optimizer is unable to use the index on that column. The same would be true is we performed any other manipulation or function to the last_name column.
Consider this SELECT:
SELECT student_id, major, class, advisor FROM students WHERE tuition > 5000
In this case, if the six conditions listed above are met, then you probably want an index on the tuition column. However, if there was B-tree index on the tuition column and your SELECT was written like this:
SELECT student_id, major, class, advisor FROM students WHERE tuition + 1 > 5000
then the optimizer would be unable to use that index because it has a mathematical expression on the index column (namely, add 1 dollar).
Interestingly enough, this SELECT statement is logically equivalent to the previous one:
SELECT student_id, major, class, advisor FROM students WHERE tuition > 5000 – 1
Recall from algebra class that adding 1 (one) to the left side of an equation or inequality is the same thing as subtracting 1 (one) from the right-hand side. Furthermore, the optimizer, when building the parse tree and execution plan, will be able to choose using that index on tuition, since the functions and/or mathematical work is on the other side of the equation/inequality.
So how do you solve this dilemma? If you don’t put in the function to adjust the capitalization on last name, then you won’t get all of the correct answers. That’s unacceptable! If you put the INITCAP function into your SQL statement, you will get all of the correct answers, but the performance will take a hit since the optimizer won’t be able to use the index you created on last_name.
To give you the best of both worlds, Oracle created function-based indexes. This is simply an index that is built, not on the column, but on the function or mathematical expression defined on the column. For example, to create an index on the INITCAP function applied to the last name column, you simply type the following:
CREATE INDEX my_func_indx_1 ON students(INITCAP(last_name))
And, if you want to create an index on the tuition column plus $1, you would simply type the following:
CREATE INDEX my_index ON students(tuition + 1)
You can even have more than one function-based index on the same column. For example, you might have one index on the INITCAP of last_name, and another on the UPPER of last_name.
Search your application code, and I’ll bet you that there are a number of places where these function-based indexes will speed up the performance of your queries.
Until next time,
–Bob the orcltestguy
Tags: Java 7, Oracle, virtual developer day, virtual education, webinar, WebLogic Server 12c
As a technology professional, it is not uncommon to find yourself attending product training and demonstrations. Luckily, many of these events no longer require expensive face-to-face time. Unfortunately, the term webinar leaves a bad taste in many people’s mouths. That’s because often these events boil down to a poorly organized sales meeting led by a person that likes the sound of their own voice. Don’t judge….you know what I’m talking about.
So, when I attended the Oracle Virtual Developer Days for WebLogic Server 12c and Java 7, I was not expecting anything beyond the standard webinar. I could not have been more wrong! Their functional presentation and depth of information blew me away. Besides the requisite keynote session, there were breakout tracks that included a focused Q/A and hands-on labs and even a networking lounge to chat with other attendees. Overall, the experience was engaging, easy-to-navigate and best of all, educational.
I had only minor hiccups with the video streaming, and those were quickly addressed using the chat, where moderators helped to resolve this (among many, I’m sure) issue. All of the presentations were pre-recorded, so I could pause and rewind as needed. The hands-on-labs required me to download and install software prior, but this was a lot less buggy than working in virtual cloud.
Having used this dynamic Oracle Developer Day platform, I am now spoiled. We can only hope other vendors take a page from Oracle and up their virtual education game to this level. I’ll keep you posted on any other webinar gems, and if you’ve attended one that you loved be sure to share the new here.
Tags: Oracle, oracle partitioning data management optimizer range list hash
One of the best features of the Oracle RDBMS over the last ten years has been partitioning. If your shop needs to handle large volumes of data, if you are running OLAP applications, if you often need to move datasets around, if you are responsible for staging data for a rolling twelve-month period, or if you want to improve the performance of you SQL statements, then this is the tool for you!
The basic idea behind partitioning is “divide and conquer”. We’re going to take a very large object (such as a table with six million rows), divide it into logical piece parts, and then manage the smaller pieces. Oracle provides us with a number of different strategies on how we can divide our data. If your data represented orders from your customers, and that was a stored column in the table, you could partition your data by order date. You could break the data into twelve partitions, one for order data for each month over the past year. You could also break your table data into partitions by a selected range. For example, all customers whose last name begins with A – C could go in partition 1, D – H into partition 2, etc.
Another way to “divide and conquer” is to partition by a list when you have discrete values. For example, customers who live in Illinois and Indiana go into partition 1; Pennsylvania, Ohio, and Kentucky go into partition 2; and so on.
Now that you’ve got the idea, let’s talk about the benefits of this tactic. If you can divide your data into 10 partitions, each partition can go into its own tablespace. Radical, huh? That means if you need to move the customers whose last names begin with A – C, you only need to move that single partition, not the entire table. If the data is divided into ten partitions of approximately the same number of row, you will only need to move 10% of the data, instead of 100%. The same is true if you only need to back up one specific partition; your typical O/S tasks would only take 10% of the time they used to take.
The optimizer is also aware of partitioning. If you query your customer table looking for a customer whose last name is Baker, the optimizer knows that it only needs to search in Partition1, since this partition contains customers whose last names range from A – C. You don’t have to spend any time searching through the other nine partitions, because Oracle knows it will never find what you’re looking for in any of the remaining partitions. You can also choose to create an index on just that partition.
There’s still a lot more to know about partitioning, and I encourage you to take a look at it, especially if the size of your Oracle datafiles is starting to become unmanageable, and you’re seeing a degradation of performance at the same time.
Start with the following resources:
I hope that you can learn whether this technique is something that could benefit you and your organization.
Tags: oracle certification, oracle certified expert, oracle sql expert certification exam prep 11g Release 2, SQL
Have you taken a look at the Expert series of certifications that Oracle offers? Normally, the path to an Expert certification is shorter than the path to OCA or OCP certification, sometimes as little as a single exam, but Expert certification requires a very in-depth knowledge of a particular area of Oracle technology.
If you are an Application Developer or a DBA who uses SQL extensively, you may want to consider the Oracle Database: SQL Certified Expert certification. The only requirement is to receive a passing grade (66% or higher) on Oracle’s certification exam 1Z0-047. However, before you jump to sign up, you need to be warned. This exam is not for your casual user of SQL. It requires an in-depth knowledge of SQL, including all of the enhancements made over recent years. Furthermore, this is one exam where Oracle University does not offer a course which maps almost perfectly to the exam.
The course “Oracle Database 11g: Introduction to SQL” or the equivalent knowledge would be a helpful resource, but you need to look closely at the topics covered. Here are my observations:
- Be prepared to write joins using the new ANSI standards. You’ll also need to write single row, multiple row, and correlated subqueries.
- All of the set operators are covered, as well as the new MERGE command and the multi-table INSERT command.
- You should be well versed in index creation, and the various type of indexes, and more importantly when it’s appropriate to use each kind of index.
- Understanding privileges, both object and system, as well as roles (both default and non-default) should be in your repetoire. You should also be prepared to answer questions dealing with transaction control, external tables, and the use of the Data Dictionary.
- Constraints are hit hard, and the multidimensional report writing commands of ROLLUP, CUBE, and GROUPING are covered on the exam.
- You should be able to deal with all the date and time functions, and provide global support to clients in different time zones.
- The Oracle propietary commands to produce hierarchical tree-structured reports are definitely covered in the exam objectives.
- And finally, be prepared to deal with regular expressions and pattern matching using the various REGEXP functions. Perl programming experience would come in handy here.
If you decide to take on this challenge, we have just finished upgrading the Transcender 1z0-047 exam prep practice test to 11g Release 2. This practice test will give you a good idea of what you are in for when you go to take the Oracle exam. Just like the live exam, the questions on the practice exam are challenging and really do require you to be a “SQL Expert”.
Good luck to all!
The Oracle Guy
Tags: oracle certification exam tips mistakes dates null unknown not known date arithmetic, test-taking tips
One component of my job as the Oracle Content Developer at Kaplan/Transcender is to review the trouble tickets that we receive from customers using our practice exams. This gives me invaluable insight into “why” students sometimes choose the wrong answer 0n our practice test (and by extension the live exam), even when their technical knowledge of that subject matter is quite good.
I’d like to share with you two of the common errors, as well as strategies which hopefully will serve you well when taking an exam, so you can hopefully avoid these types of mistakes.
Error #1: Dating Yourself
One very common error involves the use of dates, especially when sorting. Remember that if a column in a table or a variable in a PL/SQL block of code is defined as DATE, that value internally stores all the detail to point to an exact second anywhere between 4712BC and 9999AD. Also, you can subtract dates, which creates a difference that has a datatype of NUMBER. That number will represent the number of days (and fractional parts of a day) between the two dates. Suppose your SELECT statement looks like this:
SQL> SELECT id, name, (sysdate – hiredate) AS SENIORITY FROM emp ORDER BY SENIORITY;
If you want this report sorted by seniority, with the person working at the company for the longest period of time to be first, is this the correct way to sort, or should you sort in descending order? Well, the difference between sysdate and hiredate will be the largest number when hiredate is the earliest date possible (since SYSDATE stays constant if you perform this operation for all employees at the same time). Since you want the person where that difference is the greatest to be first, you need to sort descending (DESC) on SENIORITY. Some people find this counter-intuitive, so be sure to think this through carefully on the exam.
Error #2: Evaluating NULL
The use of NULL can sometimes throw off a student who is well prepared for the exam. NULL can be assigned to a variable, in which case it means you don’t know the value of that variable. NULL can also be assigned to the truth value of an expression, in which case it means you don’t know whether the statement is TRUE or FALSE. If you remember NULL like this, things will make sense. Let’s try a few examples.
Evaluate the following:
a. x + 5 where x is 4.
The answer is 9.
b. X + 5, where x is NULL
Since I don’t know what x is, I can’t figure out x+5. Thus the answer for x + 5 is NULL (I don’t know)
c. 6 (x+2) / x * 7 – 3, where x is NULL.
If you don’t know x, you can’t figure this out. Thus the answer for this expression is I don’t know (NULL).
d. WHERE X + 2 > 10, where X is 5.
This is an expression which has a truth value. The choices are either TRUE, FALSE, or NULL. In this case, since x is 5, the expression becomes WHERE 5 + 2 > 10, which is false. The expression’s TRUTH VALUE is FALSE. If that WHERE clause was part of a SELECT statement, when Oracle was searching through the table and got to the row where x is 5, that row would not be displayed since only rows that evaluate to TRUE are displayed.
e. WHERE X + 2 > 10, where x is NULL.
This is also an expression which has a truth value. Since x is NULL, I can’t compute x + 2. Therefore, I can’t determine whether the statement x + 2 > 10 is TRUE or FALSE. Consequently, the TRUTH VALUE of this expression is NULL. If that WHERE clause was part of a SELECT statement, when Oracle was searching through the table and got to the row where x is NULL, that row would not be displayed since only rows that evaluate to TRUE are displayed.
f. WHERE x + 2 > 10 OR y + 3 = 10, where x is NULL (unknown) and y is 7.
This is an expression and consequently has a truth value. It is a compound expression separated by an OR. Since x is unknown, the value of x + 2 is also unknown. Since x + 2 is not known, we can’t tell whether the statement x + 2 > 10 is true or false. Therefore, it is NULL. For the second condition in the WHERE clause, since y is 7, then 7+ 3 is 10, and hence the second condition is TRUE. Therefore, the truth value is now NULL OR TRUE. Since the separator is OR, only one of the two conditions needs to be true to make the entire expression true.
To put this another way, if the first condition was TRUE, the overall expression would be TRUE. However, if the first condition was FALSE, the overall expression would still be TRUE. Therefore, it doesn’t matter what the truth value of the first part of the expression is, the result will still always be TRUE. So if the first part is NULL, the overall result will still be TRUE.
Just for fun, Evaluate these expressions to either TRUE, FALSE, or NULL. The answers are located at the bottom.
1. Condition A OR Condition B where Condition A is True and Condition B is False
2. Condition A OR Condition B where Condition A is False and Condition B is NULL
3. Condition A AND Condition B where Condition A is NULL and Condition B is TRUE
4. Condition A AND Condition B where Condition A is False and Condition B is NULL
5. NOT Condition A where Condition A is False
6. NOT Condition B where Condition B is NULL
7. Condition A OR Condition B where both Conditions are NULL
8. Condition A AND Condition B where both Conditions are NULL
Until next time,
Bob Bungenstock aka Orcltestguy
Answers 1. TRUE 2. FALSE 3. NULL 4. FALSE 5. TRUE 6. NULL 7. NULL 8. NULL
Tags: cloud, Larry Ellison, OpenWorld, Oracle, oracle certification, Salesforce
Well, Oracle OpenWorld 2011 has come to a close. For one week in October, this year’s conference brought (approx) 45,000 Oracle customers, employees, and partners to the city of San Francisco, but now the crowds have been replaced with fork lifts in a frantic attempt to break down all of the vendor booths as quickly as possible.
In typical fashion, Larry Ellison made some major announcements in his keynote presentation on Wednesday afternoon! Effective immediately, Oracle announced that every one of the 150+ modules that comprise the new Fusion ERP application are now in production. Fusion is the next generation of applications, which Oracle completely wrote from the ground up and developed with 100% open standards for the past 6 years. It’s the upgrade path for customers running Oracle’s e-business suite, and it’s an option for customers on Peoplesoft, JD Edwards, and Siebel as well.
Ellison also announced that Oracle was creating a public cloud using Oracle’s new Exadata and Exalogic machines, designed explicitly for maximum performance when paired with the Oracle Database. Ellison referred to these machines as “parallel everything” with a performance up to 10 times faster than current servers in the marketplace at a cost of 1/10th of those same machines. Everything is built on standards, making it very easy to port your application from your server to the cloud, or from the cloud back to your server, or from the cloud to your server and then back to the cloud again. It’s all up to you. At the same time, Ellison took a number of shots at competitors, keeping alive the banter between Salesforce.com CEO Marc Benioff which had already provided plenty o’ drama for most of the week!
The other interesting revelation is that social networking is actually built into the new Fusion applications. Facebook is used for identifying yourself and your colleagues who interact with these systems and need to constantly share information. You can extend this social networking to include your customers, your prospects, your partners, your suppliers, etc. This improves overall workflow and communication, but at the same time, you have complete control of the level of access for each player. It definitely had a look and feel that differs from your typical IT applications.
Many excellent small session presentations were offered during the last half of the conference. If you’re not aware, there are some major enhancements in the database in 11g R2. Some of my personal favorites include the Workload Repository and the potential for multiple execution plans, the new SQL Results cache and PL/SQL results cache in the SGA, all the new automatic monitoring features, enhancements to Security, and invisible indexes. I’ll discuss these and other topics featured at OpenWorld 2011 in future blog posts.
Logging off for now; take care!
Tags: oracle openworld
This is OrclTestGuy checking in with my first impressions of the Oracle World conference being held this week in San Francisco. One word that immediately comes to mind is “huge.” The number of attendees at the keynote sessions, the count of exhibitors on the trade show floor, the number of sessions to choose from, and the number of countries represented by this year’s participants was nothing short of overwhelming. In fact, the entire city of San Francisco, with its booked-up hotels and closed down streets, are indicative of the pride the city and the entire Bay area exhibit in being the home of Oracle Corporation, especially this week, where San Francisco can welcome all the customers and partners of Oracle in a big way .
On Tuesday I saw Larry Ellison speak live with a few thousand of my closest friends at the Moscone Center. Larry spoke on the virtues of combining the hardware and software platforms into a single solution where the two are explicitly designed to take maximum advantage of each other. The Exadata server is the result of that effort, and Larry quoted performance statistics ranging from 5 to 10 (and sometimes even 15) times faster than other hardware solutions available today. The whole concept of the machine is “parallel everything” so you end up with a box that can support 5 to 10 times the number of users running at 5 to 10 times faster in a box which provides high availability through all the redundancy and parallelism in the box as it’s built, with a much smaller footprint than all the current players in this server market. Larry touted a number of customers using the Exadata machine along with an Oracle database along with the performance gains that these customers are reporting.
In our after conference hours we’ve been enjoying some of the great perks that San Francisco has to offer, but definitely don’t forget to bring lots of plastic. While I work on my second half of the report, you may want to check out some of the videos posted on YouTube for additional updates on some of the major announcements at this year’s Open World.
–Bob the OrclTestGuy