Hi,
I would like to overcome an issue which occurs only in case with order by clause.
Details:
I am trying to insert into a temporary table 50 rows from a joined table ordered by a modification time column which is inserted by the current time so it is ordered ascending.
Each table has index on the following columns: PRIMARY KEY(SystemID, ObjectID, ElementID, ModificationTime)
Statement:
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;
node type | count | sum of times | % of query |
---|
Hash | 1 | 8.844 ms | 10.0 % |
Hash Left Join | 1 | 33.715 ms | 38.0 % |
Insert | 1 | 0.734 ms | 0.8 % |
Limit | 1 | 0.003 ms | 0.0 % |
Seq Scan | 2 | 22.735 ms | 25.6 % |
Sort | 1 | 22.571 ms | 25.5 % |
Subquery Scan | 1 | 0.046 ms | 0.1 % |
If I remove the order by clause I get the following results:
node type | count | sum of times | % of query |
Index Scan | 2 | 27.632 ms | 94.9 % |
Insert | 1 | 0.848 ms | 2.9 % |
Limit | 1 | 0.023 ms | 0.1 % |
Merge Left Join | 1 | 0.423 ms | 1.5 % |
Result | 1 | 0.000 ms | 0.0 % |
Subquery Scan | 1 | 0.186 ms | 0.6 % |
Which is pointing me to a problem with the sorting. Is there any way that I could improve the performance with order by clause?
To make the problem more transparent I ran a long run test where you can see that with order by clause the performance is linearly getting worse:
Postgresql version: "PostgreSQL 11.1, compiled by Visual C++ build 1914, 64-bit"
Istalled by: With EnterpriseDB One-click installer from EDB's offical site.
Postgresql.conf changes: Used pgtune suggestions:
# DB Version: 11