diff --git a/src/providers/postgres/qgspostgresfeatureiterator.cpp b/src/providers/postgres/qgspostgresfeatureiterator.cpp index 367f084fe29c..c5b9cafda2f2 100644 --- a/src/providers/postgres/qgspostgresfeatureiterator.cpp +++ b/src/providers/postgres/qgspostgresfeatureiterator.cpp @@ -22,15 +22,12 @@ #include "qgsmessagelog.h" #include "qgssettings.h" +#include #include - -const int QgsPostgresFeatureIterator::FEATURE_QUEUE_SIZE = 2000; - - QgsPostgresFeatureIterator::QgsPostgresFeatureIterator( QgsPostgresFeatureSource *source, bool ownSource, const QgsFeatureRequest &request ) : QgsAbstractFeatureIteratorFromSource( source, ownSource, request ) - , mFeatureQueueSize( FEATURE_QUEUE_SIZE ) + , mFeatureQueueSize( 1 ) , mFetched( 0 ) , mFetchGeometry( false ) , mExpressionCompiled( false ) @@ -223,6 +220,9 @@ bool QgsPostgresFeatureIterator::fetchFeature( QgsFeature &feature ) if ( mFeatureQueue.empty() && !mLastFetch ) { + QElapsedTimer timer; + timer.start(); + QString fetch = QStringLiteral( "FETCH FORWARD %1 FROM %2" ).arg( mFeatureQueueSize ).arg( mCursorName ); QgsDebugMsgLevel( QString( "fetching %1 features." ).arg( mFeatureQueueSize ), 4 ); @@ -258,6 +258,15 @@ bool QgsPostgresFeatureIterator::fetchFeature( QgsFeature &feature ) } // for each row in queue } unlock(); + + if ( timer.elapsed() > 500 && mFeatureQueueSize > 1 ) + { + mFeatureQueueSize /= 2; + } + else if ( timer.elapsed() < 50 && mFeatureQueueSize < 10000 ) + { + mFeatureQueueSize *= 2; + } } if ( mFeatureQueue.empty() ) diff --git a/src/providers/postgres/qgspostgresfeatureiterator.h b/src/providers/postgres/qgspostgresfeatureiterator.h index 4e76594c36b1..47ea15300cd9 100644 --- a/src/providers/postgres/qgspostgresfeatureiterator.h +++ b/src/providers/postgres/qgspostgresfeatureiterator.h @@ -110,8 +110,6 @@ class QgsPostgresFeatureIterator : public QgsAbstractFeatureIteratorFromSource