I’m not sure this is the case for you, but I do know that Obsidian is actively only loading parts of longer documents related to what is visible or not. This mean that if you table header is a portion of your document Obsidian believes is not visible, it’s removed from memory. This also means that it can as sticky as it likes, but if it’s not loaded it’ll not show.
One possible workaround could possibly be to insert your table headers into the table every now and then. How is you table defined? Is it dynamic from a query, or have you written it all manually so that it’s a static table? If a query, what kind of a query are you using? (In some cases, it might be possible to add these extra rows as part of the query, or post-processing of the result)