Место на диске, возможно, скорость вставки и т.п. Ну и в принципе не создаю индексы, пока они реально не нужны
А какой профит? Всегда можно создать индекс тогда, когда он потребуется
Всегда можно не парится ) Что у вас за скорость вставки что индекс влияет
И при этом не в данные а НСИ
Я, если честно, не замерял, сильное воздействие наличие неиспользуемого индекса оказывает на скорость вставки или нет. Но у меня были сервисы, где в несколько таблиц данные закидывались пачками по несколько тысяч записей в несколько таблиц. Сейчас доступа к ним не имею, но было бы интересно провести эксперимент
Проведите. Есть как в анекдоте «ньюансы» для IOT, OPC и тд, но в стандартной нагрузке не видел
А что там замерять? Вот script и мои результаты (и линейная регрессия для них): DROP TABLE IF EXISTS indexes_test; CHECKPOINT; CREATE UNLOGGED TABLE indexes_test ( -- Comment out UNLOGGED as needed id1 bigint NOT NULL, id2 bigint NOT NULL, id3 bigint NOT NULL, id4 bigint NOT NULL, id5 bigint NOT NULL, id6 bigint NOT NULL, id7 bigint NOT NULL, id8 bigint NOT NULL ); -- Comment out as needed: CREATE INDEX ON indexes_test(id1); CREATE INDEX ON indexes_test(id2); CREATE INDEX ON indexes_test(id3); CREATE INDEX ON indexes_test(id4); CREATE INDEX ON indexes_test(id5); INSERT INTO indexes_test(id1, id2, id3, id4, id5, id6, id7, id8) SELECT n, n, n, n, n, n, n, n FROM generate_series(1, 1000000) AS g(n); VACUUM ANALYZE indexes_test; -- This one is measured: INSERT INTO indexes_test(id1, id2, id3, id4, id5, id6, id7, id8) SELECT n, n, n, n, n, n, n, n FROM generate_series(1000001, 2000000) AS g(n); -------------------------------------------------------------------------------- -- № indexes | Unlogged time (min of 3 runs) | Logged time (min of 3 runs) -- 0 | 793.048 ms | 1697.086 ms -- 1 | 1428.326 ms | 2792.062 ms -- 2 | 2085.053 ms | 3696.384 ms -- 3 | 2687.056 ms | 4720.533 ms -- 4 | 3285.057 ms | 5851.648 ms -- 5 | 3892.328 ms | 6676.305 ms -- Rough approximation of the above: WITH base AS ( SELECT n, 793.0 + 630 * n AS unlogged, 1697.0 + 1000 * n AS logged FROM generate_series(0, 5) AS g(n) ) SELECT n AS n_indexes, unlogged, round(100 * (unlogged / LAG(unlogged) OVER (ORDER BY n) - 1), 2) AS "unlogged %", logged, round(100 * (logged / LAG(logged) OVER (ORDER BY n) - 1), 2) AS "logged %" FROM base; -- n_indexes | unlogged | unlogged % | logged | logged % -- 0 | 793.0 | | 1697.0 | -- 1 | 1423.0 | 79.45 | 2697.0 | 58.93 -- 2 | 2053.0 | 44.27 | 3697.0 | 37.08 -- 3 | 2683.0 | 30.69 | 4697.0 | 27.05 -- 4 | 3313.0 | 23.48 | 5697.0 | 21.29 -- 5 | 3943.0 | 19.02 | 6697.0 | 17.55 Каждый может попробовать и сделать выводы (вывести очевидное rule of thumb) самостоятельно. ;)
Обсуждают сегодня