@@ match operator in PostgreSQL - Time & Space Complexity
We want to understand how the time it takes to search text using the @@ match operator changes as the amount of data grows.
How does the search time increase when we have more text to check?
Analyze the time complexity of the following code snippet.
SELECT *
FROM documents
WHERE content_vector @@ to_tsquery('search & term');
This query finds all rows in the documents table where the content_vector matches the search terms using full-text search.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Checking the search condition against each document's text vector.
- How many times: Once per document row, but optimized by an index if available.
As the number of documents grows, the search checks more entries, but indexes help keep it efficient.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks, quickly filtered by index |
| 100 | About 100 checks, still fast with index |
| 1000 | About 1000 checks, index keeps search efficient |
Pattern observation: The search time grows roughly in proportion to the number of matching entries, but indexes prevent a full scan, keeping it close to linear or better.
Time Complexity: O(n)
This means the search time grows roughly in proportion to the number of documents, but indexes help keep it efficient.
[X] Wrong: "The @@ operator always searches instantly no matter how much data there is."
[OK] Correct: Without an index, the search must check every document, which takes longer as data grows.
Understanding how text search scales helps you explain how databases handle large amounts of text efficiently, a useful skill in many real projects.
"What if we removed the index on content_vector? How would the time complexity change?"
Practice
What does the @@ operator do in PostgreSQL?
Solution
Step 1: Understand the purpose of
The@@operator@@operator is used in PostgreSQL for full-text search to match text columns against search queries.Step 2: Compare with other options
Other options describe unrelated operations like numeric comparison, string concatenation, or NULL checks, which are not related to@@.Final Answer:
It matches a text column against a full-text search query. -> Option CQuick Check:
@@= full-text match [OK]
- Confusing @@ with equality operator =
- Thinking @@ concatenates strings
- Assuming @@ checks for NULL
Which of the following is the correct syntax to use the @@ operator with to_tsquery in PostgreSQL?
SELECT * FROM articles WHERE content @@ to_tsquery('search_term');Solution
Step 1: Identify correct usage of
The@@withto_tsquery@@operator requires the right side to be a tsquery, which is created byto_tsquery().Step 2: Check each option
SELECT * FROM articles WHERE content @@ to_tsquery('search_term'); correctly usescontent @@ to_tsquery('search_term'). Options B, C, and D misuse operators or omitto_tsquery().Final Answer:
SELECT * FROM articles WHERE content @@ to_tsquery('search_term'); -> Option AQuick Check:
Use@@ to_tsquery()syntax [OK]
- Using = instead of @@
- Passing plain string without to_tsquery()
- Using LIKE operator for full-text search
Given the table documents with a text_content column, what will this query return?
SELECT id FROM documents WHERE text_content @@ to_tsquery('cat & dog');Assuming the table has these rows:
- 1: 'The cat chased the dog.'
- 2: 'A dog and a cat are friends.'
- 3: 'The cat is sleeping.'
Solution
Step 1: Understand the query condition
The query usesto_tsquery('cat & dog'), which means both 'cat' AND 'dog' must be present intext_content.Step 2: Check each row for both words
Row 1 has 'cat' and 'dog'. Row 2 has both words as well. Row 3 only has 'cat', missing 'dog'.Final Answer:
[1, 2] -> Option BQuick Check:
AND search returns rows with both terms [OK]
- Assuming OR instead of AND with &
- Expecting rows missing one word to match
- Confusing to_tsquery syntax
Identify the error in this query:
SELECT * FROM posts WHERE content @@ 'cat | dog';
Solution
Step 1: Check the right side of @@ operator
The right side must be a tsquery type, usually created byto_tsquery(). Here, it's a plain string.Step 2: Identify the missing function
The query should becontent @@ to_tsquery('cat | dog')to be valid.Final Answer:
Missing to_tsquery() function around the search string. -> Option DQuick Check:
Right side of @@ needs to_tsquery() [OK]
- Using plain string without to_tsquery()
- Thinking | operator is invalid inside to_tsquery
- Confusing @@ with LIKE
You want to find all rows in messages where the body contains either 'error' or 'failure' but not both. Which to_tsquery expression with @@ operator will achieve this?
Solution
Step 1: Understand the requirement
We want rows containing 'error' or 'failure' but NOT both. This is an exclusive OR (XOR) condition.Step 2: Analyze the options
body @@ to_tsquery('(error | failure) & !(error & failure)') uses(error | failure) & !(error & failure), which means 'error or failure' AND NOT 'both error and failure'. This matches XOR logic.Step 3: Check other options
body @@ to_tsquery('error | failure & !error & !failure') is invalid syntax. body @@ to_tsquery('error | failure') matches any with 'error' or 'failure' including both. body @@ to_tsquery('error <-> failure') looks for 'error' immediately followed by 'failure'.Final Answer:
body @@ to_tsquery('(error | failure) & !(error & failure)') -> Option AQuick Check:
XOR = (A OR B) AND NOT (A AND B) [OK]
- Using simple OR instead of XOR
- Incorrect syntax for NOT operator
- Confusing proximity operator <-> with XOR
Ready to prove it?
Pass the test and this pattern moves unknown
