Причина, по которой это работает так медленно, заключается в том, что DENSE_RANK()
и ROW_NUMBER()
являются функциями. Движок должен прочитать каждую запись в таблице, которая соответствует предложению WHERE, применить функцию к каждой строке, сохранить значение функции и затем получить первые 5 из этого списка.
«Простая» верхняя 5 использует индекс таблицы, чтобы получить первые 5 записей, которые соответствуют предложению WHERE. В лучшем случае движок может прочитать только пару страниц индекса. В худшем случае, возможно, придется прочитать несколько страниц с данными. Даже без индекса движок читает строки, но не должен выполнять функцию или работать с временными таблицами.