Когда запрос выполняется, что происходит первым в серверной части?
У меня есть запрос в COGNOS, который принесет мне огромный объем данных. Поскольку время выполнения будет выше, я бы хотел настроить мой запрос. Всем известно, что предложение WHERE в запросе будет выполнено первым.
Я сомневаюсь, что произойдет первым при выполнении запроса?
JOIN в запросе будет установлен первым или предложение WHERE будет выполнено первым?
Если JOIN устанавливается первым, я должен сначала указать фильтры DIMENSION, иначе я должен сначала указать фильтры FACT.
Пожалуйста, объясните мне.
Заранее спасибо.
2 ответа
Идея SQL состоит в том, что это декларативный язык высокого уровня, то есть вы сообщаете ему, какие результаты вы хотите, а не как их получить. Есть исключения из этого в различных реализациях SQL, таких как подсказки в Oracle для использования определенного индекса и т. Д., Но, как правило, это верно.
За кулисами оптимизатор для вашей СУБД внедряет реляционную алгебру, чтобы сделать оценку различных потенциальных планов выполнения на основе затрат и выбрать тот, который, по его прогнозам, будет наиболее эффективным. Самое замечательное в этом то, что вам не нужно беспокоиться о том, в каком порядке вы пишете свои предложения where и т. Д., При условии, что вся информация там есть, оптимизатор должен выбрать наиболее эффективный план.
При этом в базе данных часто есть вещи, которые можно использовать для повышения производительности запросов, такие как построение индексов для столбцов в больших таблицах, которые часто используются в критериях фильтрации или объединениях.
Еще один вопрос - можете ли вы использовать параллельные подсказки для ускорения времени выполнения, но это будет зависеть от вашего запроса, используемого плана выполнения, используемой вами СУБД и оборудования, на котором она выполняется.
Если вы публикуете синтаксис запроса и какую СУБД вы используете, мы можем проверить, есть ли что-то очевидное, что может быть изменено в этом случае.
Порядок фильтров определенно не имеет значения. Оптимизатор позаботится об этом.
Что касается фильтрации по таблице фактов или измерений - вы имеете в виду, что вы выставляете одно и то же поле в своей модели Cognos для каждого (например, ProductID из факта и измерения Product)? Если так, то это не рекомендуется. Вообще говоря, вы должны выставить только поле измерения.
Это больше вопрос о вашей среде SQL, однако. Я бы экспортировал SQL, сгенерированный Cognos, из Report Studio (Инструменты -> Показать сгенерированный SQL). Оттуда, надеюсь, вы сможете работать с хорошим администратором баз данных, чтобы увидеть, есть ли какие-либо очевидные недостающие индексы и т. Д. В ваших таблицах.
В Cognos не так много возможностей изменить поколение SQL. В предыдущем постере упоминаются подсказки, которые могут сработать при написании родного SQL, но это понятие не известно Cognos. На самом деле, все, что вы можете сделать, это изменить синтаксис соединения implict/explict, который просто контролирует, происходит ли соединение в операторе ON или в WHERE. Хотя сторона WHERE довольно некрасива, она обычно компилируется так же, как и ON.