sybase - showplan значительно снижает предполагаемый ввод-вывод, добавляя другую таблицу к запросу - PullRequest
0 голосов
/ 22 августа 2009

Приложение запроса было изменено, но теория та же.

4 таблицы:

states - список состояний (индекс по штату) магазины - магазины и состояние, в котором они находятся (отдельные индексы состояния, магазина) store_orders - привязывает заказ к магазину (отдельные индексы в магазине, заказ) order_statuses - имеет заказ и статус (отдельные индексы по заказу, статусу)

Я хочу посчитать, сколько заказов в каждом статусе для определенного состояния.

Один запрос:

выберите os.order_status, count (os.order_status) из магазинов sto, store_order так, order_statuses os где sto.state = 'PA' и sto.store = so.store и так.order = os.order группа по os.order_status

в реальном приложении, шоу-план возвращается с оценкой ввода-вывода около 500 000

Но если я сделаю:

выберите os.order_status, count (os.order_status) из состояний sta, store sto, store_order так, order_statuses os где sta.state = 'PA' где sto.state = sta.state и sto.store = so.store и так.order = os.order группа по os.order_status

Количество операций ввода-вывода оценивается примерно в 2000, и все, что я сделал, чтобы изменить запрос, - это соединить таблицу состояний с таблицей магазинов и указать точное значение в состояниях вместо магазинов.

Не будет ли СУБД по-прежнему выполнять тот же поиск хранилищ, указываю ли я явное значение или присоединяюсь к другой таблице с этим явным значением?

Я пытаюсь выяснить, почему предполагаемый ввод / вывод намного выше.

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

1 Ответ

3 голосов
/ 24 августа 2009

Lazy Bob, Можете ли вы также включить статистику ввода-вывода, а затем добавить результаты к вопросу:

установить статистику io на

showplan сам по себе не даст такую ​​информацию, как вы сообщили в комментариях

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

Ваш запрос говорит: "где sta.state = 'PA', где sto.state = sta.state" и, очевидно, не то, что вы могли бы запустить

...