2011-11-27 3 views
-4

Я хотел бы, чтобы оптимизировать мой запрос, я в настоящее время к югу от запроса таблицы, загруженной с последовательностью значений SMALLINT от 0 до 9999.Является ли GENERATE SERIES быстрее, чем SUBQUERY?

enter image description here

+2

Отметьте его и посмотрите. И какая база данных? –

+0

Это моя собственная база данных. –

+0

Возможно, вы не понимаете вопрос о базе данных. Это SQL Server или Oracle или MySQL или ...? Мы не можем дать вам ответ на производительность без понимания базы данных, на которую написан ваш запрос. –

ответ

2

Единственный способ вы можете сказать наверняка, является Попробуй это.

Я провел аналогичные тесты, используя PostgreSQL несколько месяцев назад. Вопрос в том, имеет ли смысл заменять таблицу календаря на generate_series().

В нашем случае стол был быстрее. Но если вы проверите, вы, вероятно, обнаружите, что функция generate_series() становится быстрее в определенном количестве строк. (Это то, что мы нашли, но количество строк было хорошо по сравнению с тем, что мы использовали). Я предполагаю, что в этот момент время, затрачиваемое на создание серии, становится меньше времени, необходимого для считывания индекса и строк диск.

Это предположение, потому что PostpreSQL EXPLAIN ANALYZE не дает вам подробностей о дисковых вводах-выводах.

+0

У меня была очень похожая ситуация, как таблица фактов календаря http://stackoverflow.com/questions/2616119/date-lookup-table-1990-01-012041-12-31 .. Мое положение: у меня есть таблица фактов с только одним маленьким целочисленным (32767) столбцом, содержащим ряд от 0 до 9999, и его индексированный, который выполняет подзапрос NOT IN ко всем числам, которые были нарисованы (2820 номеров) в лотерее Pick-4, m думая, что использование серии генерации происходит быстрее, чем открыть дополнительную таблицу с 10 000 строк? –

+0

Я бы не предполагал, что ваш dbms должен «открыть таблицу». Угадание не очень хорошо масштабируется, особенно с системами управления базами данных. Вот почему все они включают некоторый способ увидеть, что делает оптимизатор запросов. Вы должны * предположить, что каждый запрос NOT IN не сможет использовать индекс. Google «выражающие смещение выражения». 10000 строк не очень много; ваш оптимизатор может выполнить последовательное сканирование в этой таблице, даже если он * может * использовать индекс. –

+0

наш SET EXPLAIN ON - еще одна область, где мы не получаем много объяснений о том, что происходит. Хотя наш оптимизатор запросов основан на затратах, объяснение не говорит нам о таких вещах, как: использование дискового ввода-вывода, использование ЦП, использование сканирования таблицы против индекса и т. Д. Обычно я делаю безопасную загрузку, чтобы минимизировать другие процессы и используйте анализатор производительности диспетчера задач WINDOWS или «sar» UNIX (отчет о системной активности), чтобы узнать, что происходит. Мой прошлый опыт - это подзапрос, который должен сканировать через таблицу, содержащую 10 000 строк, которые оцениваются с помощью NOT IN, что эквивалентно OR, более дорого, чем NOT IN (1,2,3 ...) –

Смежные вопросы