Как эффективно определить, есть ли в таблице Postgres строки - PullRequest
2 голосов
/ 24 октября 2008

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

psql -d testdb -U postgres -f truncate_and_insert_1000_rows.sql> NUL

psql -d testdb -U postgres -f count_data.sql

----------------------------------------------- ---------------------------------

Агрегат (стоимость = 36.75..36.76 строк = 1 ширина = 0) (фактическое время = 0.762..0.763 строк = 1 петли = 1) -> Seq Scan на данных (стоимость = 0,00..31,40 строк = 2140 ширина = 0) (фактическое время = 0,02 8..0.468 строк = 1000 циклов = 1) Общее время выполнения: 0,846 мс (3 фила)

psql -d testdb -U postgres -f truncate_and_insert_10000_rows.sql> NUL

psql -d testdb -U postgres -f count_data.sql

----------------------------------------------- ---------------------------------

Агрегат (стоимость = 197.84..197.85 строк = 1 ширина = 0) (фактическое время = 6.191..6.191 строк = 1 петля = 1) -> Seq Scan на данных (стоимость = 0.00..173.07 строк = 9907 ширина = 0) (фактическое время = 0.0 09..3.407 строк = 10000 циклов = 1) Общее время выполнения: 6,271 мс (3 фила)

psql -d testdb -U postgres -f truncate_and_insert_100000_rows.sql> NUL

psql -d testdb -U postgres -f count_data.sql

----------------------------------------------- ---------------------------------

Совокупный (стоимость = 2051.60..2051.61 строк = 1 ширина = 0) (фактическое время = 74.075..74.076 р ows = 1 петли = 1) -> Seq Scan на данных (стоимость = 0.00..1788.48 строк = 105248 ширина = 0) (фактическое время = 0.032..46.024 строки = 100000 циклов = 1) Общее время выполнения: 74,164 мс (3 фила)

psql -d prueba -U postgres -f truncate_and_insert_1000000_rows.sql> NUL

psql -d testdb -U postgres -f count_data.sql

----------------------------------------------- ---------------------------------

Совокупный (стоимость = 19720.00..19720.01 строк = 1 ширина = 0) (фактическое время = 637.486..637.4 87 строк = 1 петля = 1) -> Seq Scan на данных (стоимость = 0,00..17246.60 строк = 989360 ширина = 0) (фактическое время = 0.028..358.831 строк = 1000000 циклов = 1) Общее время выполнения: 637,582 мс (3 фила)

определение данных

CREATE TABLE data
(
  id INTEGER NOT NULL,
  text VARCHAR(100),
  CONSTRAINT pk3 PRIMARY KEY (id)
);

Ответы [ 6 ]

11 голосов
/ 13 ноября 2008

выберите true из предела таблицы 1;

3 голосов
/ 07 ноября 2009
select exists(select * from your_table_here) as has_row
1 голос
/ 24 октября 2008

Попробуйте это:

SELECT t.primary_key IS NOT NULL FROM table t LIMIT 1;

Вы получите TRUE, если есть записи, и NULL, если их нет.

1 голос
/ 24 октября 2008

Вы можете найти это полезным.

1 голос
/ 24 октября 2008

Если все, что вас волнует, это 1 строка или нет строк. Ограничьте ваш запрос первой строкой - зачем считать все строки, просто чтобы узнать, есть ли 1 или более, или ноль ...

используйте эквивалент ROWNUM = 1 или TOP 1 или все, что вам даст postgres.

0 голосов
/ 24 октября 2008

Как рассчитывать на поле первичного ключа, где оно НЕ ПУСТО, ограничивая запрос 1 ответом?

Поскольку первичный ключ должен существовать, если он есть, у вас есть данные, да?

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