Я согласен с веткой Unreason Однако .Но есть кое-что, что нужно знать об этом случае.
Это называется перекосом и перекосом.Это идеальное использование для частичного индекса, когда вы исключаете 95% оплаченных счетов и индексируете только более интересные и выборочные статистические данные.Но у тебя этого нет.Вы можете разделить все строки по горизонтали на отдельные таблицы / разделы, но тогда вам необходимо учитывать перенос строк (переход из одного состояния в другое), и это дорого.СУБД должна выполнить обновление, удаление и вставку, чтобы изменить статус.Если у вас система с большим объемом, это будет больно.
Забудьте, что вы сказали о том, индексировать или нет на основе селективности, потому что размещение индекса в быстро меняющемся столбце также обычно является плохой идеей.В вашем индексе будут горячие блоки, в которых удаляются все шаги 1, а в другом - вставляются все шаги 2, и, кстати, некоторые шаги 2 удаляются одновременно в шаги 3.Это не будет хорошо масштабироваться.
Я бы порекомендовал разделить ваш статус по вертикали на отдельные таблицы.
Ваша таблица счетов-фактур будет иметь PK и все столбцы, кроме статуса.
С вашим статусом вы можете справиться двумя способами.Эта таблица будет иметь значение PK в виде FK для таблицы счетов, статус и временную метку, когда вы ввели этот статус.Лучшей является горизонтально разделенная таблица по статусу.У вас будет раздел для каждого возможного статуса.Таким образом, обнаружение всего или одного состояния «Помещено» приведет к удалению раздела и чтению только того раздела, который ему необходим, а это очень небольшое количество блоков.Поскольку строка очень узкая, вы можете получить 400 статусов счетов за один блок.Просмотреть этот статус любого счета легко, поскольку на ПК имеется глобальный индекс.
Если ваша СУБД не поддерживает разбиение с переносом строк, вам нужно управлять этими разделами как таблицами и удалять изодин и вставить в другой.Вы будете инкапсулировать эти движения в транзакции в процедуре, чтобы поддерживать чистоту данных.Каждый счет находится в одной и только одной таблице состояния.Более сложная часть запроса по идентификатору счета-фактуры, вам придется проверять каждую таблицу, чтобы увидеть, где она находится.
У вас есть другой выбор Вы можете написать платные статусы или нет.Если это многораздельная таблица, вы можете просто удалить накладную из таблицы состояния накладной, когда она переходит на платную.(Конечно, вы запишете платную запись в таблицу истории, упомянутую в бонусном материале).Затем вы выполните внешнее объединение с таблицей состояния, а значение null означает оплаченныйЕсли вы почти никогда не запрашиваете платный статус, на самом деле нет причин делать этот быстрый запрос.
Бонусный материал
в любом случае вы захотите отслеживать эти движения в отчетеТаблица.Каждый раз, когда вы обновляете статус, вы хотите записать его в таблицу истории.В конце концов, вы захотите проанализировать то, что я называю временем транзита.Какое среднее время от заполненного до платного по месяцам?Это увеличивается в результате плохой экономики?какое время транзита от размещенного до заполненного, по месяцам.Летние месяцы занимают больше времени из-за отсутствия тел в отпуске?Вы поняли.Обновляя этот столбец, вы теряете эти ответы, поэтому вам нужно встроить этот журнал в свои процедуры.