Применение запроса было изменено, но теория осталась прежней.
4 стола:
состояния - список состояний (индекс по состоянию) магазины - магазины и состояние, в котором они находятся (отдельные индексы по состоянию, магазину) store_orders - привязывает заказ к магазину (отдельные индексы по магазину, заказу) order_statuses - имеет порядок и статус (отдельные индексы по заказу, статусу)
Я хочу подсчитать, сколько заказов находится в каждом статусе для определенного штата.
Один запрос:
выберите os.order_status, count(os.order_status) из магазинов sto, store_order so, order_statuses os, где sto.state = 'PA' и sto.store = so.store и so.order = os.order group по os.order_status
в реальном приложении показанный здесь план показа возвращается с предполагаемым вводом-выводом около 500 000
Но если я сделаю:
выберите os.order_status, count(os.order_status) из состояний sta, store sto, store_order so, order_statuses os, где sta.state = 'PA', где sto.state = sta.state и sto.store = so.store и так далее. порядок = группа os.order по os.order_status
Количество операций ввода-вывода оценивается примерно в 2000, и все, что я сделал для изменения запроса, — это соединил таблицу состояний с таблицей магазинов и указал точное значение в состояниях, а не в хранилищах.
Разве DBM по-прежнему не придется выполнять тот же поиск хранилищ, независимо от того, укажу ли я явное значение или присоединюсь к другой таблице с этим явным значением?
Я пытаюсь понять, почему предполагаемый ввод-вывод намного выше.
Я не администратор базы данных, но стараюсь учиться как можно больше, потому что я постоянно сталкиваюсь с такими вещами, и я никогда не знаю, почему.