Я хотел бы решить проблему, которая возникает только в случае с предложением 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;
План выполнения: https://explain.depesz.com/s/S96g (обфусцировано)
Если я удалю заказ по предложению, я получу следующие результаты:
Что указывает на проблему с сортировкой.Можно ли как-нибудь улучшить производительность с помощью заказа по предложению?
Чтобы сделать проблему более прозрачной, я провел долгосрочное тестирование, где вы можете видеть, что с заказом по предложению производительность линейно ухудшается:
Версия 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