Advertisement
LaughingMan

MAF Tiger Data Spatial Index Creator

Dec 10th, 2015
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 10.36 KB | None | 0 0
  1. --CREATE PROCEDURE usp_RefactorRawTigerTables
  2. --AS
  3. PRINT CONVERT(VARCHAR, GETDATE()) + ': Script started!'
  4.  
  5. DECLARE @Index NVARCHAR(1024) = '',
  6.         @Catalog NVARCHAR(1024) = '',
  7.         @Schema NVARCHAR(1024) = '',
  8.         @Table NVARCHAR(1024) = '',
  9.         @CurrentTable NVARCHAR(1024) = '',
  10.         @Sql NVARCHAR(1024) = '',
  11.         @FullSql NVARCHAR(MAX) = '',
  12.         @ExecSql NVARCHAR(MAX),
  13.         @NewLineChar AS CHAR(2) = CHAR(13) + CHAR(10)
  14.  
  15. PRINT 'Retrieving Spatial Indexes for deletion'
  16.  
  17. SELECT  t.name AS [Table],
  18.         ind.name AS [Index]
  19. INTO    #DeleteIndex
  20. FROM
  21.      sys.indexes ind
  22. INNER JOIN
  23.      sys.tables t ON ind.object_id = t.object_id
  24. WHERE
  25.      ind.is_primary_key = 0
  26. ORDER BY
  27.      t.name, ind.name, ind.index_id
  28.  
  29. SELECT  @Table = A.[Table], @Index = A.[Index]
  30. FROM    #DeleteIndex A
  31.  
  32. WHILE @@ROWCOUNT <> 0
  33. BEGIN
  34.     SET ROWCOUNT 0
  35.    
  36.     PRINT 'Dropping Index ''' + @Index + ''' on [' + @Table + ']'
  37.    
  38.     SET @Sql = 'DROP INDEX ' + @Index + ' ON [' + @Table + ']'
  39.    
  40.     EXEC(@sql)
  41.    
  42.     DELETE FROM #DeleteIndex
  43.     WHERE       [Table] = @Table
  44.     AND         [Index] = @Index
  45.  
  46.     SELECT  @Table = A.[Table], @Index = A.[Index]
  47.     FROM    #DeleteIndex A
  48. END
  49.  
  50. DROP TABLE #DeleteIndex
  51.  
  52. PRINT CONVERT(VARCHAR, GETDATE()) + ': Retrieving tables for processing!'
  53.        
  54. SELECT  *
  55. INTO    #Tables
  56. FROM    INFORMATION_SCHEMA.TABLES A
  57. WHERE 'geometry' IN (SELECT DATA_TYPE
  58.                     FROM    INFORMATION_SCHEMA.COLUMNS B
  59.                     WHERE   B.TABLE_CATALOG = A.TABLE_CATALOG
  60.                     AND     B.TABLE_SCHEMA = A.TABLE_SCHEMA
  61.                     AND     B.TABLE_NAME = A.TABLE_NAME)
  62.        
  63. SELECT  @Catalog = A.TABLE_CATALOG,
  64.         @Schema = A.TABLE_SCHEMA,
  65.         @Table = A.TABLE_NAME
  66. FROM    #Tables A
  67.  
  68. WHILE @@ROWCOUNT <> 0
  69. BEGIN
  70.     SET ROWCOUNT 0
  71.  
  72.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Processing Table [' + @Table + ']'
  73.    
  74.     IF EXISTS (SELECT   1
  75.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  76.                 WHERE   A.TABLE_CATALOG = @Catalog
  77.                 AND     A.TABLE_SCHEMA = @Schema
  78.                 AND     A.TABLE_NAME = @Table
  79.                 AND     A.COLUMN_NAME = 'PointGeom')
  80.     BEGIN
  81.         PRINT CONVERT(VARCHAR, GETDATE()) + ': Dropping PointGeom column from [' + @Table + ']'
  82.         SET @Sql = 'ALTER TABLE [' + @Table + '] DROP COLUMN PointGeom'
  83.         EXEC(@Sql)
  84.     END
  85.    
  86.     IF EXISTS (SELECT   1
  87.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  88.                 WHERE   A.TABLE_CATALOG = @Catalog
  89.                 AND     A.TABLE_SCHEMA = @Schema
  90.                 AND     A.TABLE_NAME = @Table
  91.                 AND     A.COLUMN_NAME = 'MinLat')
  92.     BEGIN
  93.         PRINT CONVERT(VARCHAR, GETDATE()) + ': Dropping MinLat column from [' + @Table + ']'
  94.         SET @Sql = 'ALTER TABLE [' + @Table + '] DROP COLUMN MinLat'
  95.         EXEC(@Sql)
  96.     END
  97.    
  98.     IF EXISTS (SELECT   1
  99.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  100.                 WHERE   A.TABLE_CATALOG = @Catalog
  101.                 AND     A.TABLE_SCHEMA = @Schema
  102.                 AND     A.TABLE_NAME = @Table
  103.                 AND     A.COLUMN_NAME = 'MinLong')
  104.     BEGIN
  105.         PRINT CONVERT(VARCHAR, GETDATE()) + ': Dropping MinLong column from [' + @Table + ']'
  106.         SET @Sql = 'ALTER TABLE [' + @Table + '] DROP COLUMN MinLong'
  107.         EXEC(@Sql)
  108.     END
  109.    
  110.     IF EXISTS (SELECT   1
  111.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  112.                 WHERE   A.TABLE_CATALOG = @Catalog
  113.                 AND     A.TABLE_SCHEMA = @Schema
  114.                 AND     A.TABLE_NAME = @Table
  115.                 AND     A.COLUMN_NAME = 'MaxLat')
  116.     BEGIN
  117.         PRINT CONVERT(VARCHAR, GETDATE()) + ': Dropping MaxLat column from [' + @Table + ']'
  118.         SET @Sql = 'ALTER TABLE [' + @Table + '] DROP COLUMN MaxLat'
  119.         EXEC(@Sql)
  120.     END
  121.    
  122.     IF EXISTS (SELECT   1
  123.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  124.                 WHERE   A.TABLE_CATALOG = @Catalog
  125.                 AND     A.TABLE_SCHEMA = @Schema
  126.                 AND     A.TABLE_NAME = @Table
  127.                 AND     A.COLUMN_NAME = 'MaxLong')
  128.     BEGIN
  129.         PRINT CONVERT(VARCHAR, GETDATE()) + ': Dropping MaxLong column from [' + @Table + ']'
  130.         SET @Sql = 'ALTER TABLE [' + @Table + '] DROP COLUMN MaxLong'
  131.         EXEC(@Sql)
  132.     END
  133.  
  134.     DECLARE @GeomColumn VARCHAR(1024) = (SELECT TOP 1 A.COLUMN_NAME
  135.                                             FROM    INFORMATION_SCHEMA.COLUMNS A
  136.                                             WHERE   A.TABLE_CATALOG = @Catalog
  137.                                             AND     A.TABLE_SCHEMA = @Schema
  138.                                             AND     A.TABLE_NAME = @Table
  139.                                             AND     A.DATA_TYPE = 'geometry'),
  140.             @LongColumn VARCHAR(1024),
  141.             @LatColumn VARCHAR(1024)
  142.    
  143.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Adding MinLong column to [' + @Table + ']'
  144.    
  145.     SET @Sql = 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + ']' + @NewLineChar
  146.             + 'ADD [MinLong] AS [' + @GeomColumn + '].STEnvelope().STPointN((1)).STX PERSISTED  NOT NULL'
  147.    
  148.     EXEC(@Sql)
  149.    
  150.     PRINT CONVERT(VARCHAR, GETDATE()) + ': MinLong column added to [' + @Table + ']'
  151.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Adding MinLat column to [' + @Table + ']'
  152.    
  153.     SET @Sql = 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + ']' + @NewLineChar
  154.             + 'ADD [MinLat] AS [' + @GeomColumn + '].STEnvelope().STPointN((1)).STY PERSISTED       NOT NULL'
  155.    
  156.     EXEC(@Sql)
  157.    
  158.     PRINT CONVERT(VARCHAR, GETDATE()) + ': MinLat column added to [' + @Table + ']'
  159.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Adding MaxLong column to [' + @Table + ']'
  160.    
  161.     SET @Sql = 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + ']' + @NewLineChar
  162.             + 'ADD [MaxLong] AS [' + @GeomColumn + '].STEnvelope().STPointN((3)).STX PERSISTED  NOT NULL'
  163.  
  164.     EXEC(@Sql)
  165.        
  166.     PRINT CONVERT(VARCHAR, GETDATE()) + ': MaxLong column added to [' + @Table + ']'
  167.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Adding MaxLat column to [' + @Table + ']'
  168.    
  169.     SET @Sql = 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + ']' + @NewLineChar
  170.             + 'ADD [MaxLat] AS [' + @GeomColumn + '].STEnvelope().STPointN((3)).STY PERSISTED       NOT NULL'
  171.    
  172.     EXEC(@Sql)
  173.    
  174.     PRINT CONVERT(VARCHAR, GETDATE()) + ': MaxLat column added to [' + @Table + ']'
  175.            
  176.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Creating index on bounding box coordinates!'
  177.            
  178.     SET @Sql = 'CREATE INDEX idx_' + @Table + '_MinLong_MinLat_MaxLong_MaxLat ON [' + @Table + ']([MinLong], [MinLat], [MaxLong], [MaxLat])'
  179.            
  180.     EXEC(@Sql)
  181.  
  182.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Bounding Box index created!'
  183.    
  184.     IF EXISTS (SELECT   1
  185.                 FROM    INFORMATION_SCHEMA.COLUMNS A
  186.                 WHERE   A.TABLE_CATALOG = @Catalog
  187.                 AND     A.TABLE_SCHEMA = @Schema
  188.                 AND     A.TABLE_NAME = @Table
  189.                 AND     A.COLUMN_NAME LIKE '%lat%')
  190.     BEGIN
  191.         IF EXISTS (SELECT   1
  192.                     FROM    INFORMATION_SCHEMA.COLUMNS A
  193.                     WHERE   A.TABLE_CATALOG = @Catalog
  194.                     AND     A.TABLE_SCHEMA = @Schema
  195.                     AND     A.TABLE_NAME = @Table
  196.                     AND     A.COLUMN_NAME LIKE '%intptlon%')
  197.         BEGIN
  198.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Latitude and Longitude columns detected!'
  199.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Creating PointGeom column on [' + @Table + ']'
  200.  
  201.             SET @LongColumn = (SELECT TOP 1 A.COLUMN_NAME
  202.                                 FROM    INFORMATION_SCHEMA.COLUMNS A
  203.                                 WHERE   A.TABLE_CATALOG = @Catalog
  204.                                 AND     A.TABLE_SCHEMA = @Schema
  205.                                 AND     A.TABLE_NAME = @Table
  206.                                 AND     A.COLUMN_NAME LIKE '%intptlon%')
  207.            
  208.             SET @LatColumn = (SELECT TOP 1 A.COLUMN_NAME
  209.                                 FROM    INFORMATION_SCHEMA.COLUMNS A
  210.                                 WHERE   A.TABLE_CATALOG = @Catalog
  211.                                 AND     A.TABLE_SCHEMA = @Schema
  212.                                 AND     A.TABLE_NAME = @Table
  213.                                 AND     A.COLUMN_NAME LIKE '%intptlat%')
  214.                                
  215.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Converting latitude and longitude columns to non-nullable float values on [' + @Table + ']'
  216.    
  217.             SET @Sql = 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + ']' + @NewLineChar
  218.                     + 'ALTER COLUMN [' + @LongColumn + '] float NOT NULL' + @NewLineChar
  219.                     + 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + ']' + @NewLineChar
  220.                     + 'ALTER COLUMN [' + @LatColumn + '] float NOT NULL'
  221.    
  222.             EXEC(@Sql)
  223.            
  224.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Creating index on latitude and longitude!'
  225.            
  226.             SET @Sql = 'CREATE INDEX idx_' + @Table + '_' + @LongColumn + '_' + @LatColumn + ' ON [' + @Table + ']([' + @LongColumn + '], [' + @LatColumn + '])'
  227.            
  228.             EXEC(@Sql)
  229.  
  230.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Latitude and Longitude index created!'
  231.            
  232.             SET @Sql = 'ALTER TABLE [' + @Catalog + '].[' + @Schema + '].[' + @Table + '] ADD [PointGeom] AS GEOMETRY::Point([' + @LongColumn + '], [' + @LatColumn + '], [' + @GeomColumn + '].STSrid) PERSISTED NOT NULL'
  233.                
  234.             EXEC(@Sql)
  235.                
  236.             PRINT CONVERT(VARCHAR, GETDATE()) + ': PointGeom column created.'
  237.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Creating Spatial index on column!'
  238.                
  239.             SET @Sql = 'DECLARE @minlat FLOAT, @minlong FLOAT, @maxlat FLOAT, @maxlong FLOAT, @Sql VARCHAR(MAX)' + @NewLineChar
  240.                         + 'SELECT @minlat = MIN([' + @LatColumn + ']), @minlong = MIN([' + @LongColumn + ']), @maxlat = MAX([' + @LatColumn + ']), @maxlong = MAX([' + @LongColumn + ']) FROM [' + @Catalog + '].[' + @Schema + '].[' + @Table + '] A' + @NewLineChar
  241.                         + 'SET @Sql = ''CREATE SPATIAL INDEX idx_' + @Table + '_PointGeom ON [' + @Catalog + '].[' + @Schema + '].[' + @Table + '] ([PointGeom]) WITH ( BOUNDING_BOX = ( '' + CONVERT(VARCHAR, @minlong) + '', '' + CONVERT(VARCHAR, @minlat) + '', '' + CONVERT(VARCHAR, @maxlong) + '', '' + CONVERT(VARCHAR, @maxlat) + ''), GRIDS =(LEVEL_1 = HIGH, LEVEL_2 = HIGH, LEVEL_3 = HIGH, LEVEL_4 = HIGH), CELLS_PER_OBJECT = 16)''' + @NewLineChar
  242.                         + 'EXEC(@Sql)'
  243.                                                  
  244.             EXEC(@Sql)
  245.                
  246.             PRINT CONVERT(VARCHAR, GETDATE()) + ': Spatial Index Created on PointGeom column'
  247.         END
  248.     END
  249.  
  250.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Creating Spatial index on [' + @GeomColumn + ']'
  251.                
  252.     SET @Sql = 'DECLARE @minlat FLOAT, @minlong FLOAT, @maxlat FLOAT, @maxlong FLOAT, @Sql VARCHAR(MAX)' + @NewLineChar
  253.                 + 'SELECT @minlat = MIN(A.MinLat), @minlong = MIN(A.MinLong), @maxlat = MAX(A.MaxLat), @maxlong = MAX(A.MaxLong) FROM [' + @Catalog + '].[' + @Schema + '].[' + @Table + '] A' + @NewLineChar
  254.                 + 'SET @Sql = ''CREATE SPATIAL INDEX idx_' + @Table + '_' + @GeomColumn + ' ON [' + @Catalog + '].[' + @Schema + '].[' + @Table + '] ([' + @GeomColumn + ']) WITH ( BOUNDING_BOX = ( '' + CONVERT(VARCHAR, @minlong) + '', '' + CONVERT(VARCHAR, @minlat) + '', '' + CONVERT(VARCHAR, @maxlong) + '', '' + CONVERT(VARCHAR, @maxlat) + ''), GRIDS =(LEVEL_1 = HIGH, LEVEL_2 = HIGH, LEVEL_3 = HIGH, LEVEL_4 = HIGH), CELLS_PER_OBJECT = 16)''' + @NewLineChar
  255.                 + 'EXEC(@Sql)'
  256.                                                  
  257.     EXEC(@Sql)
  258.  
  259.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Spatial Index Created on [' + @GeomColumn + '] column'
  260.     PRINT CONVERT(VARCHAR, GETDATE()) + ': Consuming #Tables record'
  261.  
  262.     DELETE  #Tables
  263.     WHERE   TABLE_CATALOG = @Catalog
  264.     AND     TABLE_SCHEMA = @Schema
  265.     AND     TABLE_NAME = @Table
  266.        
  267.     SELECT  @Catalog = A.TABLE_CATALOG,
  268.             @Schema = A.TABLE_SCHEMA,
  269.             @Table = A.TABLE_NAME
  270.     FROM    #Tables A  
  271. END
  272.  
  273. DROP TABLE #Tables
  274.  
  275. PRINT CONVERT(VARCHAR, GETDATE()) + ': Script finished!'
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement