1. The document describes visual SQL tuning (VST) which involves finding problem SQL, studying the execution plan, and fixing issues.
2. It recommends laying out tables and joins visually with a map to determine the optimal execution path. Filters should be marked to start with the most selective one.
3. Drawing parents and children shows table relationships to structure the tree and determine the best join order from most selective filter down before joining back up.
For more course tutorials visit
www.newtonhelp.com
Week 1 HomeworkCommand Line in Windows and Linux
Using Google, research what kernel operating systems have been used in the video gaming industry. Describe the architecture and details regarding its advantages or disadvantages (i.e, consider Windows, Linux, based, etc.). A minimum of two paragraphs of research information is required, along with your own interpretation of the content.
1. (TCO 1) Which of the following sets of SQL clauses represent the minimum combination of clauses to make a working SQL statement? (Points : 5)
SELECT, WHERE
FROM, WHERE
SELECT, FROM
FROM, ORDER BY
1. (TCO 1) Which of the following sets of SQL clauses represent the minimum combination of clauses to make a working SQL statement? (Points : 5)
SELECT, WHERE
FROM, WHERE
SELECT, FROM
FROM, ORDER BY
We are SAP ABAP training and placement institute in Pune. Learn ABAP programming with industry expert and start your SAP career. Attend the first lecture as Free Demo.
For more course tutorials visit
www.newtonhelp.com
Week 1 HomeworkCommand Line in Windows and Linux
Using Google, research what kernel operating systems have been used in the video gaming industry. Describe the architecture and details regarding its advantages or disadvantages (i.e, consider Windows, Linux, based, etc.). A minimum of two paragraphs of research information is required, along with your own interpretation of the content.
1. (TCO 1) Which of the following sets of SQL clauses represent the minimum combination of clauses to make a working SQL statement? (Points : 5)
SELECT, WHERE
FROM, WHERE
SELECT, FROM
FROM, ORDER BY
1. (TCO 1) Which of the following sets of SQL clauses represent the minimum combination of clauses to make a working SQL statement? (Points : 5)
SELECT, WHERE
FROM, WHERE
SELECT, FROM
FROM, ORDER BY
We are SAP ABAP training and placement institute in Pune. Learn ABAP programming with industry expert and start your SAP career. Attend the first lecture as Free Demo.
this presentation is made for the students who finds data structures a complex subject
this will help students to grab the various topics of data structures with simple presentation techniques
best regards
BCA group
(pooja,shaifali,richa,trishla,rani,pallavi,shivani)
Learn to manipulate numbers in R using the built in numeric functions. This tutorial is part of the Working With Data module of the R Programming course offered by r-squared.
Synthesized report on the comparison of lut and splitting method for decrypti...eSAT Journals
Abstract Any encryption or decryption method will have certain key based on which the encoding and decoding will be performed. This is done to avoid access of data by unauthorized personal. Without the decoding key, encoded data is junk. Similarly, Federal Information Processing Standard (FIPS) developed Advanced Encryption Standard, which was used for saving digital data especially in magnetic tape like debit cards and credit cards, so that it provides security for the details and also this can be used in security of PDA’s which need to work very efficiently with high speed encoding and decoding and also need to consume less area as possible. It can be built using purely hardware or purely software i.e. using programming language such as Verilog. Decryption and Encryption has main part, Mix Columns and Inverse Mix columns, on which the whole AES operation depends. Here synthesis is performed for the decryption unit of the AES, which can be performed in two methods i.e. Look-up Table and Splitting method. Comparison of two methods is done by synthesizing the program in Spartan -3E of Xilinx ISE 14.1 Suite. Keywords: Encryption, Decryption, FIPS, Mix Columns, Inverse Mix Columns.
Learn the built-in mathematical functions in R. This tutorial is part of the Working With Data module of the R Programming course offered by r-squared.
I've covered Message queue related below points:
- Introduction: MQ Testing
- MQ Architecture
- Key Capabilities
- MQ : Simple Use Case / Purpose
- Difference between Web Service and Message Queue (MQ)
- Shorthand View of MQ Dashboard
I'll be sharing one more presentation on "MQ Testing through Parasoft SOATest".
Please feel free to contact me if you need more information.
Sending and receiving messages in mq queuesRavi Babu
Sending and receiving messages in MQ Queue's (Queues) - Message Passing between Queues - communication between 2 Queues (Queue's) - IBM WebSphere MQ - create local Queue , Remote Queue, Channels, transmission.
this presentation is made for the students who finds data structures a complex subject
this will help students to grab the various topics of data structures with simple presentation techniques
best regards
BCA group
(pooja,shaifali,richa,trishla,rani,pallavi,shivani)
Learn to manipulate numbers in R using the built in numeric functions. This tutorial is part of the Working With Data module of the R Programming course offered by r-squared.
Synthesized report on the comparison of lut and splitting method for decrypti...eSAT Journals
Abstract Any encryption or decryption method will have certain key based on which the encoding and decoding will be performed. This is done to avoid access of data by unauthorized personal. Without the decoding key, encoded data is junk. Similarly, Federal Information Processing Standard (FIPS) developed Advanced Encryption Standard, which was used for saving digital data especially in magnetic tape like debit cards and credit cards, so that it provides security for the details and also this can be used in security of PDA’s which need to work very efficiently with high speed encoding and decoding and also need to consume less area as possible. It can be built using purely hardware or purely software i.e. using programming language such as Verilog. Decryption and Encryption has main part, Mix Columns and Inverse Mix columns, on which the whole AES operation depends. Here synthesis is performed for the decryption unit of the AES, which can be performed in two methods i.e. Look-up Table and Splitting method. Comparison of two methods is done by synthesizing the program in Spartan -3E of Xilinx ISE 14.1 Suite. Keywords: Encryption, Decryption, FIPS, Mix Columns, Inverse Mix Columns.
Learn the built-in mathematical functions in R. This tutorial is part of the Working With Data module of the R Programming course offered by r-squared.
I've covered Message queue related below points:
- Introduction: MQ Testing
- MQ Architecture
- Key Capabilities
- MQ : Simple Use Case / Purpose
- Difference between Web Service and Message Queue (MQ)
- Shorthand View of MQ Dashboard
I'll be sharing one more presentation on "MQ Testing through Parasoft SOATest".
Please feel free to contact me if you need more information.
Sending and receiving messages in mq queuesRavi Babu
Sending and receiving messages in MQ Queue's (Queues) - Message Passing between Queues - communication between 2 Queues (Queue's) - IBM WebSphere MQ - create local Queue , Remote Queue, Channels, transmission.
About the course:
This Oracle performance tuning online course is designed for the audience who want to learn basics and core concepts of Oracle PT. You will be learning about Introduction, basic tuning diagnostics, how to use automatic workload repository, defining of problems, how to create AWR baselines, monitoring of applications Etc. All Oracle performance tuning classes will be live and interactive.
Course Target:
Oracle performance tuning online training is designed to teach you fundamentals of PT.
Understand basic tuning diagnostics.
Learn how to use Automatic workload repository.
Obtain knowledge of using metrics and alerts.
Clear understanding of how to monitor applications.
Need to identify problem SQL statements
Learn how to influence the optimizer.
Understand SQL performance management.
Tuning the shared pool, I/0, Buffer cache, PGA and temporary space.
Course Targeted Audience:
Any candidate can join our Oracle performance tuning online course.
People who are from professional background can join.
Researches can also participate in this course.
Prerequisites:
Candidates with basic knowledge of computer.
Basics of database are recommended.
Training Format:
Kernel Training provides Oracle performance tuning online course led by real time expert.
Registered Candidates can interact with instructor in live interactive sessions.
Candidates will have life time access to learning material.
Companies Using Oracle PT:
Major international IT companies perform Oracle performance tuning for their operations.
Advanced MySQL Query Tuning - talk at Percona Live and MySQL Meetup tour.
Tuning Queries and Schema/Indexes can significantly increase performance of your application and decrease response times.
This year I will cover new MySQL 5.6 and 5.7 algorithms that has been designed to improve query performance and simply tuning.
Topics:
1. Group by and order by optimizations
2. MySQL temporary tables and filesort
3. Using covered indexes to optimize your queries
4. Loose and tight index scan in MySQL
5. Using summary tables to optimize your reporting queries
6. New MySQL 5.6 and 5.7 Optimizer features and improvements
Understand the Query Plan to Optimize Performance with EXPLAIN and EXPLAIN AN...EDB
What do you do, when you have to deal with poor database and query performance in PostgreSQL and there is no one around to help? Let us introduce you to important commands in PostgreSQL - EXPLAIN and EXPLAIN ANALYZE. Knowing how to use these 'tools' will help you identify query performance bottlenecks and opportunities. It provides a query plan detailing what approach the planner took to execute the statement provided.
Attend this webinar to learn:
- What are EXPLAIN and EXPLAIN ANALYZE in PostgreSQL?
- How do they help?
- Know planner tuning parameters
Online Statistics Gathering for Bulk Loads - the official name of the feature - was introduced in Oracle 12.1. The idea is to gather optimizer statistics "on the fly" for direct path loads. Sounds good for ETL? In certain scenarios it makes sense but even then there are many points to consider so that it becomes a reliable part of your ETL processes. When exactly will it be working and when not? Do you prevent it yourself? Documented, undocumented cases, known bugs. Which statistics are gathered and which are not? What has to be considered with partitioned tables? Interval partitioning - special case?
The final part of the SQL Tuning workshop focuses on applying the techniques discussed in the previous sections to help diagnose and correct a number of problematic SQL statements and shows how you can use SQL Plan Management or a SQL Patch to influence an execution plan.
Successfully convince people with data visualizationKyle Hailey
Successfully convince people with data visualization
video of presentation available at https://www.youtube.com/watch?v=3PKjNnt14mk
from Data by the Bay conference
Epistemic Interaction - tuning interfaces to provide information for AI supportAlan Dix
Paper presented at SYNERGY workshop at AVI 2024, Genoa, Italy. 3rd June 2024
https://alandix.com/academic/papers/synergy2024-epistemic/
As machine learning integrates deeper into human-computer interactions, the concept of epistemic interaction emerges, aiming to refine these interactions to enhance system adaptability. This approach encourages minor, intentional adjustments in user behaviour to enrich the data available for system learning. This paper introduces epistemic interaction within the context of human-system communication, illustrating how deliberate interaction design can improve system understanding and adaptation. Through concrete examples, we demonstrate the potential of epistemic interaction to significantly advance human-computer interaction by leveraging intuitive human communication strategies to inform system design and functionality, offering a novel pathway for enriching user-system engagements.
Software Delivery At the Speed of AI: Inflectra Invests In AI-Powered QualityInflectra
In this insightful webinar, Inflectra explores how artificial intelligence (AI) is transforming software development and testing. Discover how AI-powered tools are revolutionizing every stage of the software development lifecycle (SDLC), from design and prototyping to testing, deployment, and monitoring.
Learn about:
• The Future of Testing: How AI is shifting testing towards verification, analysis, and higher-level skills, while reducing repetitive tasks.
• Test Automation: How AI-powered test case generation, optimization, and self-healing tests are making testing more efficient and effective.
• Visual Testing: Explore the emerging capabilities of AI in visual testing and how it's set to revolutionize UI verification.
• Inflectra's AI Solutions: See demonstrations of Inflectra's cutting-edge AI tools like the ChatGPT plugin and Azure Open AI platform, designed to streamline your testing process.
Whether you're a developer, tester, or QA professional, this webinar will give you valuable insights into how AI is shaping the future of software delivery.
Let's dive deeper into the world of ODC! Ricardo Alves (OutSystems) will join us to tell all about the new Data Fabric. After that, Sezen de Bruijn (OutSystems) will get into the details on how to best design a sturdy architecture within ODC.
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Tobias Schneck
As AI technology is pushing into IT I was wondering myself, as an “infrastructure container kubernetes guy”, how get this fancy AI technology get managed from an infrastructure operational view? Is it possible to apply our lovely cloud native principals as well? What benefit’s both technologies could bring to each other?
Let me take this questions and provide you a short journey through existing deployment models and use cases for AI software. On practical examples, we discuss what cloud/on-premise strategy we may need for applying it to our own infrastructure to get it to work from an enterprise perspective. I want to give an overview about infrastructure requirements and technologies, what could be beneficial or limiting your AI use cases in an enterprise environment. An interactive Demo will give you some insides, what approaches I got already working for real.
JMeter webinar - integration with InfluxDB and GrafanaRTTS
Watch this recorded webinar about real-time monitoring of application performance. See how to integrate Apache JMeter, the open-source leader in performance testing, with InfluxDB, the open-source time-series database, and Grafana, the open-source analytics and visualization application.
In this webinar, we will review the benefits of leveraging InfluxDB and Grafana when executing load tests and demonstrate how these tools are used to visualize performance metrics.
Length: 30 minutes
Session Overview
-------------------------------------------
During this webinar, we will cover the following topics while demonstrating the integrations of JMeter, InfluxDB and Grafana:
- What out-of-the-box solutions are available for real-time monitoring JMeter tests?
- What are the benefits of integrating InfluxDB and Grafana into the load testing stack?
- Which features are provided by Grafana?
- Demonstration of InfluxDB and Grafana using a practice web application
To view the webinar recording, go to:
https://www.rttsweb.com/jmeter-integration-webinar
Smart TV Buyer Insights Survey 2024 by 91mobiles.pdf91mobiles
91mobiles recently conducted a Smart TV Buyer Insights Survey in which we asked over 3,000 respondents about the TV they own, aspects they look at on a new TV, and their TV buying preferences.
Key Trends Shaping the Future of Infrastructure.pdfCheryl Hung
Keynote at DIGIT West Expo, Glasgow on 29 May 2024.
Cheryl Hung, ochery.com
Sr Director, Infrastructure Ecosystem, Arm.
The key trends across hardware, cloud and open-source; exploring how these areas are likely to mature and develop over the short and long-term, and then considering how organisations can position themselves to adapt and thrive.
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...UiPathCommunity
💥 Speed, accuracy, and scaling – discover the superpowers of GenAI in action with UiPath Document Understanding and Communications Mining™:
See how to accelerate model training and optimize model performance with active learning
Learn about the latest enhancements to out-of-the-box document processing – with little to no training required
Get an exclusive demo of the new family of UiPath LLMs – GenAI models specialized for processing different types of documents and messages
This is a hands-on session specifically designed for automation developers and AI enthusiasts seeking to enhance their knowledge in leveraging the latest intelligent document processing capabilities offered by UiPath.
Speakers:
👨🏫 Andras Palfi, Senior Product Manager, UiPath
👩🏫 Lenka Dulovicova, Product Program Manager, UiPath
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Ramesh Iyer
In today's fast-changing business world, Companies that adapt and embrace new ideas often need help to keep up with the competition. However, fostering a culture of innovation takes much work. It takes vision, leadership and willingness to take risks in the right proportion. Sachin Dev Duggal, co-founder of Builder.ai, has perfected the art of this balance, creating a company culture where creativity and growth are nurtured at each stage.
The Art of the Pitch: WordPress Relationships and SalesLaura Byrne
Clients don’t know what they don’t know. What web solutions are right for them? How does WordPress come into the picture? How do you make sure you understand scope and timeline? What do you do if sometime changes?
All these questions and more will be explored as we talk about matching clients’ needs with what your agency offers without pulling teeth or pulling your hair out. Practical tips, and strategies for successful relationship building that leads to closing the deal.
Transcript: Selling digital books in 2024: Insights from industry leaders - T...BookNet Canada
The publishing industry has been selling digital audiobooks and ebooks for over a decade and has found its groove. What’s changed? What has stayed the same? Where do we go from here? Join a group of leading sales peers from across the industry for a conversation about the lessons learned since the popularization of digital books, best practices, digital book supply chain management, and more.
Link to video recording: https://bnctechforum.ca/sessions/selling-digital-books-in-2024-insights-from-industry-leaders/
Presented by BookNet Canada on May 28, 2024, with support from the Department of Canadian Heritage.
Accelerate your Kubernetes clusters with Varnish CachingThijs Feryn
A presentation about the usage and availability of Varnish on Kubernetes. This talk explores the capabilities of Varnish caching and shows how to use the Varnish Helm chart to deploy it to Kubernetes.
This presentation was delivered at K8SUG Singapore. See https://feryn.eu/presentations/accelerate-your-kubernetes-clusters-with-varnish-caching-k8sug-singapore-28-2024 for more details.
DevOps and Testing slides at DASA ConnectKari Kakkonen
My and Rik Marselis slides at 30.5.2024 DASA Connect conference. We discuss about what is testing, then what is agile testing and finally what is Testing in DevOps. Finally we had lovely workshop with the participants trying to find out different ways to think about quality and testing in different parts of the DevOps infinity loop.
4. Step 2: Get Explain Plan
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows |
---------------------------------------------------------------------------------------------
| 1 | HASH GROUP BY | | 1 | 1 | 1 |
|* 2 | FILTER | | 1 | | 1909 |
|* 3 | TABLE ACCESS BY INDEX ROWID | PS_RETROPAYPGM_TBL | 1 | 1 | 3413 |
| 4 | NESTED LOOPS | | 1 | 165 | 6827 |
|* 5 | HASH JOIN | | 1 | 165 | 3413 |
|* 6 | HASH JOIN | | 1 | 165 | 3624 |
| 7 | TABLE ACCESS BY INDEX ROWID | WB_JOB | 1 | 242 | 2895 |
| 8 | NESTED LOOPS | | 1 | 233 | 2897 |
| 9 | TABLE ACCESS BY INDEX ROWID| PS_PAY_CALENDAR | 1 | 1 | 1 |
|* 10 | INDEX RANGE SCAN | PS0PAY_CALENDAR | 1 | 1 | 1 |
|* 11 | INDEX RANGE SCAN | WBBJOB_B | 1 | 286 | 2895 |
|* 12 | TABLE ACCESS FULL | WB_RETROPAY_EARNS | 1 | 27456 | 122K|
| 13 | TABLE ACCESS FULL | PS_RETROPAY_RQST | 1 | 13679 | 13679 |
|* 14 | INDEX RANGE SCAN | PS#RETROPAYPGM_TBL | 3413 | 1 | 3413 |
| 15 | SORT AGGREGATE | | 1791 | 1 | 1791 |
| 16 | FIRST ROW | | 1791 | 1 | 1579 |
|* 17 | INDEX RANGE SCAN (MIN/MAX) | WB_JOB_F | 1791 | 1 | 1579 |
| 18 | SORT AGGREGATE | | 1539 | 1 | 1539 |
| 19 | FIRST ROW | | 1539 | 1 | 1539 |
|* 20 | INDEX RANGE SCAN (MIN/MAX) | WB_JOB_G | 1539 | 1 | 1539 |
---------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter(("B"."EFFDT"= AND "B"."EFFSEQ"=))
3 - filter("E"."OFF_CYCLE"="A"."PAY_OFF_CYCLE_CAL")
5 - access("D"."RETROPAY_SEQ_NO"="C"."RETROPAY_SEQ_NO")
6 - access("C"."EMPLID"="B"."EMPLID" AND "C"."EMPL_RCD#"="B"."EMPL_RCD#")
10 - access("A"."RUN_ID"='PD2' AND "A"."PAY_CONFIRM_RUN"='N')
11 - access("B"."COMPANY"="A"."COMPANY" AND "B"."PAYGROUP"="A"."PAYGROUP")
12 - filter(("C"."RETROPAY_PRCS_FLAG"='C' AND "C"."RETROPAY_LOAD_SW"='Y'))
14 - access("E"."RETROPAY_PGM_ID"="D"."RETROPAY_PGM_ID")
17 - access("F"."EMPLID"=:B1 AND "F"."EMPL_RCD#"=:B2 AND "F"."EFFDT"<=:B3)
20 - access("G"."EMPLID"=:B1 AND "G"."EMPL_RCD#"=:B2 AND "G"."EFFDT"=:B3)
PARSING IN CURSOR #2 len=53 dep=0 uid=61 oct=3
lid=61 tim=1151519905950403 hv=2296704914
ad='4e50010c'
SELECT 'Hello, world; today is ' || SYSDATE FROM dual
END OF STMT
PARSE
#2:c=4000,e=1540,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,
tim=1151519905950397
BINDS #2:
EXEC
#2:c=0,e=58,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,tim=1
151519906034782
WAIT #2: nam='SQL*Net message to client' ela= 2 driver
id=1650815232 #bytes=1 p3=0 obj#=-1
tim=1151519906034809
FETCH
#2:c=0,e=29,p=0,cr=0,cu=0,mis=0,r=1,dep=0,og=1,tim=1
151519906034864
WAIT #2: nam='SQL*Net message from client' ela= 215
driver id=1650815232 #bytes=1 p3=0 obj#=-1
tim=1151519906035133
FETCH
#2:c=0,e=1,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=0,tim=11
51519906035165
WAIT #2: nam='SQL*Net message to client' ela= 1 driver
id=1650815232 #bytes=1 p3=0 obj#=-1
tim=1151519906035188
WAIT #2: nam='SQL*Net message from client' ela= 192
driver id=1650815232 #bytes=1 p3=0 obj#=-1
tim=1151519906035400
STAT #2 id=1 cnt=1 pid=0 pos=1 obj=0 op='FAST
DUAL (cr=0 pr=0 pw=0 time=3 us)
Trace fie
5. Step 3: ???
Methodology
• Identify Slow Queries
• Look at Execution Plan
• Fix
Fix
1. Analyze stats
2. Go to step 1
WTF??
Fix If you are lucky, analyze for
1. Column histograms
2. Missing or better Indexes
10. How to Join two tables?
1. Which table to start with
• Hardest step ?
2. What Indexes to use
3. What type of join to use HJ, NL
Design options:
• Partitions
• IOT
• Bitmap indexes
• Hash cluster
• Materialized views
• etc
11. Two Table Join
1. Index exist?
2. Type of Relation
• One to One
• One to Many
• Many to Many
3. Special Cases
• Outer Joins
• Not Exists
12. Table Join Order
select *
from a, b
where
a.id = b.id
A B
id dataid data
Every row visits Every row
Work= A-rows x B-rows (8 x 4 )
HJ would optimizes to simulate index lookup
If No Index then (NL) order doesn’t matter
13. 2 Table join, with indexes
select *
from a, b
where
a.id = b.id
A B
id data
data id
With Indexes
Start with the least rows
8
14. 2 Table join, with indexes
select *
from a, b
where
a.id = b.id
A B
id data
data id
With Indexes
Start with the least rows
B A
data id id data
8 4
15. 2 table join - filters
select *
from a, b
where
a.id = b.id -- join
and a.field = ‘val a’ -- filter a
and b.field = ‘val b’ -- filter b
A
B
id data
data id
Start on table with least rows after filter
2
3
17. Two Table Joins
A B
A B
A B
Left join B B(+)
Not exists B
Inner Join
18. Two Table Joins
A B
A B
A B
A B
A B
Left join B B(+)
Not exists B
Right join B A(+)
Not Exists A
Inner Join
19. Two Table Joins
A B
A B
A B
A B A B
A B
A B
Left join B B(+)
Not exists B
Full outer (union) Right join B A(+)
Not Exists AUnion of Not Exists
Inner Join
Doesn’t tell the whole
story
Missing « amplifications »
20. One to One - intersection
1
2
1
2
1 1
2 2
A B
A B
BA
MAP
21. One to Many - projection
1
1
2
2
1
2
1 1
1 1
2 2
2 2
B
A
A B
A B
MAP
22. 1
1
1
1
1
1
Many to Many - amplification
1 1
1 1
1 1
1 1
1 1
1 1
1 1
1 1
A B
A
B
A B
MAP
rA*rB
-------------------------
min(ndv(A),ndv(B))
23. Two Table Joins
A B A B
Left join B B(+) Right join B A(+)
A B
MAP MAP
A Bo o
24. Two Table Joins
A B
Left join B B(+)
Color nodes that return no data
Select a.* from a, b where b.field(+) = a.field;
A B
V
A B
V
Multiplier
o
o ?
o
Pointless – join on
B has no affect if
no B cols selected
V
Pointless – join on
B has no affect or
multiplies rows from
A if no B cols
selected
25. Exists
SELECT *
FROM dept d WHERE exists ( SELECT null FROM
emp e WHERE e.deptno=d.deptno);
SELECT *
FROM dept d WHERE d.deptno in
( SELECT deptno FROM emp e );
Select dept.* from emp, dept where emp.deptno=
dept.deptno; /* can get duplicates */
dept empE
MAP
26. Not Exists
SELECT *
FROM dept d WHERE not exists ( SELECT
null FROM emp e WHERE e.deptno=d.deptno);
SELECT *
FROM dept d WHERE d.deptno not in ( SELECT
deptno FROM emp e and deptno is not null );
SELECT dept.* FROM dept LEFT OUTER JOIN emp
ON dept.deptno = emp.deptno WHERE emp.deptno IS
NULL;
dept empN
MAP
27. Two Table Join
1. Where to start
1. Generally start with the least rows after filtering with
predicate
2. Drawing Map:
– One to One / One to Many / Many to Many
– Outer Joins / Not Exists
Now , three table joins:
A BNA Bo
BA A B A B
28. Three table join
1 row4 rows8 rows
Ex) 1 customer 4 orders, each order has 2 order_lines each
1 row1 row1 row
order_lines orders customer
Join direction
Join direction
29. Three table join
order_lines orders customer
F
Where
order_lines.field = value
A Filter on order_lines is going to eliminate work
on orders and customers, if we start at order_lines
30. Three table join
order_lines orders customer
F
Where
order_lines.field = value
Starting with a filter on order_lines is going to eliminate work
31. Three table join
order_lines orders customer
F
Where
orders.field = value
Starting with a Filter on orders is going to eliminate work
Then Join to customers => keeps the number of rows the same
1
2
32. Three table join
order_lines orders customer
F
Where
customer.field = value
Starting on a filter on customer is going to eliminate work
33. Three table join
order_lines orders customer
FFF
What if a filter on all three?
Choose the one that filter’s the highest
percent of the table.
100% * (select count(*) from TAB where condition)
---------------------------
(select count(*) from Tab)
34. 4 or more table join
Oracle can only join one table in at a time.
Oracle can’t (normally) join two different sub-branches
35. Put it all together : VST
1. Tables
– drawn as nodes
2. Joins :
– drawn map connector lines
• One-to-one, one-to-many, many-to-many
• Exists, not exists, outer joins
3. Filters
– mark on each table with filter in where clause
35 6/22/2013
36. How to VST: Tables and Joins
SELECT C.Phone_Number, C.Honorific, C.First_Name, C.Last_Name,
C.Suffix, C.Address_ID, A.Address_ID, A.Street_Address_Line1,
A.Street_Address_Line2, A.City_Name, A.State_Abbreviation,
A.ZIP_Code, OD.Deferred_Shipment_Date, OD.Item_Count,
ODT.Text, OT.Text, P.Product_Description, S.Shipment_Date
FROM Orders O, Order_Details OD, Products P, Customers C, Shipments S,
Addresses A, Code_Translations ODT, Code_Translations OT
WHERE UPPER(C.Last_Name) LIKE :Last_Name||'%'
AND UPPER(C.First_Name) LIKE :First_Name||'%'
AND OD.Order_ID = O.Order_ID
AND O.Customer_ID = C.Customer_ID
AND OD.Product_ID = P.Product_ID(+)
AND OD.Shipment_ID = S.Shipment_ID(+)
AND S.Address_ID = A.Address_ID(+)
AND O.Status_Code = OT.Code
AND OT.Code_Type = 'ORDER_STATUS'
AND OD.Status_Code = ODT.Code
AND ODT.Code_Type = 'ORDER_DETAIL_STATUS'
AND O.Order_Date > :Now - 366
ORDER BY C.Customer_ID, O.Order_ID DESC, S.Shipment_ID, OD.Order_Detail_ID;
Tables
Orders O,
Order_Details OD,
Products P,
Customers C,
Shipments S,
Addresses A,
Code_Translations ODT,
Code_Translations OT
Joins
OD.Order_ID = O.Order_ID
O.Customer_ID = C.Customer_ID
OD.Product_ID = P.Product_ID(+)
OD.Shipment_ID =
S.Shipment_ID(+)
S.Address_ID = A.Address_ID(+)
O.Status_Code = OT.Code
OD.Status_Code = ODT.Code
Dan Tow – SQL TUNING
Filters
WHERE UPPER(C.Last_Name) LIKE :Last_Name||'%'
AND UPPER(C.First_Name) LIKE :First_Name||'%'
AND OT.Code_Type = 'ORDER_STATUS'
AND O.Order_Date > :Now – 366
AND ODT.Code_Type = 'ORDER_DETAIL_STATUS'
37. Layout tables and connections
Tables
Orders O,
Order_Details OD,
Products P,
Customers C,
Shipments S,
Addresses A,
Code_Translations ODT,
Code_Translations OT
Joins
OD.Order_ID = O.Order_ID
O.Customer_ID = C.Customer_ID
OD.Product_ID = P.Product_ID(+)
OD.Shipment_ID = S.Shipment_ID(+)
S.Address_ID = A.Address_ID(+)
O.Status_Code = OT.Code
OD.Status_Code = ODT.Code
F
S
A
OD
P
ODTC
OT
O
Dan Tow – SQL TUNING
38. Unstructured
Copyright 2006
Joins
OD.Order_ID = O.Order_ID
O.Customer_ID = C.Customer_ID
OD.Product_ID = P.Product_ID(+)
OD.Shipment_ID = S.Shipment_ID(+)
S.Address_ID = A.Address_ID(+)
O.Status_Code = OT.Code
OD.Status_Code = ODT.Code
Neater, but can you do anything with it?
What’s the optimal execution path?
S
A
OD
P ODT
C
OT
O
39. Parents and Children
Joins
OD.Order_ID = O.Order_ID
O.Customer_ID = C.Customer_ID
OD.Product_ID = P.Product_ID(+)
OD.Shipment_ID = S.Shipment_ID(+)
S.Address_ID = A.Address_ID(+)
O.Status_Code = OT.Code
OD.Status_Code = ODT.Code
ODT
OD
P
CA
OS
OT
Primary Key (unique index)
No index or non-unique
Master
Detail
Structure
the
tree
40. VST – filters and best path
Filters help determine best path
Parent
Child
Parent
Child
Concept:
1. Start at most selective filter
2. Join down first, before joining upwards
Filters
WHERE UPPER(C.Last_Name) LIKE :Last_Name||'%'
AND UPPER(C.First_Name) LIKE :First_Name||'%'
AND OT.Code_Type = 'ORDER_STATUS‘
AND ODT.Code_Type = 'ORDER_DETAIL_STATUS'
AND O.Order_Date > :Now – 366 F
F
30%
0.02%
100% * (select count(*) from TAB where condition)
---------------------------
(select count(*) from Tab)
S
A
OD
P ODT
C OT
O
59. T7, T13, T12
, T2 , T6,
T10, T11,
T15, T16, M,
T1,
T4,T9,T3,T8T
14, T5
Why not Guess ?
For 17 table join, there are 355 Trillion combinations
60. Cartesian
SELECT
A.BROKER_ID BROKER_ID,
A.BROKER_LAST_NAME BROKER_LAST_NAME,
A.BROKER_FIRST_NAME BROKER_FIRST_NAME,
A.YEARS_WITH_FIRM YEARS_WITH_FIRM,
C.OFFICE_NAME OFFICE_NAME,
SUM (B.BROKER_COMMISSION)
TOTAL_COMMISSIONS
FROM
BROKER A,
CLIENT_TRANSACTION B,
OFFICE_LOCATION C,
INVESTMENT I
WHERE
A.BROKER_ID = B.BROKER_ID AND
A.OFFICE_LOCATION_ID =
C.OFFICE_LOCATION_ID
GROUP BY
A.BROKER_ID,
A.BROKER_LAST_NAME,
A.BROKER_FIRST_NAME,
A.YEARS_WITH_FIRM,
C.OFFICE_NAME;
61. Implied Cartesian
select
c.client_first_name, c.client_last_name,
ct.action, ct.price,
b.broker_last_name, b.broker_first_name,
o.office_name
from
client_transaction ct,
client c,
broker b,
office_location o
where
ct.price > 100
and b.broker_id=ct.broker_id
and c.broker_id = b.broker_id
and o.office_location_id = b.office_location_id
63. Unstructured
Copyright 2006
Joins
OD.Order_ID = O.Order_ID
O.Customer_ID = C.Customer_ID
OD.Product_ID = P.Product_ID(+)
OD.Shipment_ID = S.Shipment_ID(+)
S.Address_ID = A.Address_ID(+)
O.Status_Code = OT.Code
OD.Status_Code = ODT.Code
S
A
OD
P ODT
C OT
O
S
A
OD
P ODT
C
OT
O
65. Adding Constraints
SELECT COUNT (*)
FROM
b,
c,
a
WHERE
b.val2 = 100 AND
a.val1 = b.id AND
b.val1 = c.id;
58 logical reads
alter table c add constraint c_pk unique (id);
alter table b add constraint b_pk unique (id);
7 logical reads
66. 10053
B
C
$: 4
#: 1
$: 5428
#: 59999
A
$: 92
#: 999
B A C
B C A
C A B
C B A
A C B
A B C
Table: A Alias: A
Best:: AccessPath: TableScan
Cost: 92.18 Degree: 1
Resp: 92.18 Card: 999.00
Best:: AccessPath: IndexRange
Index: B_V2
Cost: 4.00 Degree: 1
Resp: 4.00 Card: 1.00
Best:: AccessPath: IndexFFS
Index: C_PK_CON
Cost: 35.57 Degree: 1
Resp: 35.57 Card: 59999.00
Join order[1]: B[B]#0 A[A]#1 C[C]#2
***************
Now joining: A[A]#1
***************
Best:: JoinMethod: NestedLoop
Cost: 6.00 Degree: 1 Resp: 6.00 Card: 1.00 Bytes: 16
***************
Now joining: C[C]#2
***************
Best:: JoinMethod: NestedLoop
Cost: 6.00 Degree: 1 Resp: 6.00 Card: 1.00 Bytes: 21
***********************
Best so far: Table#: 0 cost: 4.0020 card: 1.0000 bytes: 12
Table#: 1 cost: 6.0031 card: 1.0000 bytes: 16
Table#: 2 cost: 6.0032 card: 1.0000 bytes: 21
alter session set events='10053 trace name context forever';
67. No Unique Constraint
A
$: 75
#: 999
B A C
NL: $: 10
#: 1
B A
C
$: 6$: 4
#: 1
$: 8
NL:$: 18
#: 1
B C A
NL: $: 10
#: 1
B C
A
$: 6.01$: 4
#: 1
$: 8
C A B
C B A A C B A B C
A
$: 75
#: 999
C
$: 5428
#: 59999
C
$: 5428
#: 59999
A
B C B
Join order[6]: C[C]#2 A[A]#1 B[B]#0
Join order aborted: cost > best plan cost
$
HJ: $: 10
#: 1
68. Unique Constraint
A
$: 75
#: 999
B A C
NL: $: 10
#: 1
B A
C
$: 6$: 4
#: 1
$: 8
NL:$: 18
#: 1
B C A
NL: $: 10
#: 1
B C
A
$: 5$: 4
#: 1
$: 7
C A B
C B A A C B A B C
A
$: 75
#: 999
C
$: 5428
#: 59999
C
$: 5428
#: 59999
A
B C B
Join order[6]: C[C]#2 A[A]#1 B[B]#0
Join order aborted: cost > best plan cost
$
HJ: $: 10
#: 1
NL:$: 16
#: 1
69. Diagraming: what to do with many to many
• With many to many we don’t know which direction to go
• How an we improve the diagram?
• -> Add two table join result set sizes
71. Look at 3 queries
• Query 1 runs more than 24 hours
• Query 2 outer joins and scalar sub-queries
• Query 3 create path not available to Oracle
72. Query 1 : Over 24 hours to runSELECT
A0.zuchinis,
A0.brocoli,
C0.Oranges
FROM
(
SELECT
A1.planted_date,
A1.pears,
A1.zuchinis,
A1.brocoli
FROM
FOO.A A1,
(
SELECT
zuchinis,
brocoli
FROM FOO.A A2
WHERE
pears = 'M' AND
planted_date + 0 >= ADD_MONTHS ((SELECT
MAX (planted_date)
FROM FOO.B B1
WHERE
pears = 'M'
),
- 11)
GROUP BY
zuchinis,
brocoli
HAVING COUNT (*) = 12
)
i2
WHERE
A1.planted_date = (SELECT
MAX (planted_date)
FROM FOO.B B2
WHERE
pears = 'M'
) AND
A1.pears = 'M' AND
A1.zuchinis = i2.zuchinis (+) AND
A1.brocoli = i2.brocoli (+)
UNION
SELECT
A4.planted_date,
A4.pears,A4.zuchinis,A4.brocoli
FROM FOO.A A4
WHERE
A4.planted_date >'01-OCT-08' and A4.planted_date <'03-OCT-08' AND
A4.pears = 'D' AND
A4.green_beans = '1'
AND NOT EXISTS (SELECT
*
FROM FOO.A A5
WHERE
pears = 'M' AND
planted_date = (SELECT
MAX (planted_date)
FROM FOO.B B3
WHERE
pears = 'M'
) AND
A4.zuchinis = A5.zuchinis AND
A4.brocoli = A5.brocoli)
)
b,
FOO.A A0,
FOO.C C0,
FOO.D D0,
FOO.E E0
WHERE
A0.planted_date >'01-OCT-08' and
A0.planted_date <'03-OCT-08' AND
A0.pears = 'D' AND
A0.green_beans = '1' AND
A0.zuchinis = b.zuchinis AND
A0.brocoli = b.brocoli AND
A0.planted_date = C0.planted_date AND
A0.pears = C0.pears AND
A0.zuchinis = C0.zuchinis AND
A0.brocoli = C0.brocoli AND
A0.planted_date = D0.planted_date AND
A0.pears = D0.pears AND
A0.harvest_size = D0.harvest_size AND
C0.Oranges = D0.Oranges AND
C0.apples = D0.apples AND
(D0.lemons = 0 OR
D0.lemons IS NULL) AND
A0.planted_date = E0.planted_date AND
A0.pears = E0.pears AND
A0.harvest_size = E0.harvest_size AND
C0.Oranges = E0.Oranges AND
C0.apples = E0.apples AND
(E0.lemons = 0 OR
E0.lemons IS NULL)
ORDER BY
A0.zuchinis, A0.brocoli;
77. Q2
SELECT CASE WHEN M.NYC IS NULL THEN (SELECT /*+ qb_name(qb1) */ MAX (Kona)
FROM foo.F
WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND Argentina = TRIM ('D') AND Norway = F_OUTER.Norway
ELSE M.NYC END AS NYC,
CASE WHEN F_OUTER.Perth IS NULL THEN NULL
ELSE (SELECT /*+ qb_name(qb2) */ Georgia FROM foo.P
WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND Argentina = TRIM ('D') AND Paris = F_OUTER.Perth)
END AS richard,
CASE WHEN F_OUTER.Aruba IS NULL THEN NULL
ELSE (SELECT /*+ qb_name(qb3) */ Georgia FROM foo.P
WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND Argentina = TRIM ('D') AND Paris = F_OUTER.Aruba)
END AS Jody,
CASE WHEN F_OUTER.Portland IS NULL THEN NULL
ELSE (SELECT /*+ qb_name(qb4) */ Georgia FROM foo.P
WHERE harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND Argentina = TRIM ('D') AND Paris = F_OUTER.Portland)
END AS Tom
FROM foo.F F_OUTER, foo.M , foo.J , foo.N ,
(SELECT /*+ qb_name(qb5) */ H.SF, Oregon, H.Haiti, K.Bermuda, L.Denmark
FROM (foo.H LEFT OUTER JOIN foo.K
ON H.harvest_date = K.harvest_date
AND H.Argentina = K.Argentina AND H.SF = K.SF
AND K.Dallas = '001')
LEFT OUTER JOIN FOo.L
ON H.harvest_date = L.harvest_date
AND H.Argentina = L.Argentina AND H.SF = L.SF
WHERE H.harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND H.Argentina = TRIM ('D')) extra
WHERE F_OUTER.harvest_date = M.harvest_date(+)
AND F_OUTER.Argentina = M.Argentina(+)
AND F_OUTER.Norway = M.Norway(+)
AND M.Norway(+) = M.Texas(+)
AND F_OUTER.harvest_date = to_date('08/10/2008','dd/mm/yyyy')
AND F_OUTER.Argentina = TRIM ('D')
AND M.harvest_date(+) = to_date('08/10/2008','dd/mm/yyyy')
AND M.Argentina(+) = TRIM ('D')
AND F_OUTER.Norway = F_OUTER.Hawaii
AND F_OUTER.harvest_date = J.harvest_date(+)
AND F_OUTER.Argentina = J.Argentina(+)
AND F_OUTER.Norway = J.Texas(+)
AND J.harvest_date(+) = to_date('08/10/2008','dd/mm/yyyy')
AND J.Argentina(+) = TRIM ('D')
AND F_OUTER.Iraq = extra.SF(+)
AND F_OUTER.harvest_date = N.harvest_date(+)
AND F_OUTER.Argentina = N.Argentina(+)
AND F_OUTER.Norway = N.Hawaii(+)
AND N.Jordon(+) = '0'
/
79. Q2
The subqueries in the select clause look like
select CASE WHEN F.f1 IS NULL
THEN NULL
ELSE (SELECT X.f2
FROM X
WHERE code_vl = F.f1)
END AS f0
from F;
and should be merged into the query like:
select CASE WHEN F.f1 IS NULL
THEN NULL
ELSE ( X.f2)
END AS f0
from F , X
where code_vl(+) = F.f1;
select CASE WHEN F.f1 IS NULL
THEN NULL
ELSE (SELECT X.f2
FROM X
WHERE code_vl = F.f2)
END AS f0
from F;
select CASE WHEN F.f1 IS NULL
THEN NULL
ELSE ( X.f2)
END AS f0
from F , X
where code_vl(+) = F.f1;
80. Q3
SELECT DISTINCT *
FROM
FOO.a a, FOO.c c, FOO.d d, FOO.g g
WHERE
a.planted_date > '01-OCT-08' AND
a.planted_date < '03-OCT-08' AND
a.pears = 'D' AND a.green_beans = '1' AND
a.planted_date = c.planted_date AND
a.pears = c.pears AND
a.zuchinis = c.zuchinis AND
a.brocoli = c.brocoli AND
a.planted_date = d.planted_date AND
a.pears = d.pears AND
a.harvest_size = d.harvest_size AND
c.oranges = d.oranges AND
c.apples = d.apples AND
(d.lemons = 0 OR d.lemons IS NULL) AND
a.planted_date = g.planted_date AND
a.pears = g.pears AND
a.harvest_size = g.harvest_size AND
c.oranges = g.oranges AND
c.apples = g.apples AND
(g.lemons = 0 OR g.lemons IS NULL) AND
a.zuchinis = '0236' AND
d.apples = g.apples AND
d.oranges = g.oranges
ORDER BY a.zuchinis, a.brocoli;
82. Q3
82 6/22/2013
SELECT * FROM
(
SELECT /*+ NO_MERGE */ c.apples, c.oranges, a.harvest_size
FROM a, c
WHERE
a.planted_date = TO_DATE ('02/10/2008', 'dd/mm/yyyy') AND
a.pears = 'D' AND
a.green_beans = '1' AND
a.planted_date = c.planted_date AND
a.pears = c.pears AND
a.zuchinis = c.zuchinis AND
a.brocoli = c.brocoli AND
a.zuchinis = '0236'
) X,
(
SELECT /*+ NO_MERGE */ d.apples, d.oranges, d.harvest_size
FROM d, g
WHERE
d.planted_date = TO_DATE ('02/10/2008', 'dd/mm/yyyy') AND
g.planted_date = TO_DATE ('02/10/2008', 'dd/mm/yyyy') AND
g.apples = d.apples AND
d.oranges = g.oranges AND
d.pears = 'D' AND
g.pears = 'D' AND
g.pears = d.pears AND
g.harvest_size = d.harvest_size AND
(d.lemons = 0 OR d.lemons IS NULL) AND
(g.lemons = 0 OR g.lemons IS NULL)
) Y
WHERE
X.oranges = Y.oranges AND
X.apples = Y.apples AND
X.harvest_size = Y.harvest_size;
This final version runs in
elapsed 0.33 secs and 12K logical reads
down from an original
elapsed 4.5 secs and 1M logical reads
83. HINTS
• Leading (tab_alias , table_alias … ) 10g (9i use ORDERED, not as good )
• USE_NL (table_alias) – Inner Table (2cd in xpla not driving)
• USE_HASH (table_alias) – probe into (1st in xplan)
• INDEX (tab_alias index_name)
• NO_MERGE
Oracle first decides join order then join type
(example http://www.adp-gmbh.ch/blog/2008/01/17.php)
83 6/22/2013
86. What tools to use to create VST diagrams?
• Paper
– Modifications messy and difficult
• PowerPoint
– Can move things around
– Sticky connectors
– Easy to modify
• DB Optimizer
– Automatic and still modifiable
87. VST Steps Summary
1.Diagram tables
2.Draw connectors for each join
3.Calculate filter ratio
1.If many to many then
calculate two table join sizes
Execution Path
• Start at the most selective join filter
• Join to keep the running result set size small
Many to Many relationships = problems
6/22/2013
Parent
Child
Parent
Child
F
F
30%
0.02%
S
A
OD
P ODT
C OT
O
96. Types of Subqueries
• subquery
– query in where clause
– Select 1 from dual where 1 = (select 1 from dual);
• correlated subquery
– Subquery uses fields from outer query
– Select 1 from dual a where 1=(select 1 from dual b where
a.dummy=b.dummy)
• scalar subquery
– Query in select list
– Returns 1 value or null , ie scalar
– Select (select 1 from dual) from dual;
• inline views
– Query in from clause
– Select 1 from dual a, (select 1 from dual ) b;
98. • Layout tables Graphically
– Details tables above Masters
– One to one relations side by side
– Many to many any which way
Many to
single value
99. Join Set Sizes
Join type max result set size
possible
notes
one-to-scalar A this is equivalent to a filter on A
table B returns one value like a max(), min(),
count() etc
one-to-one min(rA,rB)
one-to-many rA
Joining from A to B will not increase the result set
size
many-to-many rA*rB
-------------------------
min(ndv(A),ndv(B))
The more duplicates in both tables the greater
chance
the result set size will explode
99 6/22/2013
We can say a lot about the join set size between two tables just by the
join type and the number of rows in the table and NDV in the join column,
but the easiest way most often is just to extract the two table joins and
run a count(*) on that subset of the query
100. Join Filter ratios
A
B Jm=1
Jd ~> 1
FK
PK
A
B Jm <= 1
Jd ~> 1
detail
Master
Unique
index or
unique
constraint
Jd, = join detail ratio , the avg number of rows returned when joining from the master to child
Jm = master join ratio, the avg number of rows returned joining from the child into the master.
Jm = 1 when PK/FK relations,
Jm < 1 possible when unique indexes or unique constraints instead of PK/FK.
Jd < 1 rare but acts as filter instead of a multiplier
101. Hash Join vs NL
Col A
Col B
Col C Filter &
Join IndexCol D
Table Y
Table X
Filter Index
Join Index
Col A
Col B
Col C
Filter Index
Join Index
Col D
Table Y
Table X
Filter Index
Join Index
NL HJ
Driving Table (smaller set)
Drive from Table Y off of set of rows
returned from filter on column C
Nested loops into Table X on Index on
Join
Filter results without Index even though
index on filter column
Create hash result set on Table Y from
filter on column C
Probe hash result set with rows from
filter on table X on column A
Filter Index
Join Index
Build Hash Table
Probe Hash Table
NL
X
Y
HJ
X
Y
104. Nest Loops left deep
T1 T2
T3
T4
NL
NL
NL
T1
T2
T3
T4
NL
NL
NL
probed
probed
probed
105. Nest Loops can’t be right deep
T3 T4
T2
T1 NL
T1
NL
T2
NL
T3
T4
probed
probed
probed
NL
NL
NL
106. Bushy
T1 T2
HJ
NL
T1
T2
NL
T3
T4
NL
T3 T4
NL
HJ
select t3id, a.*, b.* from
( select /*+ no_merge */
t2.id t2id, t1.data t1data, t2.data t2data
from t1, t2
where t1.id = t2.id ) a,
( select /*+ no_merge */
t3.id t3id, t3.data t3data, t4.data t4data
from t3, t4
where t3.id = t4.id ) b
where a.t2id=b.t3id
/
Editor's Notes
Layout a diagram tables as nodes and joins as connectorsDraw connectors for each join in where clause1 to 1 connectionuse blue line1 to many use black linecrows feet towards manymany to many crows feet on both endsCalculate filter ratios for any tables with filtersfilter ratio = number of rows returned with filter / number of rowsdisplay in yellow below table nodeFind the table sizes for each tabledisplay in green above table nodeCalculate two table join sizes for all two table joins in diagram (ie for every connection line)extract the join information, including filters, and run count on that joindisplay in red on join lineAlternatively, or as a complement, calculate join filter ratios in both directionsdisplay at each end of join connection line
SELECT order_line_dataFROM customers cus INNER JOIN orders ord ON ord.id_customer = cus.id INNER JOIN order_linesorl ON orl.id_order = ord.id INNER JOIN products prd1 ON prd1.id = orl.id_product INNER JOIN suppliers sup1 ON sup1.id = prd1.id_supplierWHERE cus.location = 'LONDON' AND ord.date_placed BETWEEN '04-JUN-10' AND '11-JUN-10' AND sup1.location = 'LEEDS' AND EXISTS ( SELECT NULL FROM alternatives alt INNER JOIN products prd2 ON prd2.id = alt.id_product_sub INNER JOIN suppliers sup2 ON sup2.id = prd2.id_supplier WHERE alt.id_product = prd1.id AND sup2.location != 'LEEDS' )