SlideShare a Scribd company logo
1 of 141
Download to read offline
#MDBW17
DECIPHERING EXPLAIN OUTPUT
Charlie Swanson
Understand how
MongoDB answers
queries
KNOWLEDGE
Figure out what's
going on
DEBUGGING
Learn some tricks to
optimize your queries &
aggregations
BEST PRACTICES
GOALS OF THIS TALK
#MDBW17
CHARLIE
SWANSON
SOFTWARE ENGINEER - QUERY TEAM
#MDBW17
OVERVIEW
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
TARGET QUESTIONS
• Is your query using an index? Which one? 🤔
#MDBW17
TARGET QUESTIONS
• Is your query using an index? Which one?
• Is your query using an index to provide the sort?
🤔
#MDBW17
TARGET QUESTIONS
• Is your query using an index? Which one?
• Is your query using an index to provide the sort?
• How many of the examined documents ended up matching?
🤔
#MDBW17
TARGET QUESTIONS
• Is your query using an index? Which one?
• Is your query using an index to provide the sort?
• How many of the examined documents ended up matching?
• Why did the server choose to answer the query the way it did?
🤔
#MDBW17
TARGET QUESTIONS
• Is your query using an index? Which one?
• Is your query using an index to provide the sort?
• How many of the examined documents ended up matching?
• Why was your winning plan chosen?
• Can my queries go faster?
🤔
#MDBW17
EXAMPLE QUERY
#MDBW17
HOW CAN THE SERVER ANSWER THIS QUERY?
#MDBW17
TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
✅
✅
OPTION 1: COLLECTION SCAN
#MDBW17
COLLECTION SCAN: TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
✅
✅
204587
190587
SORT
01.
02.
#MDBW17
COLLECTION SCAN: TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
✅
✅
01.
02.
SORT
PROJECTION
02
01
{nFavorites: 204587,
username: '@TaylorSwift'}
{nFavorites: 109587,
username: '@Charlie'}
#MDBW17
01.
02.
SORT
PROJECTION
COLLECTION SCAN
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
✅
✅
#MDBW17
OPTION 1: COLLECTION SCAN
SORT
PROJECT
COLLECTION SCAN
#MDBW17
OPTION 2: INDEX SCAN TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
INDEX:
{nFavorites: -1}
204587
190587
87983
83092
76032
29023
…
#MDBW17
TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
INDEX:
{nFavorites: -1}
204587
190587
87983
83092
76032
29023
…
Stop
when
entry is
smaller
than
100,000
#MDBW17
TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
INDEX:
{nFavorites: -1}
204587
190587
87983
83092
76032
29023
…
SORTED!
#MDBW17
TWITTER.TWEETS
INDEX
204587
190587
87983
83092
123
123
…
INDEX SCAN
SORT
#MDBW17
TWITTER.TWEETS
INDEX
204587
190587
87983
83092
123
123
…
INDEX SCAN
FETCH
204587
190587
{ _id: 400000,
createdAt: ISODate(…),
username: "@TaylorSwift", …
{ _id: 400001,
createdAt: ISODate(…),
username: "@Charlie", … }
#MDBW17
TWITTER.TWEETS
INDEX
204587
190587
87983
83092
123
123
…
INDEX SCAN
FETCH
204
190
{ _id: 400000,
{ _id: 400001,
PROJECTION
{nFavorites: 204587,
username: '@TaylorSwift'}
{nFavorites: 109587,
username: '@Charlie'}
{ _id: 400000,
createdAt: ISODate(…),
{ _id: 400001,
createdAt: ISODate(…),
username: "@Charlie", }
#MDBW17
FETCH
204
190
{ _id: 400000,
{ _id: 400001,
PROJECTION
INDEX
204587
190587
87983
83092
123
123
…
INDEX SCAN
#MDBW17
OPTION 2: INDEX SCAN
FETCH
PROJECT
INDEX SCAN
#MDBW17
MANY WAYS TO ANSWER A QUERY… WHICH WAS IT?
SORT
PROJECT
COLLECTION
FETCH
PROJECT
INDEX SCAN
…
#MDBW17
WHAT IS EXPLAIN?
1. Command to explain execution of various other commands
2. Helper on shell cursor object
WHAT IS EXPLAIN? - COMMAND
WHAT IS EXPLAIN? - SHELL HELPER
WHAT IS EXPLAIN? - SHELL HELPER
???
#MDBW17
QUERY PLANS
SORT
PROJECT
COLLECTION
FETCH
PROJECT
INDEX SCAN
…OR
FETCH
INDEX SCAN INDEX SCAN
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
EXPLAIN OUTPUT
> db.collection.find(…).explain("queryPlanner")
{
"queryPlanner" : {
…
"winningPlan" : {…},
"rejectedPlans" : […]
},
…
}
Optional, this is the
default
#MDBW17
EXPLAIN OUTPUT
> db.collection.find(…).explain()
{queryPlanner: {
winningPlan: {
stage: "SORT",
inputStage: {
stage: "FETCH",
inputStage: {
stage: "IXSCAN"
}
}
}
}
}}
FETCH
INDEX SCAN
{nFavorites: -1}
SORT
#MDBW17
EXPLAIN OUTPUT
> db.collection.find(…).explain()
{
…
stage: "IXSCAN"
keyPattern: {nFavorites: -1},
indexBounds: {
a: [ "[inf.0, 100000]" ]

},
… // Other index scan
// specific stats.
…
}}
FETCH
INDEX SCAN
keyPattern: {
nFavorites: -1
}
indexBounds: […]
…
SORT
#MDBW17
EXPLAIN OUTPUT
> db.collection.find(…).explain()
{
"queryPlanner" : {
…
"winningPlan" : {
// Encodes selected plan.
},
"rejectedPlans" : […]
},
…
}
FETCH
INDEX SCAN
SORT
#MDBW17
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {
{"stage" : "SORT",
"inputStage" : {…}
}}
},
"rejectedPlans" : [
{"stage" : "SORT",
"inputStage" : {…}
}}
…
]
}}
EXPLAIN OUTPUT
FETCH
INDEX SCAN
SORT
COLL_SCAN
SORT
APPLYING THIS INFORMATION
#MDBW17
IS YOUR QUERY USING THE INDEX YOU EXPECT?
#MDBW17
IS YOUR QUERY USING THE INDEX YOU EXPECT?
FETCH
SORT
✓ COLLECTION SCAN
SORT
✗
INDEX SCAN
keyPattern: {nFollowers: -1}
#MDBW17
IS YOUR QUERY USING THE INDEX YOU EXPECT?
#MDBW17
IS YOUR QUERY USING THE INDEX YOU EXPECT?
db.tweets.explain().find(
{nFavorites: {$gte: 100000}},
{_id: 0, nFavorites: 1, username: 1})
.sort({nFavorites: -1})
#MDBW17
IS YOUR QUERY USING THE INDEX YOU EXPECT?
db.tweets.explain().find(
{nFavorites: {$gte: 100000}},
{_id: 0, nFavorites: 1, username: 1}).sort({nFavorites: -1})
{ "queryPlanner": {
"winningPlan": {
"stage": "PROJECTION",
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": {"nFavorites": -1},
"indexBounds": {
"nFavorites": ["[inf.0, 100000.0]"]
} } } },
"rejectedPlans": [ ] } }
#MDBW17
IS YOUR QUERY USING AN INDEX TO PROVIDE THE
SORT?
#MDBW17
IS YOUR QUERY USING AN INDEX TO PROVIDE THE
SORT?
FETCH
INDEX SCAN
✓ ✗FETCH
INDEX SCAN
SORT
#MDBW17
IS YOUR QUERY USING AN INDEX TO PROVIDE THE
SORT?
#MDBW17
db.tweets.explain().find(
{nFavorites: {$gte: 100000}},
{_id: 0, nFavorites: 1, username: 1}).sort({nFavorites: -1})
{ "queryPlanner": {
"winningPlan": {
"stage": "PROJECTION",
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": {"nFavorites": -1},
"indexBounds": {
"nFavorites": ["[inf.0, 100000.0]"]
} } } },
"rejectedPlans": [ ] } }
IS YOUR QUERY USING AN INDEX TO PROVIDE THE
SORT?
NO SORT STAGE ✅
#MDBW17
SORT_MERGE IS OK
✓SORT_MERGE
INDEX SCAN
FETCH
INDEX SCAN
#MDBW17
BONUS: IS YOUR QUERY USING AN INDEX TO
PROVIDE THE PROJECTION?
#MDBW17
COMPOUND INDEX TWITTER.TWEETS
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
{…} {…} {…} {…} {…} {…}
INDEX:
{username: 1, nFavorites: -1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEng" 83092
"@MongoDBEng" 76032
… …
#MDBW17
COMPOUND INDEX
db.tweets.find({
username: {$in: ["@MongoDBEng", "@MongoDB"]},
nFavorites: {$gt: 50000}}})
TWITTER.TWEETS
INDEX:
{username: 1, nFavorites: -1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEng" 83092
"@MongoDBEng" 76032
… …
#MDBW17
COMPOUND INDEX
db.tweets.find(
{username: {$in: ["@MongoDBEng", "@MongoDB"]}, nFavorites: {$gt: 50000}}},
{_id: 0, username: 1, nFavorites: 1})
TWITTER.TWEETS
INDEX:
{username: 1, nFavorites: -1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEng" 83092
"@MongoDBEng" 76032
… …
#MDBW17
COMPOUND INDEX
db.tweets.find(
{username: {$in: ["@MongoDBEng", "@MongoDB"]}, nFavorites: {$gt: 50000}}},
{_id: 0, username: 1, nFavorites: 1})
TWITTER.TWEETS
{username: 1, nFavorites:
-1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEn
g"
83092
"@MongoDBEn
g"
76032
… …
INDEX SCAN
PROJECTION
#MDBW17
COMPOUND INDEX
db.tweets.find(
{username: {$in: ["@MongoDBEng", "@MongoDB"]}, nFavorites: {$gt: 50000}}},
{_id: 0, username: 1, nFavorites: 1})
TWITTER.TWEETS
{username: 1, nFavorites:
-1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEn
g"
83092
"@MongoDBEn
g"
76032
… …
INDEX SCAN
PROJECTION
"COVERED"
#MDBW17
COMPOUND INDEX
db.tweets.find(
{username: {$in: ["@MongoDBEng", "@MongoDB"]}, nFavorites: {$gt: 50000}}},
{_id: 0, username: 1, nFavorites: 1, other: 1})
{username: 1, nFavorites:
-1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEn
g"
83092
"@MongoDBEn
g"
76032
… …
TWITTER.TWEETS
INDEX SCAN
PROJECTION
FETCH
"NOT COVERED"
#MDBW17
COMPOUND INDEX
db.tweets.find(
{username: {$in: ["@MongoDBEng", "@MongoDB"]}, nFavorites: {$gt: 50000}}},
{_id: 0, username: 1, nFavorites: 1})
.sort({username: 1})
TWITTER.TWEETS
{username: 1, nFavorites:
-1}
"@Charlie" 29023
"@MongoDB" 87983
"@MongoDB" 60587
"@MongoDB" 7983
"@MongoDBEn
g"
83092
"@MongoDBEn
g"
76032
… …
INDEX SCAN
PROJECTION
"COVERED"
PROJECTION
"COVERED"
SORT
#MDBW17
PROJECTION
INDEX SCAN
✓ ✗
PROJECTION
INDEX SCAN
FETCH
IS YOUR QUERY USING AN INDEX TO PROVIDE THE
PROJECTION?
#MDBW17
THE POWER OF "QUERYPLANNER"
• Is your query using an index? Which one?
• Is your query using an index to provide the sort?
• Is your query using an index to provide the projection?
#MDBW17
NEXT UP: "IT'S USING AN INDEX, SO WHAT'S TAKING
SO LONG?"
db.tweets.explain().find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
FETCH
INDEX SCAN
keyPattern: {createdDate: 1}
#MDBW17
IT'S USING AN INDEX, SO WHAT'S TAKING SO LONG?
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
FETCH
INDEX SCAN
keyPattern: {createdDate: 1}
12:02
12:03
12:04
…
INDEX SCAN
INDEX:
{createdAt: 1}
#MDBW17
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
{createdDate: 12:02,
favorites: [
"@MongoDB",
"@taylorswift"
]}
FETCH
FETCH
filter: {
favorites: "@eliothorowitz"
}
INDEX SCAN
keyPattern: {createdDate: 1}
IT'S USING AN INDEX, SO WHAT'S TAKING SO LONG?
12:02
12:03
12:04
…
INDEX:
{createdAt: 1}
#MDBW17
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
{createdDate: 12:02,
favorites: [
"@MongoDB",
"@taylorswift"
]}
FETCH
FETCH
filter: {
favorites: "@eliothorowitz"
}
INDEX SCAN
keyPattern: {createdDate: 1}
❌
IT'S USING AN INDEX, SO WHAT'S TAKING SO LONG?
12:02
12:03
12:04
…
INDEX:
{createdAt: 1}
#MDBW17
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
{createdDate: 12:03,
favorites: [
"@eliothorowitz",
"@taylorswift"
]}
FETCH
FETCH
filter: {
favorites: "@eliothorowitz"
}
INDEX SCAN
keyPattern: {createdDate: 1}
IT'S USING AN INDEX, SO WHAT'S TAKING SO LONG?
12:02
12:03
12:04
…
INDEX:
{createdAt: 1}
#MDBW17
SO HOW MANY OF THEM WERE THROWN OUT?
• What percentage of the index keys in the scanned range ended up
matching the predicate?
• What's the selectivity?
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
01: OUTPUT IS VERY LARGE
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
EXPLAIN MODE: "QUERYPLANNER"
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {
{"stage" : "SORT",
"inputStage" : {…}
}}
},
"rejectedPlans" : [
{"stage" : "SORT",
"inputStage" : {…}
}}
…
]
}}
#MDBW17
• "executionStats"
EXPLAIN MODE: "EXECUTIONSTATS"
created by Mike Ashley from Noun Project
created by Creative Stall from Noun Project
#MDBW17
EXPLAIN MODE: "EXECUTIONSTATS"
> db.tweets.find(…).explain("executionStats")
{
"queryPlanner" : {
…
"winningPlan" : {…},
"rejectedPlans" : […]
},
"executionStats": { // New!
…,
"executionStages": {…}
}
…
}
#MDBW17
DETAILS: "EXECUTIONSTATS"
> db.tweets.find(…).explain("executionStats")
{
"queryPlanner" : { /* Same as before. */ },
"executionStats": {
// Top-level stats.
"executionStages": {
stage: "SORT",
// Sort stats.
inputStage: {
// etc, etc.

}
}
}
…
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
> db.tweets.find(…).explain("executionStats")
{
…,
"executionStats" : {
// Top-level stats.
"nReturned" : 390000,
"executionTimeMillis" : 4431,
"totalKeysExamined" : 390000,
"totalDocsExamined" : 390000,
"executionStages" : {…}
},
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
DETAILS: "EXECUTIONSTATS"
#MDBW17
db.tweets.find(…).explain("executionStats")
{
"executionStats" : {
// Top-level stats.
"executionStages" : {
"stage" : "SORT",
"nReturned" : 390000,
"executionTimeMillisEstimate" : 2030,
…
"sortPattern" : { "nFollowers" : 1 },
"memUsage" : 20280000,
"memLimit" : 33554432,
"inputStage" : {…}
}
}
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
DETAILS: "EXECUTIONSTATS"
#MDBW17
db.tweets.find(…).explain("executionStats")
{
"executionStats" : {
// Top-level stats.
"executionStages" : {
"stage" : "SORT",
"nReturned" : 390000,
"executionTimeMillisEstimate" : 2030,
…
"sortPattern" : { "nFollowers" : -1 },
"memUsage" : 20280000,
"memLimit" : 33554432,
"inputStage" : {…}
}
}
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
DETAILS: "EXECUTIONSTATS"
#MDBW17
db.tweets.find(…).explain("executionStats")
{
"executionStats" : {
// Top-level stats.
"executionStages" : {
"stage" : "SORT",
"nReturned" : 390000,
"executionTimeMillisEstimate" : 2030,
"works" : 780003,
"advanced" : 390000,
"needTime" : 390002,
"isEOF" : 1,
"sortPattern" : { "b" : 1 },
…
"inputStage" : {…}
}
}
}
? FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
DETAILS: "EXECUTIONSTATS"
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
• These are all PlanStages
‒SortStage
‒FetchStage
‒IndexScanStage
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
• These are all PlanStages
• Each PlanStage implements
work()
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
• These are all PlanStages
• Each PlanStage implements
work(), returns one of:
• ADVANCED
• NEED_TIME
• IS_EOF
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
work()
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
work()
work()
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
work()
work()
work()
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
work()
work()
ADVANCED ID
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXECUTION STATS: WORKS, ADVANCED, ETC.
ADVANCED {…}
work()
ADVANCED
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
SORT
EXECUTION STATS: WORKS, ADVANCED, ETC.
NEED_TIME ADVANCED
work()
ADVANCED
FETCH
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
DETAILS: "EXECUTIONSTATS"
db.tweets.find(…).explain("executionStats")
{
"executionStats" : {
// Top-level stats.
"executionStages" : {
"stage" : "SORT",
"nReturned" : 390000,
"executionTimeMillisEstimate" : 2030,
"works" : 780003,
"advanced" : 390000,
"needTime" : 390002,
"isEOF" : 1,
"sortPattern" : { "b" : 1 },
…
"inputStage" : {…}
}
}
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
DETAILS: "EXECUTIONSTATS"
> db.tweets.find(…).explain("executionStats")
{"executionStats": {
"executionStages": {
stage: "SORT",
// Sort stats, includes "works", "advanced", …
inputStage: {
stage: "FETCH",
// Fetch stats, includes "works", "advanced", …
inputStage: {

// etc, etc.
}

}
}
}
…
}
FETCH
SORT
INDEX SCAN
keyPattern: {hashtags: 1}
#MDBW17
EXPLAIN MODE: "EXECUTIONSTATS"
> db.tweets.find(…).explain("executionStats")
{
"queryPlanner" : {
…
"winningPlan" : {…},
"rejectedPlans" : […]
},
"executionStats": { // New!
…,
"executionStages": {…}
}
…
}
APPLYING THIS INFORMATION
#MDBW17
HOW SELECTIVE IS YOUR INDEX?
#MDBW17
HOW SELECTIVE IS YOUR INDEX?
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
12:02
12:03
12:04
12:06
…
INDEX SCAN
FETCH
INDEX SCAN
keyPattern: {createdDate: -1}
#MDBW17
HOW SELECTIVE IS YOUR INDEX?
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
{
"executionStats" : {
"nReturned" : 314,
"totalKeysExamined" : 2704, // < 12% matched
…
}
FETCH
INDEX SCAN
keyPattern: {createdDate: -1}
#MDBW17
WHAT'S THE MOST EXPENSIVE PART OF YOUR PLAN?
#MDBW17
WHAT'S THE MOST EXPENSIVE PART OF YOUR PLAN?
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
}) FETCH
filter: {
favorites: "@eliothorowitz"
}
INDEX SCAN
keyPattern: {createdDate: 1}
#MDBW17
WHAT'S THE MOST EXPENSIVE PART OF YOUR PLAN?
db.tweets.explain("executionStats").find(…)
FETCH
executionTimeMillisEstimate: 431
INDEX SCAN
executionTimeMillisEstimate: 67
#MDBW17
WHAT'S THE MOST EXPENSIVE PART OF YOUR PLAN?
db.tweets.explain("executionStats").find(…)
FETCH
works: 2705
advanced: 314
needTime: 2391
INDEX SCAN
#MDBW17
OUR PROGRESS
• "queryPlanner"
• Is your query using the index you expect?
• Is your query using an index to provide the sort?
• Is your query using an index to provide the projection?
• "executionStats"
• How selective is your index?
• Which part of your plan is the most expensive?
#MDBW17
NEXT UP: "WHY WAS THIS PLAN CHOSEN?"
db.tweets.explain("executionStats").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
• We had an index on {favorites: 1}, would that have been
faster?
🤔
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
EXPLAIN MODE: "QUERYPLANNER"
❓
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {
{"stage" : "SORT",
"inputStage" : {…}
}}
},
"rejectedPlans" : [
{"stage" : "SORT",
"inputStage" : {…}
}}
…
]
}}
#MDBW17
QUERY PLANNING
#MDBW17
• MultiPlanStage::pickBestPlan()
QUERY PLANNING
…
MultiPlanStage
work()
work()
work()
#MDBW17
• MultiPlanStage::pickBestPlan()
QUERY PLANNING
…
MultiPlanStage
ADVANCED
NEED_TIME
ADVANCED
#MDBW17
• MultiPlanStage::pickBestPlan()
QUERY PLANNING
…
MultiPlanStage
Advances: 78 22 50
#MDBW17
• MultiPlanStage::pickBestPlan()
QUERY PLANNING
…
MultiPlanStage
Advances: 78 22 50
#MDBW17
EXPLAIN MODE: "ALLPLANSEXECUTION"
> db.tweets.find(…).explain("allPlansExecution")
{
"queryPlanner" : {
…
"winningPlan" : {…},
"rejectedPlans" : […]
},
"executionStats": {
…,
"executionStages": {…},
"allPlansExecution": […] // New!
}
…
}
#MDBW17
EXPLAIN MODE: "QUERYPLANNER"
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {…}
},
"rejectedPlans" : [
{…},
…
],
}}
#MDBW17
EXPLAIN MODE: "EXECUTIONSTATS"
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {…}
},
"rejectedPlans" : [
{…},
…
],
"executionStats": {

"executionStages": {…}
}
}}
#MDBW17
EXPLAIN MODE: "ALLPLANSEXECUTION"
> db.collection.find(…).explain()
{"queryPlanner" : {
"winningPlan" : {…}
},
"rejectedPlans" : [
{…},
…
],
"executionStats": {

"executionStages": {…}
"allPlansExecution": [

{…},
{…},
…
]
}
}}
#MDBW17
EXPLAIN MODE: "ALLPLANSEXECUTION"
db.tweets.explain("allPlansExecution").find({
createdDate: {$gte: <today>},
favorites: "@eliothorowitz"
})
{
"executionStats": {
"allPlansExecution": [
{nReturned: 34,
executionStages: { /* Index Scan on "favorites" */ }
},
{nReturned: 101,
executionStages: { /* Index Scan on "createdDate" */ }
}
]
}
…
}
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
#MDBW17
SLOW QUERIES
• Queries with response time >100ms (server side) are logged:
2017-05-25T10:01:58.917-0400 I COMMAND [conn7] command twitter.tweets appName: "MongoDB Shell" command: find
{ find: "tweets", filter: { nFavorites: { $gte: 10000.0 } }, limit: 20.0, singleBatch: false, sort:
{ nFavorites: -1.0, username: 1.0 }, projection: { _id: 0.0, nFavorites: 1.0, username: 1.0 } } planSummary:
IXSCAN { nFavorites: -1 } keysExamined:359907 docsExamined:359907 hasSortStage:1 cursorExhausted:1 numYields:
2871 nreturned:20 reslen:1087 locks:{ Global: { acquireCount: { r: 5744 } }, Database: { acquireCount: { r: 2872
} }, Collection: { acquireCount: { r: 2872 } } } protocol:op_command 1493ms
#MDBW17
SLOW QUERIES
• Queries with response time >100ms (server side) are logged:
2017-05-25T10:01:58.917-0400 I COMMAND [conn7] command twitter.tweets appName: "MongoDB Shell" command: find
{ find: "tweets", filter: { nFavorites: { $gte: 10000.0 } }, limit: 20.0, singleBatch: false, sort:
{ nFavorites: -1.0, username: 1.0 }, projection: { _id: 0.0, nFavorites: 1.0, username: 1.0 } } planSummary:
IXSCAN { nFavorites: -1 } keysExamined:359907 docsExamined:359907 hasSortStage:1 cursorExhausted:1 numYields:
2871 nreturned:20 reslen:1087 locks:{ Global: { acquireCount: { r: 5744 } }, Database: { acquireCount: { r: 2872
} }, Collection: { acquireCount: { r: 2872 } } } protocol:op_command 1493ms
#MDBW17
SLOW QUERIES
• Queries with response time >100ms (server side) are logged:
2017-05-25T10:01:58.917-0400 I COMMAND [conn7] command twitter.tweets appName: "MongoDB Shell" command:
find { find: "tweets", filter: { nFavorites: { $gte: 10000.0 } }, limit: 20.0,
singleBatch: false, sort: { nFavorites: -1.0, username: 1.0 }, projection: { _id: 0.0,
nFavorites: 1.0, username: 1.0 } } planSummary: IXSCAN { nFavorites: -1 } keysExamined:359907
docsExamined:359907 hasSortStage:1 cursorExhausted:1 numYields:2871 nreturned:20 reslen:1087 locks:{ Global:
{ acquireCount: { r: 5744 } }, Database: { acquireCount: { r: 2872 } }, Collection: { acquireCount: { r:
2872 } } } protocol:op_command 1493ms
#MDBW17
SLOW QUERIES
• Queries with response time >100ms (server side) are logged:
2017-05-25T10:01:58.917-0400 I COMMAND [conn7] command twitter.tweets appName: "MongoDB Shell" command: find
{ find: "tweets", filter: { nFavorites: { $gte: 10000.0 } }, limit: 20.0, singleBatch: false, sort:
{ nFavorites: -1.0, username: 1.0 }, projection: { _id: 0.0, nFavorites: 1.0, username: 1.0 } } planSummary:
IXSCAN { nFavorites: -1 } keysExamined:359907 docsExamined:359907 hasSortStage:1
cursorExhausted:1 numYields:2871 nreturned:20 reslen:1087 locks:{ Global: { acquireCount: { r: 5744 } },
Database: { acquireCount: { r: 2872 } }, Collection: { acquireCount: { r: 2872 } } } protocol:op_command 1493ms
#MDBW17
SLOW QUERIES
• Queries with response time >100ms (server side) are logged.
• Configurable via profiling parameter 'slowMs'
#MDBW17
THE PROFILE
• If turned on, queries show up in the system.profile collection
{ "op": "query",
"ns": "twitter.tweets",
"query": { "find": "tweets", "filter": { … }, "limit": 20, "sort": { … }, "projection": { … } },
"millis": 1355,
"planSummary": "IXSCAN { nFavorites: -1 }",
"execStats": {
"stage": "PROJECTION",
"inputStage": {
"stage": "SORT",
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
} } } } } }
#MDBW17
OTHER COMMANDS
db.runCommand({
explain: {/* command */},
verbosity: <queryPlanner|executionStats|allPlansExecution>
})
#MDBW17
OTHER COMMANDS
db.runCommand({
explain: {findAndModify: {…}},
verbosity: <queryPlanner|executionStats|allPlansExecution>
})
#MDBW17
OTHER COMMANDS
db.runCommand({
explain: {update: {…}},
verbosity: <queryPlanner|executionStats|allPlansExecution>
})
#MDBW17
OTHER COMMANDS
db.runCommand({
explain: {aggregate: {…}},
verbosity: <queryPlanner|executionStats|allPlansExecution>
})
#MDBW17
AGGREGATION
• Aggregation is special…
runCommand({
aggregate: "collection",
pipeline: […],
explain: <true|false>
})
#MDBW17
AGGREGATION
• Aggregation is was special…
• 3.4 and earlier:
• 3.6 and beyond:
runCommand({
aggregate: "collection",
pipeline: […],
explain: <true|false>
})
runCommand({explain: {
aggregate: "collection",
pipeline: […],
},
verbosity: "…" })
#MDBW17
AGGREGATION
db.explain().aggregate([{$group: {…}}, {$project: {…}}])
{
stages: [
{$cursor: {…}},
{$group: {…}},
{$project: {…}},
]
}
#MDBW17
AGGREGATION
db.explain().aggregate([{$group: {…}}, {$project: {…}}])
{
stages: [
{$cursor: {
query: {…},
fields: {…},
queryPlanner: {/* same as query explain! */},
executionStats: {/* 3.6+ only, same as query explain! */}
}},
{$group: {…}},
{$project: {…}} ] }
#MDBW17
01 02 03 04 05
Motivation "queryPlanner"
Verbosity
"executionStats"
Verbosity
"allPlansExecution"
Versbosity
Beyond Queries
Why do you care? Describing considered
plans
More details about
winning plan
More details about
plan selection
Log messages
What is explain? The profile
Other commands
SUMMARY
SOME FINAL THOUGHTS
#MDBW17
01: OUTPUT IS VERY LARGE
#MDBW17
COMPASS SHOUTOUT
#MDBW17
COMPASS SHOUTOUT
#MDBW17
COMPASS SHOUTOUT
#MDBW17
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
Your Application
MongoDB
created by Mike Ashley from Noun Project
#MDBW17
Your Application MongoDB
Can I see all the tweets
with hashtag
"#MDBW17" from this
hour?
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
Hmm… Let me
think about
that…
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
Ah! Here are
your results!
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
Your Application MongoDB
What took you
so long?!
#MDBW17
Your Application MongoDB
What took you
so long?!
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
What took you
so long?!
- network latency
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
What took you
so long?!
- network latency
- large result set
{…} {…} {…} {…} {…} {…} {…}
{…}
{…}
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
What took you
so long?!
- network latency
- large result set
- server contention
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
#MDBW17
Your Application MongoDB
What took you
so long?!
- network latency
- large result set
- server contention
- query planning problem
02: EXPLAIN WON'T SOLVE ALL YOUR PROBLEMS
Deciphering Explain Output

More Related Content

What's hot

What's hot (20)

M Tech 2nd Semester (CMOS VLSI) Question papers
M Tech 2nd Semester (CMOS VLSI) Question papers M Tech 2nd Semester (CMOS VLSI) Question papers
M Tech 2nd Semester (CMOS VLSI) Question papers
 
5.4 randomized datastructures
5.4 randomized datastructures5.4 randomized datastructures
5.4 randomized datastructures
 
Audio Source Separation Based on Low-Rank Structure and Statistical Independence
Audio Source Separation Based on Low-Rank Structure and Statistical IndependenceAudio Source Separation Based on Low-Rank Structure and Statistical Independence
Audio Source Separation Based on Low-Rank Structure and Statistical Independence
 
Decoder Full Presentation
Decoder Full Presentation Decoder Full Presentation
Decoder Full Presentation
 
Baseband transmission
Baseband transmissionBaseband transmission
Baseband transmission
 
Advanced Low Power Techniques in Chip Design
Advanced Low Power Techniques in Chip DesignAdvanced Low Power Techniques in Chip Design
Advanced Low Power Techniques in Chip Design
 
Amplitude modulation
Amplitude modulationAmplitude modulation
Amplitude modulation
 
Sour Pickles
Sour PicklesSour Pickles
Sour Pickles
 
Huffman coding
Huffman coding Huffman coding
Huffman coding
 
Greedy Algorithm - Huffman coding
Greedy Algorithm - Huffman codingGreedy Algorithm - Huffman coding
Greedy Algorithm - Huffman coding
 
Huffman's algorithm in Data Structure
 Huffman's algorithm in Data Structure Huffman's algorithm in Data Structure
Huffman's algorithm in Data Structure
 
Cracking Digital VLSI Verification Interview: Interview Success
Cracking Digital VLSI Verification Interview: Interview SuccessCracking Digital VLSI Verification Interview: Interview Success
Cracking Digital VLSI Verification Interview: Interview Success
 
Combinational Logic with MSI and LSI
Combinational Logic with MSI and LSICombinational Logic with MSI and LSI
Combinational Logic with MSI and LSI
 
Apriori algorithm
Apriori algorithmApriori algorithm
Apriori algorithm
 
Low power
Low powerLow power
Low power
 
Introduction to Vertica (Architecture & More)
Introduction to Vertica (Architecture & More)Introduction to Vertica (Architecture & More)
Introduction to Vertica (Architecture & More)
 
Unit 4 sequential circuits
Unit 4  sequential circuitsUnit 4  sequential circuits
Unit 4 sequential circuits
 
Apriori Algorithm
Apriori AlgorithmApriori Algorithm
Apriori Algorithm
 
Spark and Spark Streaming at Netfix-(Kedar Sedekar and Monal Daxini, Netflix)
Spark and Spark Streaming at Netfix-(Kedar Sedekar and Monal Daxini, Netflix)Spark and Spark Streaming at Netfix-(Kedar Sedekar and Monal Daxini, Netflix)
Spark and Spark Streaming at Netfix-(Kedar Sedekar and Monal Daxini, Netflix)
 
Lecture optimal binary search tree
Lecture optimal binary search tree Lecture optimal binary search tree
Lecture optimal binary search tree
 

Viewers also liked (6)

MongoDB Performance Tuning
MongoDB Performance TuningMongoDB Performance Tuning
MongoDB Performance Tuning
 
MongoDB World 2016: Deciphering .explain() Output
MongoDB World 2016: Deciphering .explain() OutputMongoDB World 2016: Deciphering .explain() Output
MongoDB World 2016: Deciphering .explain() Output
 
MongoDB WiredTiger Internals
MongoDB WiredTiger InternalsMongoDB WiredTiger Internals
MongoDB WiredTiger Internals
 
MongodB Internals
MongodB InternalsMongodB Internals
MongodB Internals
 
MongoDB: How it Works
MongoDB: How it WorksMongoDB: How it Works
MongoDB: How it Works
 
Inside MongoDB: the Internals of an Open-Source Database
Inside MongoDB: the Internals of an Open-Source DatabaseInside MongoDB: the Internals of an Open-Source Database
Inside MongoDB: the Internals of an Open-Source Database
 

Similar to Deciphering Explain Output

Building a real time, big data analytics platform with solr
Building a real time, big data analytics platform with solrBuilding a real time, big data analytics platform with solr
Building a real time, big data analytics platform with solr
lucenerevolution
 

Similar to Deciphering Explain Output (20)

Reading the .explain() Output
Reading the .explain() OutputReading the .explain() Output
Reading the .explain() Output
 
MongoDB .local Munich 2019: Still Haven't Found What You Are Looking For? Use...
MongoDB .local Munich 2019: Still Haven't Found What You Are Looking For? Use...MongoDB .local Munich 2019: Still Haven't Found What You Are Looking For? Use...
MongoDB .local Munich 2019: Still Haven't Found What You Are Looking For? Use...
 
MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...
MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...
MongoDB .local Paris 2020: Tout savoir sur le moteur de recherche Full Text S...
 
MongoDB .local Chicago 2019: Still Haven't Found What You Are Looking For? Us...
MongoDB .local Chicago 2019: Still Haven't Found What You Are Looking For? Us...MongoDB .local Chicago 2019: Still Haven't Found What You Are Looking For? Us...
MongoDB .local Chicago 2019: Still Haven't Found What You Are Looking For? Us...
 
Beyond php it's not (just) about the code
Beyond php   it's not (just) about the codeBeyond php   it's not (just) about the code
Beyond php it's not (just) about the code
 
A Free New World: Atlas Free Tier and How It Was Born
A Free New World: Atlas Free Tier and How It Was Born A Free New World: Atlas Free Tier and How It Was Born
A Free New World: Atlas Free Tier and How It Was Born
 
Beyond php - it's not (just) about the code
Beyond php - it's not (just) about the codeBeyond php - it's not (just) about the code
Beyond php - it's not (just) about the code
 
MongoDB.local DC 2018: Tips and Tricks for Avoiding Common Query Pitfalls
MongoDB.local DC 2018: Tips and Tricks for Avoiding Common Query PitfallsMongoDB.local DC 2018: Tips and Tricks for Avoiding Common Query Pitfalls
MongoDB.local DC 2018: Tips and Tricks for Avoiding Common Query Pitfalls
 
Beyond PHP - it's not (just) about the code
Beyond PHP - it's not (just) about the codeBeyond PHP - it's not (just) about the code
Beyond PHP - it's not (just) about the code
 
Beyond PHP - It's not (just) about the code
Beyond PHP - It's not (just) about the codeBeyond PHP - It's not (just) about the code
Beyond PHP - It's not (just) about the code
 
GraphQL - an elegant weapon... for more civilized age
GraphQL - an elegant weapon... for more civilized ageGraphQL - an elegant weapon... for more civilized age
GraphQL - an elegant weapon... for more civilized age
 
Webinar: Index Tuning and Evaluation
Webinar: Index Tuning and EvaluationWebinar: Index Tuning and Evaluation
Webinar: Index Tuning and Evaluation
 
N1QL: What's new in Couchbase 5.0
N1QL: What's new in Couchbase 5.0N1QL: What's new in Couchbase 5.0
N1QL: What's new in Couchbase 5.0
 
Building a real time big data analytics platform with solr
Building a real time big data analytics platform with solrBuilding a real time big data analytics platform with solr
Building a real time big data analytics platform with solr
 
Building a real time, big data analytics platform with solr
Building a real time, big data analytics platform with solrBuilding a real time, big data analytics platform with solr
Building a real time, big data analytics platform with solr
 
Beyond php - it's not (just) about the code
Beyond php - it's not (just) about the codeBeyond php - it's not (just) about the code
Beyond php - it's not (just) about the code
 
The Rough Guide to MongoDB
The Rough Guide to MongoDBThe Rough Guide to MongoDB
The Rough Guide to MongoDB
 
Indexing
IndexingIndexing
Indexing
 
Beyond php - it's not (just) about the code
Beyond php - it's not (just) about the codeBeyond php - it's not (just) about the code
Beyond php - it's not (just) about the code
 
Domain Driven Design Tactical Patterns
Domain Driven Design Tactical PatternsDomain Driven Design Tactical Patterns
Domain Driven Design Tactical Patterns
 

More from MongoDB

More from MongoDB (20)

MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB AtlasMongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
MongoDB SoCal 2020: Migrate Anything* to MongoDB Atlas
 
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
MongoDB SoCal 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
MongoDB SoCal 2020: Using MongoDB Services in Kubernetes: Any Platform, Devel...
 
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDBMongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
MongoDB SoCal 2020: A Complete Methodology of Data Modeling for MongoDB
 
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
MongoDB SoCal 2020: From Pharmacist to Analyst: Leveraging MongoDB for Real-T...
 
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series DataMongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
MongoDB SoCal 2020: Best Practices for Working with IoT and Time-series Data
 
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 MongoDB SoCal 2020: MongoDB Atlas Jump Start MongoDB SoCal 2020: MongoDB Atlas Jump Start
MongoDB SoCal 2020: MongoDB Atlas Jump Start
 
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
MongoDB .local San Francisco 2020: Powering the new age data demands [Infosys]
 
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
MongoDB .local San Francisco 2020: Using Client Side Encryption in MongoDB 4.2
 
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
MongoDB .local San Francisco 2020: Using MongoDB Services in Kubernetes: any ...
 
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
MongoDB .local San Francisco 2020: Go on a Data Safari with MongoDB Charts!
 
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your MindsetMongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
MongoDB .local San Francisco 2020: From SQL to NoSQL -- Changing Your Mindset
 
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas JumpstartMongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
MongoDB .local San Francisco 2020: MongoDB Atlas Jumpstart
 
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
MongoDB .local San Francisco 2020: Tips and Tricks++ for Querying and Indexin...
 
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
MongoDB .local San Francisco 2020: Aggregation Pipeline Power++
 
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
MongoDB .local San Francisco 2020: A Complete Methodology of Data Modeling fo...
 
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep DiveMongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
MongoDB .local San Francisco 2020: MongoDB Atlas Data Lake Technical Deep Dive
 
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & GolangMongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
MongoDB .local San Francisco 2020: Developing Alexa Skills with MongoDB & Golang
 
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
MongoDB .local Paris 2020: Realm : l'ingrédient secret pour de meilleures app...
 
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
MongoDB .local Paris 2020: Upply @MongoDB : Upply : Quand le Machine Learning...
 

Recently uploaded

Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Recently uploaded (20)

Decarbonising Commercial Real Estate: The Role of Operational Performance
Decarbonising Commercial Real Estate: The Role of Operational PerformanceDecarbonising Commercial Real Estate: The Role of Operational Performance
Decarbonising Commercial Real Estate: The Role of Operational Performance
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
API Governance and Monetization - The evolution of API governance
API Governance and Monetization -  The evolution of API governanceAPI Governance and Monetization -  The evolution of API governance
API Governance and Monetization - The evolution of API governance
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
JavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate GuideJavaScript Usage Statistics 2024 - The Ultimate Guide
JavaScript Usage Statistics 2024 - The Ultimate Guide
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Design and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data ScienceDesign and Development of a Provenance Capture Platform for Data Science
Design and Development of a Provenance Capture Platform for Data Science
 
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
TEST BANK For Principles of Anatomy and Physiology, 16th Edition by Gerard J....
 
ChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps ProductivityChatGPT and Beyond - Elevating DevOps Productivity
ChatGPT and Beyond - Elevating DevOps Productivity
 
Choreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software EngineeringChoreo: Empowering the Future of Enterprise Software Engineering
Choreo: Empowering the Future of Enterprise Software Engineering
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Quantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation ComputingQuantum Leap in Next-Generation Computing
Quantum Leap in Next-Generation Computing
 
How to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cfHow to Check CNIC Information Online with Pakdata cf
How to Check CNIC Information Online with Pakdata cf
 
Modernizing Legacy Systems Using Ballerina
Modernizing Legacy Systems Using BallerinaModernizing Legacy Systems Using Ballerina
Modernizing Legacy Systems Using Ballerina
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 

Deciphering Explain Output