From f32de6fe885915b11fd349c0d8f3e6a98d4dd2bf Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 2 Sep 2009 03:33:31 +0100 Subject: Thank you, dslake, for a set of patches to improve OpenSim startup and idle performance. --- OpenSim/Data/MySQL/MySQLRegionData.cs | 49 ++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 9 deletions(-) (limited to 'OpenSim/Data/MySQL') diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs index 9c2ee4a..4a16a70 100644 --- a/OpenSim/Data/MySQL/MySQLRegionData.cs +++ b/OpenSim/Data/MySQL/MySQLRegionData.cs @@ -412,8 +412,8 @@ namespace OpenSim.Data.MySQL public List LoadObjects(UUID regionUUID) { UUID lastGroupID = UUID.Zero; - List objects = new List(); - List prims = new List(); + Dictionary objects = new Dictionary(); + Dictionary prims = new Dictionary(); SceneObjectGroup grp = null; lock (m_Connection) @@ -441,14 +441,14 @@ namespace OpenSim.Data.MySQL else prim.Shape = BuildShape(reader); - prims.Add(prim); + prims[prim.UUID] = prim; UUID groupID = new UUID(reader["SceneGroupID"].ToString()); if (groupID != lastGroupID) // New SOG { if (grp != null) - objects.Add(grp); + objects[grp.UUID] = grp; lastGroupID = groupID; @@ -487,16 +487,47 @@ namespace OpenSim.Data.MySQL } if (grp != null) - objects.Add(grp); + objects[grp.UUID] = grp; cmd.Dispose(); } - foreach (SceneObjectPart part in prims) - LoadItems(part); + // Instead of attempting to LoadItems on every prim, + // most of which probably have no items... get a + // list from DB of all prims which have items and + // LoadItems only on those + List primsWithInventory = new List(); + lock (m_Connection) + { + MySqlCommand itemCmd = m_Connection.CreateCommand(); + itemCmd.CommandText = "select distinct primID from primitems"; + IDataReader itemReader = ExecuteReader(itemCmd); + try + { + while (itemReader.Read()) + { + if (!(itemReader["primID"] is DBNull)) + { + UUID primID = new UUID(itemReader["primID"].ToString()); + if (prims.ContainsKey(primID)) + { + primsWithInventory.Add(prims[primID]); + } + } + } + } + finally + { + itemReader.Close(); + } + itemCmd.Dispose(); + } + foreach (SceneObjectPart prim in primsWithInventory) + { + LoadItems(prim); + } m_log.DebugFormat("[REGION DB]: Loaded {0} objects using {1} prims", objects.Count, prims.Count); - - return objects; + return new List(objects.Values); } /// -- cgit v1.1