If I could ensure SQL never using index/table scans and make it fail without proper indexes it would be a major help.
Indeed, I find NoSQL very unpredictable. When your query hits and index, the query goes well. When not, you usually end up doing a whole database scan. Plus you usually cannot use more than one index for a given query, and some NoSQL require an index just for ordering....
(you can't have a reliable system with random behavior where system drops to table scans when statistics are incomplete or something)
And yes, ordering requires an index.
In PostgreSQL if you want to know what indices are used by a query, just ask the system using an EXPLAIN ANALYZE query and if it does not use any indices, create them (or live with the performance).
Also there are "Index-only scans" which I do not know much about but may well fit your approach: https://wiki.postgresql.org/wiki/Index-only_scans
So to summarize: automatic index selection is not random and slow queries can be identified pretty easy.
So I take it you are not using any kind of cache in your memory hierarchy?
I agree that table scan will be faster if I need a large percentage of the table (more than can be cached).
Plus having queries to fail if not use an index... seems worse than just having slower (if that would be the case) queries.