Как быстро программно создавать специальные запросы? - PullRequest
2 голосов
/ 17 сентября 2008

Я использовал Excel PivotTable для анализа данных из моей базы данных, потому что он позволяет мне очень быстро «нарезать и вырезать». Поскольку мы знаем, что находится в наших таблицах базы данных, мы все можем писать SQL-запросы, которые делают то же, что и PivotTable.

Но мне интересно, почему PivotTable может создавать запросы так быстро, пока он не знает ничего о данных и значениях / отношениях между полями данных, которые мы ему предоставляем?

Поставьте вопрос по-другому, как мы можем построить ad-hoc SQL-запросы таким быстрым и эффективным способом? («Используйте PivotTable, конечно!», Да, но то, что я хочу, это программный способ).

Ответы [ 3 ]

1 голос
/ 26 февраля 2009

@ Марк Рэнсом определенно настроен на то, что Excel хранит данные в памяти, что ускоряет вычисления. Также возможно, что Excel предварительно индексирует наборы данных таким образом, что делает его более отзывчивым, чем ваша база данных.

Существует одна существенная, неалгоритмическая возможность, почему это быстрее: Excel, в использовании сводной таблицы, не имеет понятия объединения. Когда вы извлекаете данные ad hoc из вашей базы данных, любые объединения или корреляции между таблицами приведут к дальнейшему поиску, сканированию, загрузке индекса и т. Д. Поскольку в Excel все данные находятся в одном месте (ОЗУ или нет), он может выполнять поиск без необходимости предварительно формировать наборы данных. Если бы вам пришлось загружать данные вашей базы данных во временную таблицу, было бы интересно посмотреть, как специальные запросы к этой таблице складываются с точки зрения производительности в отношении Excel.

Одно можно сказать наверняка: хотя базы данных являются отличными инструментами для создания точных отчетов, традиционно нормализованная база данных будет гораздо менее оптимальной для специальных запросов. Поскольку нормализованные структуры данных фокусируются на целостности превыше всего (если можно так выразиться), они жертвуют специальной оптимизацией за счет сохранения разумности всех данных. Хотя это плохой пример, рассмотрим следующую нормализованную схему:

+--------+     +---------+
|tblUsers|     |luGenders|
+--------+     +---------+
|userID  |     |genderID |
|genderID||gender   |
+--------+     +---------+

SELECT * FROM luGenders;
> 1 Female
> 2 Male

Если в этом примере мы хотим узнать количество пользователей женского / мужского пола в нашей системе, базе данных потребуется обработать объединение и вести себя соответствующим образом (опять же, это плохой пример из-за малого числа объединений и небольшое количество возможных значений, что обычно должно привести к некоторой оптимизации ядра базы данных). Однако, если бы вы выгрузили эти данные в Excel, вы все равно понесли бы некоторые потери в базе данных, чтобы извлечь данные, но на самом деле поворот данных в Excel был бы довольно быстрым. Вполне возможно, что это представление о начальном штрафе с фиксированной стоимостью не принимается из-за того, что вы считаете, что Excel быстрее, чем прямые специальные запросы, но у меня нет данных для комментариев.

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

Мораль истории: наличие полностью алгоритмической, быстрой системы специальных запросов - это потрясающий идеал, но он меньше практического, учитывая ограничения пространства и времени (память и человеко-часы). Чтобы эффективно создать специальную систему, вам действительно необходимо понять варианты использования ваших данных и затем эффективно их денормализовать.

Я бы настоятельно рекомендовал Инструментарий хранилища данных . Для справки, я не администратор баз данных, я просто скромный аналитик, который тратит 80 часов в неделю на изучение Excel и Oracle. Я знаю твою боль.

1 голос
/ 17 сентября 2008

Просто манипулируйте вашим заказом и групповыми предложениями по мере необходимости.

Excel работает быстро, потому что все данные находятся в памяти, и их можно быстро и эффективно отсортировать.

0 голосов
/ 17 сентября 2008

Мое интуитивное чувство подсказывает мне, что ответ будет иметь какое-то отношение к контуру сводной таблицы, который имеет фиксированное количество зон, а именно:

- the Page Fields zone  
- the Column Fields zone  
- the Row Fields zone and
- the Data zone

По моему дикому предположению:

- The Page zone builds the WHERE part of the ad-hoc query.  
- The Column zone will put whichever fields drag-dropped to it in the GROUP BY clause.  
- The Row zone will build a SELECT DISTINCT <field names>
- The Data zone will apply an AGGREGATE function to the field drag-dropped to it. 

Как вы думаете, что произойдет "за сценой", когда мы перетаскиваем поля в эти зоны?

...