Оптимизация неуклюжего запроса - PullRequest
2 голосов
/ 26 февраля 2012

Я работаю в школе и создал базу данных, чтобы помочь с кошмаром проверять, какие дети ходят в какие школы после школьных клубов.

Я попытался сделать это, создав базу данных, основанную накаждый из 42 регистров (документы Excel) с использованием таблиц ссылок.Затем я настроил несколько запросов, которые ищут учеников по определенным формам, по которым я затем генерирую отчет, чтобы каждая группа форм могла видеть, ходили ли дети в своей форме в клуб за определенную неделю.

Мои знания SQL являются базовыми: я могу писать запросы для выполнения различных задач, но не знаю, как оптимизировать большие запросы.

Проблема, с которой я сталкиваюсь, заключается в том, что для создания каждого отчета требуется 2 минуты 30 секунд.добавил все 42 регистра к запросу.Раньше, когда у меня было только 31, отчет генерировался за 30 секунд.

Вот пример запроса:

SELECT [UID], [Name], [Group], [Week 1], [Week 2], [Week 3],
    [Week 4], [Week 5], [Week 6]
FROM [club 1]
WHERE ((([Club 1].[Group])="group name"))

UNION ALL 

SELECT [UID], [Name], [Group], [Week 1], [Week 2], [Week 3],
    [Week 4], [Week 5], [Week 6]
FROM [club 42]
WHERE ((([Club 42].[Group])="group name"));

Запрос имеет 41 UNION ALL SELECT после начальногоSELECT и, скорее всего, это самый важный, ужасно плохо написанный запрос, но, как я уже сказал, мои знания SQL являются базовыми, и я учусь по ходу дела.

Дополнительная информация: Есть 480учащиеся, включенные в эти регистры, и один учащийся могут посещать более одного клуба в неделю, поэтому по запросу необходимо будет найти каждый случай, когда ученик посещал клуб.

Возможности, не связанные с использованием Access with Excel, очень и оченьограничено.Я поговорил с некоторыми друзьями и посмотрел на подход MySQL и настройку локального сервера в сети, но наша сеть - это управляемый сервис, и компания, которая управляет ею, очень обидно говорить о настройке на своих серверах (как минимум)Понятно, что так).

Я полагаю, что для того, что мне нужно, это, пожалуй, единственный способ сделать это, и запрос занимает 2 минуты 30 секунд лучше, чем 30 минут, которые потребовались для ручной проверки каждогорегистрироваться каждую пятницу.Причина, по которой я пытаюсь разобраться в этом:

A) Я хочу расширить свои знания в области программирования и до сих пор умудрилась пропустить SQL
B) Учителя, обращающиеся к базе данных, частонетерпеливо нажимайте случайно при загрузке отчета, пытаясь заставить его работать быстрее или из-за разочарования, что часто приводит к сбою Access

Ответы [ 3 ]

3 голосов
/ 26 февраля 2012

Я бы посоветовал не иметь таблицы для каждого клуба, а только одну таблицу с дополнительным столбцом [Club_Name] или ID для последующего присоединения результатов к таблице клубов.

Таким образом, запрос будет выглядеть примерно так:

SELECT [UID], [Name], [Group], [Club_Name], [Week 1], [Week 2], [Week 3],
    [Week 4], [Week 5], [Week 6]
FROM [Clubs]
WHERE ((([Clubs].[Group])="group name"));

Как вы думаете, было бы возможно сделать это?

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

Основная проблема, с которой вы столкнулись, заключается в том, что вы извлекаете данные из 42 различных источников через неуклюжий механизм. Это не то, что вы сделали неправильно, это просто факт, учитывая вашу архитектуру системы Excel to Access.

Если у пользователей вашей сети есть лицензия на использование Access, вы можете заменить свои 42 электронных таблицы Excel единой базой данных Access, к которой пользователи подключаются в совместно используемом режиме. Хранение всех данных в одной таблице вместо 42 внешних связанных источников данных даст вам время отклика менее секунды для генерации отчетов.

Вернувшись в хейди VB3, я создавал приложения VB и Access, которыми многие люди пользовались по сети. Ваш сетевой провайдер не может возражать против того, чтобы один файл был сохранен на их сервере.

Если у ваших пользователей нет лицензии на использование Access, вы можете создать простой интерфейс ASP.NET для общей базы данных Access.

После того как вы приняли решение перейти на единую общую базу данных, вы также должны убедиться, что структура вашей базы данных нормализована, чтобы ваши запросы могли быть простыми и эффективными, а код обслуживания данных - простым. Не думайте с точки зрения дизайна электронных таблиц! Если вы собираетесь пойти по этому пути и вам нужен совет по разработке схемы, оставьте комментарий, чтобы сообщить мне.

0 голосов
/ 26 февраля 2012

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

Если все 42 клуба предоставляют одинаковые данные о студентах, то все они должны быть в одной таблице.Должен быть дополнительный столбец "ClubId", чтобы указать, к какому клубу относятся данные.Для того, чтобы ClubId имел смысл, должна быть таблица клубов с данными о клубе, такими как название клуба.В этой таблице есть столбец с именем «Id», который обеспечивает контрольную точку для ClubId в вашей таблице посещаемости.

Хороший дизайн - это не только вышеперечисленное, но это намного дальше, чем сейчас.

Узнайте, как объединить таблицы, полученные из регистров Excel, в одну таблицу.Узнайте, как использовать объединение для объединения данных из регистров с данными о клубах.Пишите хороший запрос.Работа с вашим объемом данных должна занять несколько секунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...