ThinkGeo.com    |     Documentation    |     Premium Support

MSSql2008FeatureLayer metadata queries

Hi,



We’re using ThinkGeo 5.0.0.0 to perform map rendering on asp .NET using MSSql2008FeatureLayer. We’ve detected that for each tile image rendering request, it is performed a series of queries to the SQL SERVER 2008 database in order to get geometry metadata (geometry column name and spatial data type). From our analysis, there are performed 2 or 3 queries on this context.  We want to avoid those kinds of metadata queries in order to have better performance. Is there a way to achieve it? 



We’ve made a simple test using MSSql2008FeatureSource. We’ve opened the featuresource and get all the features. When MSSql2008FeatureSource.Open() and GetAllFeatures() are called, some metadata queries are executed. As long as the featuresource is open there are no more queries related to metadata. I’ve tried to specify explicitly the geometry column name through property CustomGeometryColumnName but the queries are still performed. Of course it would be useful to specify the spatial data type (geometry or geography) to avoid those metadata queries but the property SpatialDataType it’s read only. 



Can anyone help? 



Best Regards,

BdaF

Hi BdaF, 
  
 We read SpatialDataType from DataBase, so you cannot specified that. 
  
 Have you tried our latest 8.0 version? I think we have some enhancement for MSSql2008FeatureLayer from 5.0 to 8.0, and maybe it get better performance. 
  
 Regards, 
  
 Don 


Hi Don, 
  
 Thanks for the reply. 
  
 For us to move to the latest 8.0 version requires an effort with many risks involved because the change of .NET Framework from 2.0 to 4.0. 
  
 Is there a better way to do it? 
  
 Thanks, 
 Bruno da Fonseca

Hi Bruno, 
  
 For convenient getting spatial index, the “srid” and “Geometry” column information will be got, the querying performance will be better by spatial index.  
  
 If you doubt the lower performance are caused by getting meta data information, you can create two class which are inherited from MsSqlFeatureLayer and MsSqlFeatureSource, In derived MsSqlFeatureSource,  OpenCore and GetAllFeatuersCore should be override,  as following statements: 
  
 class CustomSql2008Featuresource : MsSql2008FeatureSource 
     { 
         public CustomSql2008Featuresource(string connectionString, string tableName, string featureIdColumn, int srid, string schemaName, DatabaseConnectionMode databaseConnectionMode) 
             : base(connectionString, tableName, featureIdColumn, srid, schemaName, databaseConnectionMode) 
         { 
         } 
         protected override void OpenCore() 
         { 
             //TODO: Customize implements. 
         } 
  
         protected override Collection<Feature> GetAllFeaturesCore(IEnumerable<string> returningColumnNames) 
         { 
             //TODO: Customize Sql statements to getting all features. 
             return null; 
         } 
     }  
  
  
  
 In derived MsSqlFeatureLayer, the “FeatureSource” will be specified with derived MsSqlFeatureSource, as following statements: 
  
    class CustomSql2008FeatureLayer : MsSql2008FeatureLayer 
     { 
         public CustomSql2008FeatureLayer(string connectionString, string tableName, string featureIdColumn, int srid, string schemaName, DatabaseConnectionMode databaseConnectionMode) 
             : base() 
         { 
             FeatureSource = new CustomSql2008Featuresource(connectionString, tableName, featureIdColumn, srid, schemaName, databaseConnectionMode); 
         } 
     } 
  
 Thanks, 
  
 Don