diff --git a/polkadot/runtime/parachains/src/session_info.rs b/polkadot/runtime/parachains/src/session_info.rs
index c3faec7eeb16252bd37c8af183aaadd0c5c267a7..decc25a20d01fdcf34329710820b0f12a7fc39ba 100644
--- a/polkadot/runtime/parachains/src/session_info.rs
+++ b/polkadot/runtime/parachains/src/session_info.rs
@@ -101,8 +101,11 @@ impl<T: Config> Module<T> {
 		// update `EarliestStoredSession` based on `config.dispute_period`
 		EarliestStoredSession::set(new_earliest_stored_session);
 		// remove all entries from `Sessions` from the previous value up to the new value
-		for idx in old_earliest_stored_session..new_earliest_stored_session {
-			Sessions::remove(&idx);
+		// avoid a potentially heavy loop when introduced on a live chain
+		if old_earliest_stored_session != 0 || Sessions::get(0).is_some() {
+			for idx in old_earliest_stored_session..new_earliest_stored_session {
+				Sessions::remove(&idx);
+			}
 		}
 		// create a new entry in `Sessions` with information about the current session
 		let new_session_info = SessionInfo {
@@ -216,7 +219,7 @@ mod tests {
 	}
 
 	#[test]
-	fn session_pruning_is_based_on_dispute_deriod() {
+	fn session_pruning_is_based_on_dispute_period() {
 		new_test_ext(genesis_config()).execute_with(|| {
 			run_to_block(100, session_changes);
 			assert_eq!(EarliestStoredSession::get(), 9);
@@ -253,4 +256,26 @@ mod tests {
 			assert_eq!(session.needed_approvals, 42);
 		})
 	}
+
+	#[test]
+	fn session_pruning_avoids_heavy_loop() {
+		new_test_ext(genesis_config()).execute_with(|| {
+			let start = 1_000_000_000;
+			System::on_initialize(start);
+			System::set_block_number(start);
+
+			if let Some(notification) = new_session_every_block(start) {
+				Configuration::initializer_on_new_session(&notification.validators, &notification.queued);
+				SessionInfo::initializer_on_new_session(&notification);
+			}
+
+			Configuration::initializer_initialize(start);
+			SessionInfo::initializer_initialize(start);
+
+			assert_eq!(EarliestStoredSession::get(), start - 1);
+
+			run_to_block(start + 1, new_session_every_block);
+			assert_eq!(EarliestStoredSession::get(), start);
+		})
+	}
 }