Question about error "join inner did not fit in memory"
Hello,
We are using Vertica 7.2 on a 4 nodes cluster, in a lab environment.
On the Vertica MC, we are observing this error quite frequently, in the context of the qualification of an SQL package.
We are more particularly concerned by one type of occurrence of this message, mentioning a join between 2 tables, one of them being always strictly empty.
In addition to that, we see that the initiator node of this error is always the same.
Finally, when we look at the results of all our queries, everything looks OK.
So I have several questions here:
1) Why would a join where one of the table is empty cause a memory problem?
2) Any reason why this is always the same node that is reporting the problem, and not the others ?
3) Should we really worry about the results of our query execution, given that we do not observe any symptoms other than this message in the console and in vertica logfile?
4) What can we change to prevent this error?
Thanks for helping,
Comments
Hi,
The error happens when the INNER part of the join did not fit in memory.
To answer your questions :
1) Why would a join where one of the table is empty cause a memory problem?
Is the empty table in the INNER part ( it should be ) if not maybe you don't have the right statistics so Vertica choses the wrong table in the INNER.
2) Any reason why this is always the same node that is reporting the problem, and not the others ?
Is this the query initiator?
3) Should we really worry about the results of our query execution, given that we do not observe any symptoms other than this message in the console and in vertica logfile?
The result should be fine, but the query performance probably is slower , in the way that works is, vertica run the query, inner do not fit in memory, Vertica prints the error and retry the querying spilling on disk the data that does not fit in MEM.
4) What can we change to prevent this error?
To avoid this problem you could,
I recommend you to read this docs to understand better what the query is doing
https://my.vertica.com/kb/Reading-Query-Plans/Content/BestPractices/Reading-Query-Plans.htm?Highlight=explain
https://my.vertica.com/docs/SolutionsArchitects/systemtables.pdf
https://my.vertica.com/kb/Redesigning-Projections-for-Query-Optimization/Content/BestPractices/Redesigning-Projections-for-Query-Optimization.htm?Highlight=projection
Hope this helps.
Eugenia
Thanks a lot Eugenia, I sent this to our R&D, will get back as soon as I have answers
Hi again,
1) Our query looks like:
Select A,B,C,D FROM TABLE_A AS A INNER JOIN TABLE_B AS B ON A.F1 = B.F2 INNER JOIN TABLE_C AS C ON A.F3 = C.F4 WHERE ...
The table that is empty is TABLE_B, so my understanding is that we are in the good case, right ?
2) Yes, this is always the query initiator.
If you have any suggestion to improve the query, please tell me
can you do an EXPLAIN the query? if Table_b is empty it should not be join spill if table_b is the inner.
My mistake, you were right, this is TABLE_A which is empty, not table_B.
If I understand you, we should put it in 2nd position ...?
Does the table has statistics? Because if so, Optimizer should do the change, otherwise it will follow the way that the query is written. If you do EXPLAIN it will tell you if the table has statistics or not.
Hi,
The table had no statistics,so I did an ANALYZE_STATISTICS (''), on the entire database, but at the end, the table still did not have statistics, at least this is what the explain says.
Then I did an export_statistics('my_stat');, it says successful, but did not produce any files.
Any idea why ?
Hi,
the empty table won't have statistics because it is empty. But Vertica should had got statistics in the other tables and that should had helped the query.
the export statistics create a file 'my_stat' on the vertica node, you need to look for it in the folders.
if you want it in your screen do select export_statistics('');. or if you are connecting from a client computer you can do
vsql -c "select export_statistics('');" > my_state.xml
Hope this helps
Eugenia
Hi Eugenia,
I was finally able to generate statistics, for all tables of my data model.
The EXPLAIN looks different now, the INNER table is now the one that is empty.
Unfortunately, I am still getting the same errors, but not on the same node as previously.
I have attached the EXPLAIN results, before and after the statistics generation.
If you have time to look at it, that would be great.
I attached a new version of the explain output, the previous was garbaged, sorry.
The exact error I get in vertica.log is:
2017-02-15 12:43:17.384 Init Session:0x7f3e3c015c00-c0000000498577 [EE] Join inner did not fit in memory [(SCHEMA_2.TABLE_EMPTY x SCHEMA_2.TABLE_BIG) using previous join and TABLE_BIG_b0 (PATH ID: 1)]
Please change the explain to Merge Join, have a try!
@llecocq -
Check out "Optimizing for Merge Join":
https://www.vertica.com/blog/optimizing-for-merge-joinba-p223279/
And "Choosing Sort Order: Best Practices":
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/AdministratorsGuide/ConfiguringTheDB/PhysicalSchema/ChoosingSortOrderBestPractices.htm