Разница в производительности между int4 и int8 в PostgreSQL на 64-битном сервере - PullRequest
3 голосов
/ 09 июля 2011

Предполагая, что PostgreSQL работает на 64-битном сервере, какова разница в производительности между столбцами int4 (32-битная) и int8 (64-битная)?В руководстве говорится, что int4 более эффективен, чем int8, но если базовый сервер является 64-разрядным, есть ли практическая разница в производительности (с точки зрения (1) ЦП, (2) памяти и (3) хранилища)?

Ответы [ 2 ]

4 голосов
/ 09 июля 2011

в терминах (1) процессора, (2) памяти и (3) памяти

Если говорить прямо:

  1. 64 битв два раза больше 32 бит.

  2. 64 бит в два раза больше 32 бит.

  3. 64 бит в два раза больше 32 бит.

Я вспомнил нить в wp-хакерах, которая провела несколько тестов.Создайте таблицу, заполните миллион строк.Затем найдите, добавьте, сгруппируйте, объедините и т. Д. Я не помню особенностей, но использование int8 было действительно медленнее, чем int4.


test=# create table int4_test (id int primary key);
CREATE TABLE
test=# create table int8_test (id bigint primary key);
CREATE TABLE
test=# insert into int4_test select i from generate_series(1,1000000) i;
INSERT 0 1000000
test=# insert into int8_test select i from generate_series(1,1000000) i;
INSERT 0 1000000
test=# vacuum analyze;
VACUUM
test=# \timing on
Timing is on.
test=# select sum(i.id) from int4_test i natural join int4_test j where i.id % 19 = 0;
     sum     
-------------
 26315710524
(1 row)

Time: 1364.925 ms
test=# select sum(i.id) from int4_test i natural join int4_test j where i.id % 19 = 0;
     sum     
-------------
 26315710524
(1 row)

Time: 1286.810 ms
test=# select sum(i.id) from int8_test i natural join int8_test j where i.id % 19 = 0;
     sum     
-------------
 26315710524
(1 row)

Time: 1610.638 ms
test=# select sum(i.id) from int8_test i natural join int8_test j where i.id % 19 = 0;
     sum     
-------------
 26315710524
(1 row)

Time: 1554.066 ms

test=# select count(*) from int4_test i natural join int4_test j where i.id % 19 = 0;
 count 
-------
 52631
(1 row)

Time: 1244.654 ms
test=# select count(*) from int4_test i natural join int4_test j where i.id % 19 = 0;
 count 
-------
 52631
(1 row)

Time: 1247.114 ms
test=# select count(*) from int8_test i natural join int8_test j where i.id % 19 = 0;
 count 
-------
 52631
(1 row)

Time: 1541.751 ms
test=# select count(*) from int8_test i natural join int8_test j where i.id % 19 = 0;
 count 
-------
 52631
(1 row)

Time: 1519.986 ms
2 голосов
/ 09 июля 2011

С точки зрения хранения и памяти ответ очевиден: INT8 в два раза больше INT4, поэтому он использует в два раза больше памяти и в два раза больше памяти.

С точки зрения вычислительной (CPU) производительностиЯ подозреваю, что на 64-битной машине это не имеет никакого значения, а в некоторых случаях INT4 может быть более эффективным на 32-битной машине.Хотя, если вы не выполняете сложную математику с этими INT (а не просто используете их как последовательные и т. Д.), Вычислительные различия, вероятно, равны нулю или почти нулю.ваши INT, на самом деле это больше не вопрос производительности базы данных.

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