Проблемы с производительностью при заказе по пункту с PostgreSQL 11 - PullRequest
2 голосов
/ 26 марта 2019

Я хотел бы решить проблему, которая возникает только в случае с предложением order by.

Подробности: я пытаюсь вставить во временную таблицу 50 строк из объединенной таблицы, упорядоченной по столбцу времени изменения, которыйвставляется по текущему времени, поэтому он упорядочен по возрастанию.

Каждая таблица имеет многоколонный индекс в следующих столбцах: PRIMARY KEY(SystemID, ObjectID, ElementID, ModificationTime)

Оператор:

sqlString := 'INSERT INTO ResultTable ('
             'SELECT * '
             'FROM "TABLE" a '
             '   LEFT OUTER JOIN "TABLE_Text" l1031 '
             '      ON a.ModificationTime = l1031.ModificationTime '
             '         AND a.SystemID = l1031.SystemID '
             '         AND a.ObjectID = l1031.ObjectID '
             '         AND a.ElementID = l1031.ElementID '
             '         AND l1031.LCID = 1031 '
             '   LEFT OUTER JOIN ( '
             '      SELECT * AS CommentNumber '
             '      FROM "TABLE_Comment" v1 '
             '      GROUP BY v1.ModificationTime, v1.SystemID, v1.ObjectID, v1.ElementID '
             '   ) c '
             '      ON a.ModificationTime = c.ModificationTime '
             '         AND a.SystemID = c.SystemID '
             '         AND a.ObjectID = c.ObjectID '
             '         AND a.ElementID = c.ElementID '
             'WHERE a.ModificationTime BETWEEN $1 AND $2 '
             '  AND ( a.Enabled = 1 ) '
             'ORDER BY a.ModificationTime DESC '
             'LIMIT 50)';

EXECUTE sqlString USING StartTime,EndTime;

enter image description here

План выполнения: https://explain.depesz.com/s/S96g (обфусцировано)

Если я удалю заказ по предложению, я получу следующие результаты:

enter image description here

Что указывает на проблему с сортировкой.Можно ли как-нибудь улучшить производительность с помощью заказа по предложению?

Чтобы сделать проблему более прозрачной, я провел долгосрочное тестирование, где вы можете видеть, что с заказом по предложению производительность линейно ухудшается:

enter image description here

Версия Postgresql: «PostgreSQL 11.1, скомпилирован в Visual C ++ build 1914, 64-bit»

Установлено с помощью EnterpriseDB One-нажмите установщик с официального сайта EDB.

Изменения Postgresql.conf: Используемые предложения pgtune:

# DB Version: 11 
# OS Type: windows 
# DB Type: desktop 
# Total Memory (RAM): 8 GB 
# CPUs num: 4 
# Connections num: 25 
# Data Storage: hdd 
max_connections = 25 
shared_buffers = 512MB 
effective_cache_size = 2GB 
maintenance_work_mem = 512MB 
checkpoint_completion_target = 0.5 
wal_buffers = 16MB 
default_statistics_target = 100 
random_page_cost = 4 
work_mem = 8738kB 
min_wal_size = 100MB 
max_wal_size = 1GB 
max_worker_processes = 4 
max_parallel_workers_per_gather = 2 
max_parallel_workers = 4

Операционная система: Windows 10 x64, Версия: 1607

...