Возможно ли в ruby ​​установить конкретную активную запись вызова для чтения грязного

Я смотрю на довольно большую базу данных. Допустим, у меня есть экспортный флаг в записях продукта.
Если я хочу оценить, сколько продуктов у меня есть с флагом, установленным в false, я могу сделать вызов примерно так: Product.where(:exported => false).count.. .

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

Поэтому я хотел бы сделать грязное чтение на столе... Не всегда грязное чтение. И я на 100% не хочу, чтобы все последующие обращения к базе данных по этому соединению были грязными.
Но для этого одного звонка, грязный это то, что я хотел бы.

Ох.. Я должен упомянуть ruby ​​1.9.3 heroku и postgresql.

Теперь... если мне не хватает другого способа получить счет, я был бы рад попробовать это.

О, СНОТ, последняя вещь.. этот пример надуман.

2 ответа

PostgreSQL не поддерживает грязное чтение.

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

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

Или, на PostgreSQL 9.2 и выше, убедитесь, что есть первичный ключ (и, следовательно, уникальный индекс), и убедитесь, что вакуум работает регулярно. Тогда вы сможете сделать довольно быстрый подсчет, так как PostgreSQL должен выбрать сканирование только по индексу первичного ключа.

Обратите внимание, что даже если бы Pg действительно поддерживал грязное чтение, чтение все равно не возвращало бы полностью обновленные результаты, потому что строки иногда вставлялись за указателем чтения при последовательном сканировании. Единственный способ получить абсолютно актуальный счетчик - это предотвратить одновременные вставки: LOCK TABLE thetable IN EXCLUSIVE MODE,

Как только запрос начинает выполняться, он находится в замороженном состоянии только для чтения, потому что в этом и заключается MVCC. Значения не меняются в этом снимке, только в последующих поправках к этому состоянию. Неважно, если ваш запрос занимает час, он работает на данных, которые заблокированы во времени.

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

Другие вопросы по тегам