接着上次的分区表来说..创建好了后..就得有一个脚本来管理这些分区表的及时管理了。。
呵呵。。现在直接看脚本吧。。。
参考了网上的一些方法,结合自己的系统应用。。
由于本次分区的字段并非主键,因此遇到一些小问题。。
下面虽然能实现滑动窗口方案,但是总觉得通过删除索引在创建索引的方式来实现有点浪费。。。希望有高人能有有更好的意见。。
谢谢。。。
/* * 1.创建两个函数MinFileGroupsByPartitionBoundary,获取最小的日期分界值和分区号 */ IF EXISTS(SELECT * FROM SYSOBJECTS WHERE name='MinFileGroupsByPartitionBoundary' AND type='IF') BEGIN DROP FUNCTION MinFileGroupsByPartitionBoundary END GO CREATE FUNCTION MinFileGroupsByPartitionBoundary() RETURNS TABLE AS RETURN ( SELECT top 1 sf.name AS FileGroupName, sprv.value AS Boundary FROM SYS.PARTITION_SCHEMES AS SPS INNER JOIN SYS.PARTITION_FUNCTIONS AS SPF ON SPS.FUNCTION_ID = SPF.FUNCTION_ID INNER JOIN SYS.DESTINATION_DATA_SPACES AS SDD ON SDD.PARTITION_SCHEME_ID = SPS.DATA_SPACE_ID AND SDD.DESTINATION_ID <= SPF.FANOUT INNER JOIN SYS.PARTITION_RANGE_VALUES SPRV ON SPRV.FUNCTION_ID = SPF.FUNCTION_ID AND SPRV.BOUNDARY_ID = SDD.DESTINATION_ID INNER JOIN SYS.FILEGROUPS AS SF ON SF.DATA_SPACE_ID = SDD.DATA_SPACE_ID WHERE SPS.NAME= 'FROMCITYCODEPARTITION' ORDER BY BOUNDARY ) GO /* *创建最大的日期分界值和分区号MaxFileGroupsByPartitionBoundary */ IF EXISTS(SELECT * FROM SYSOBJECTS WHERE name='MaxFileGroupsByPartitionBoundary' AND type='IF') BEGIN DROP FUNCTION MaxFileGroupsByPartitionBoundary END GO CREATE FUNCTION MaxFileGroupsByPartitionBoundary() RETURNS TABLE AS RETURN ( SELECT top 1 sf.name AS FileGroupName, sprv.value AS Boundary FROM SYS.PARTITION_SCHEMES AS SPS INNER JOIN SYS.PARTITION_FUNCTIONS AS SPF ON SPS.FUNCTION_ID = SPF.FUNCTION_ID INNER JOIN SYS.DESTINATION_DATA_SPACES AS SDD ON SDD.PARTITION_SCHEME_ID = SPS.DATA_SPACE_ID AND SDD.DESTINATION_ID <= SPF.FANOUT INNER JOIN SYS.PARTITION_RANGE_VALUES SPRV ON SPRV.FUNCTION_ID = SPF.FUNCTION_ID AND SPRV.BOUNDARY_ID = SDD.DESTINATION_ID INNER JOIN SYS.FILEGROUPS AS SF ON SF.DATA_SPACE_ID = SDD.DATA_SPACE_ID WHERE SPS.NAME= 'FROMCITYCODEPARTITION' ORDER BY BOUNDARY DESC) GO -- 删除分区表原来的索引 IF EXISTS(SELECT * FROM SYSINDEXES WHERE NAME='PK_AIR_ID' AND ID IN(SELECT ID FROM SYSOBJECTS WHERE NAME='BA_CACHE_AIR_RESULT')) BEGIN ALTER TABLE BA_CACHE_AIR_RESULT DROP constraint PK_AIR_ID END GO IF EXISTS(SELECT * FROM SYSINDEXES WHERE NAME='IX_001' AND ID IN(SELECT ID FROM SYSOBJECTS WHERE NAME='BA_CACHE_AIR_RESULT')) BEGIN DROP INDEX IX_001 ON BA_CACHE_AIR_RESULT END GO IF EXISTS(SELECT * FROM SYSINDEXES WHERE NAME='IX_002' AND ID IN(SELECT ID FROM SYSOBJECTS WHERE NAME='BA_CACHE_AIR_RESULT')) BEGIN DROP INDEX IX_002 ON BA_CACHE_AIR_RESULT END GO --申明三个变量,下面会用到。 DECLARE @FileGroupName VARCHAR(50), @MinBoundary DATETIME, @MaxBoundary DATETIME SELECT @FileGroupName = FileGroupName,@MinBoundary=CONVERT(DATETIME,Boundary) FROM MinFileGroupsByPartitionBoundary() SELECT @MaxBoundary = CONVERT(DATETIME,Boundary) FROM MaxFileGroupsByPartitionBoundary() /* 2.创建一个临时的表,暂名为TEMP_LOG,用于存储要迁出的数据,即2个月内最早的一天的数据。 [注意]这里创建的临时的表,需要与要迁出的数据在同一个分区里,如1月份数据是存放在分区CITY01里的话,则创建临时表的时候, 也要创建在CITY01上。 */ IF EXISTS(SELECT * FROM SYSOBJECTS WHERE name='TEMP_LOG' AND type='U') DROP TABLE TEMP_LOG DECLARE @CreateText NVARCHAR(MAX) SET @CreateText = 'CREATE TABLE [dbo].[TEMP_LOG]( [AIR_ID] [nvarchar](50) NOT NULL, [TRIPINDEX] [nvarchar](50) NULL, [AIR_AGENT_ID] [varchar](36) NULL, [AIR_FROM_AIRPORT_CODE] [nvarchar](10) NULL, [AIR_TO_AIRPORT_CODE] [nvarchar](10) NULL, [AIR_FROM_AIRPORT_NAME] [nvarchar](50) NULL, [AIR_TO_AIRPORT_NAME] [nvarchar](50) NULL, [AIR_FROM_CITY_NAME] [nvarchar](50) NULL, [AIR_TO_CITY_NAME] [nvarchar](50) NULL, [AIR_FROM_DATETIME] [datetime] NULL, [AIR_TO_DATETIME] [datetime] NULL, [AIR_AIRFARE_PRICE] [decimal](18, 2) NULL, [AIR_ADULT_DISCOUNT] [decimal](18, 2) NULL, [AIR_CHILD_DISCOUNT] [decimal](18, 2) NULL, [AIR_BABY_DISCOUNT] [decimal](18, 2) NULL, [AIR_ADULT_DISCOUNT_ORDER] [tinyint] NULL, [AIR_TAX_FEE] [nvarchar](40) NULL, [AIR_OIL_FEE] [nvarchar](40) NULL, [AIR_AIRLINES_INFO] [nvarchar](50) NULL, [AIR_FLIGHT_CODE] [nvarchar](50) NULL, [AIR_FLIGHT_TYPE] [nvarchar](50) NULL, [AIR_CABIN_CODE] [nvarchar](50) NULL, [AIR_CABIN_NAME] [nvarchar](50) NULL, [AIR_AIRPLANE_INFO] [nvarchar](1000) NULL, [AIR_TUIPIAO_DESC] [nvarchar](1000) NULL, [AIR_GENGGAI_DESC] [nvarchar](1000) NULL, [AIR_QIANZHUAN_DESC] [nvarchar](1000) NULL, [AIR_INSURANCE_FEE] [decimal](18, 0) NULL, [AIR_TICKET_COUNT] [nvarchar](10) NULL, [AIR_LEG_TYPE] [nvarchar](1) NULL, [AIR_TRANSIT_AIRPORT_CODE] [nvarchar](50) NULL, [AIR_TRANSIT_AIRPORT_NAME] [nvarchar](50) NULL, [AIR_TRANSIT_CITY_NAME] [nvarchar](50) NULL, [AIR_TRANSIT_TO_DATETIME] [nvarchar](50) NULL, [AIR_TRANSIT_FROM_DATETIME] [nvarchar](50) NULL, [AIR_TRANSIT_AIRLINES_INFO] [nvarchar](50) NULL, [AIR_TRANSIT_FLIGHT_CODE] [nvarchar](50) NULL, [AIR_TRANSIT_AIRPLANE_INFO] [nvarchar](1000) NULL, [AIR_TRANSIT_TAX_FEE] [nvarchar](20) NULL, [AIR_TRANSIT_OIL_FEE] [nvarchar](20) NULL, [AIR_FROM_CITY_CODE] [nvarchar](10) NULL, [AIR_TO_CITY_CODE] [nvarchar](10) NULL, [AIR_AFTER_DISCOUNT_ADULT_PRICE] [decimal](18, 2) NULL, [AIR_AFTER_DISCOUNT_CHILD_PRICE] [decimal](18, 2) NULL, [AIR_AFTER_DISCOUNT_BABY_PRICE] [decimal](18, 2) NULL, [AIR_AIRLINE_RULE_ID] [varchar](5) NULL, [AIR_TOURCODE_ID] [varchar](20) NULL, [AIR_TJ] [nvarchar](1) NULL, [AIR_FAREBASIS] [nvarchar](100) NULL, [AIR_CODESHARE] [varchar](5) NULL, [AIR_CREATETIME] [datetime] NULL, [AIR_OFTEN] INT NULL ) ON ' + @FileGroupName + ';' EXEC SP_EXECUTESQL @CreateText /* 3.这个时候就可以迁出分界值最小的那个分区里的数据了。 */ ALTER TABLE BA_CACHE_AIR_RESULT SWITCH PARTITION 1 TO TEMP_LOG /* 4.删除临时表temp_Log,这个时候,迁出的数据也删除掉了,实现了将最小分区值里的数据进行清理的目的。 */ TRUNCATE TABLE TEMP_LOG DROP TABLE TEMP_LOG /* 5.当最小的日期分界值的分区数据清理掉后,还需要将分界值也去掉。 */ ALTER PARTITION FUNCTION [FromCityCodePartitionFunction]() MERGE RANGE(@MinBoundary) /* 6.去掉最小分界值后,相应的分区也就空出来了,这时候,就可以将空出来的这个分区置为可用状态了。 */ SET @CreateText = 'ALTER PARTITION SCHEME [FromCityCodePartition] NEXT USED ' + @FileGroupName EXEC SP_EXECUTESQL @CreateText /* 7.将最后的一个分区,在这里相当于我们的CITY09,对它进行拆分,以什么拆分呢,就以我们的下一个日期分界值,即’20070701 00:00:00.000’,这样在第6步空出来的分区就被用来存储’ 2007-07-01 00:00:00.000’以后的数据了。 */ ALTER PARTITION FUNCTION [FromCityCodePartitionFunction]() SPLIT RANGE (DATEADD(DAY,2,@MaxBoundary)) --创建主键,但不设为聚集索引 ALTER TABLE BA_CACHE_AIR_RESULT ADD CONSTRAINT PK_AIR_ID PRIMARY KEY NONCLUSTERED ( AIR_ID ASC ) ON [PRIMARY] GO IF EXISTS( SELECT * FROM SYSINDEXES WHERE name='IX_001' AND id IN(SELECT id FROM sysobjects WHERE name='BA_CACHE_AIR_RESULT') ) BEGIN DROP INDEX IX_001 ON BA_CACHE_AIR_RESULT END CREATE NONCLUSTERED INDEX [IX_001] ON [dbo].[BA_CACHE_AIR_RESULT] ( [AIR_FROM_CITY_CODE] ASC, [AIR_TO_CITY_CODE] ASC, [AIR_FROM_DATETIME] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) GO IF EXISTS(SELECT * FROM SYSINDEXES WHERE name='IX_002' AND id IN(SELECT id FROM sysobjects WHERE name='BA_CACHE_AIR_RESULT')) BEGIN DROP INDEX IX_002 ON BA_CACHE_AIR_RESULT END /****** Object: Index [IX_002] Script Date: 03/09/2011 19:03:52 ******/ CREATE NONCLUSTERED INDEX [IX_002] ON [dbo].[BA_CACHE_AIR_RESULT] ( [AIR_AGENT_ID] ASC, [AIR_FLIGHT_CODE] ASC, [AIR_TRANSIT_FROM_DATETIME] ASC, [AIR_FROM_CITY_CODE] ASC, [AIR_TO_CITY_CODE] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) GO /* SELECT PARTITION = $PARTITION.FROMCITYCODEPARTITIONFUNCTION(AIR_FROM_DATETIME) ,ROWS = COUNT(*) ,MINVAL = MIN(AIR_FROM_DATETIME) ,MAXVAL = MAX(AIR_FROM_DATETIME) FROM DBO.BA_CACHE_AIR_RESULT GROUP BY $PARTITION.FROMCITYCODEPARTITIONFUNCTION(AIR_FROM_DATETIME) ORDER BY PARTITION GO */
您还没有登录,请您登录后再发表评论
通过使用SQL Server的表分区结合滑动窗口技术,可以有效管理快速增长的数据集,确保查询性能的同时减少存储资源消耗。该方法尤其适用于具有明显时间特征的数据处理场景,能够帮助组织实现更加高效的数据库管理。
总的来说,这些SQL脚本提供了关于如何设计、创建和优化SQL Server分区表的实例,包括基于范围的分区、文件组的使用、分区联接优化以及滑动窗口策略等,这些都是处理大数据和提高查询性能的关键技术。通过学习和实践...
SQL Server 2008中的分区表和索引策略是数据库管理和优化的重要组成部分,尤其对于处理大规模数据的系统而言。分区表技术旨在解决大表在数据加载、删除和索引维护时遇到的性能问题。本文将深入探讨如何利用SQL ...
- **滑动窗口聚合**:例如,计算过去7天的日销售额之和。 - **数据平滑**:如计算5日移动平均,消除数据波动。 - **趋势分析**:通过`LAG()`或`LEAD()`观察数据变化。 4. **使用示例** ```sql SELECT sales_...
4. **维护操作**:考虑如何简化数据装载、更新和清理过程,例如滑动窗口策略。 **策略 I - 单独文件组的分区** 每个分区对应一个单独的文件组,这样可以独立调整不同分区的I/O资源,但可能会增加管理复杂性。 **...
9. **窗口滑动和跳跃**: 通过设置窗口的帧大小,可以创建滑动窗口(如每5行滑动一次)或跳跃窗口(如每隔5行开始新窗口),这在处理时间序列数据时特别有用。 在实际应用中,结合这些窗口函数,我们可以进行平均值...
窗口函数可以实现动态的分组统计,即在不同的分区或窗口范围内进行统计计算,而无需显式地使用GROUP BY语句。 ##### 3. Top N 通过窗口函数,可以轻松地找出每个分区内的Top N记录,例如找出每个月销售额最高的前几...
- **灵活性**:通过灵活定义窗口,可以进行各种复杂的数据分析,如滑动窗口计算、分区计算等。 - **简洁性**:相比传统的嵌套查询和子查询,窗口函数的语法更简洁,代码可读性更强。 总的来说,SQL2005中的窗口...
2. **分区表(Partitioning)**:通过将大表分成多个较小的、易于管理的部分(分区),提高查询性能和管理效率。 3. **并行查询(Parallel Query)**:利用多处理器或多核硬件资源,同时处理查询的不同部分,以加速...
- **滑动窗口**:通过滑动窗口机制简化历史数据的清理工作,提高系统管理效率。 - **查询示例**:提供了一个具体的查询示例,展示了如何通过连接维表和事实表来执行特定条件下的聚合查询。 #### 七、SQL Server ...
以上只是T-SQL中的一部分关键知识点,实际应用中还有更多复杂的概念和高级特性,如分区、XML处理、JSON支持、错误处理、并发控制等。有了这款参考手册,用户可以深入学习和掌握这些内容,更好地利用T-SQL进行数据库...
Partition Management工具采用了滑动窗口技术,能够从一个分区删除数据并将其转移到中转表中,这个中转表随后可以用来加载数据到其他的分区,对于分区表的管理和数据迁移操作非常有帮助。 SortSQLFilesInProject是...
13. **窗口函数**:如ROW_NUMBER、RANK、DENSE_RANK等,提供在数据集上进行滑动窗口计算的能力,用于排名、分区计算等。 SQL查询语言技术的学习需要不断实践和深入理解。从基础语法到复杂查询,从单一表操作到多表...
窗口聚合使用TUMBLE函数定义时间滑动窗口,以一小时为单位,统计每个窗口内的用户访问次数。而常规聚合则通过DATE_FORMAT函数对时间戳进行格式化,按照小时划分数据,然后进行计数。这两种方法都能达到同样的效果,...
- **扩展型SQL**:除了标准SQL之外,许多数据库系统提供了扩展功能,如窗口函数、分区等,这些功能可以用来处理更复杂的数据分析需求。 - **应用案例**:例如,在处理时间序列数据时,可以利用窗口函数计算滑动平均...
Spark SQL支持窗口函数,这在处理时间序列数据和排名问题时非常有用,例如计算累计和、滑动平均等。 总的来说,Spark SQL通过提供高性能、易于使用的接口,以及对SQL和Hive的兼容性,极大地简化了大数据分析任务。...
以及SQL的窗口函数,用于处理时间序列数据和计算滑动窗口统计。 7. **ODPS项目与权限管理**:在ODPS中,数据是以项目的形式组织的,每个项目都有独立的权限管理,用户可以被授予不同的角色,如只读、读写、管理员等...
7. **状态管理**:在Flink中,Java程序员可以处理有状态计算,这意味着程序可以记住并更新其处理过的数据,这对于处理窗口聚合、滑动窗口等操作至关重要。 8. **容错机制**:Flink提供了强大的容错机制,通过检查点...
7. 分析函数(Analytic Functions):类似于窗口函数,可以在分组数据上进行滑动计算,如RANK、ROW_NUMBER、LEAD和LAG等。 8. 存储过程(Stored Procedures)和函数:预编译的SQL代码块,可封装复杂逻辑并重复使用。...
5. **窗口函数**:如ROW_NUMBER、RANK、DENSE_RANK和LEAD/LAG,它们在数据集上提供滑动窗口,进行排名、分组计算和滞后/领先值操作。 6. **CTE(公共表表达式)**:定义临时的结果集,可在查询中多次引用,便于复杂...
相关推荐
通过使用SQL Server的表分区结合滑动窗口技术,可以有效管理快速增长的数据集,确保查询性能的同时减少存储资源消耗。该方法尤其适用于具有明显时间特征的数据处理场景,能够帮助组织实现更加高效的数据库管理。
总的来说,这些SQL脚本提供了关于如何设计、创建和优化SQL Server分区表的实例,包括基于范围的分区、文件组的使用、分区联接优化以及滑动窗口策略等,这些都是处理大数据和提高查询性能的关键技术。通过学习和实践...
SQL Server 2008中的分区表和索引策略是数据库管理和优化的重要组成部分,尤其对于处理大规模数据的系统而言。分区表技术旨在解决大表在数据加载、删除和索引维护时遇到的性能问题。本文将深入探讨如何利用SQL ...
- **滑动窗口聚合**:例如,计算过去7天的日销售额之和。 - **数据平滑**:如计算5日移动平均,消除数据波动。 - **趋势分析**:通过`LAG()`或`LEAD()`观察数据变化。 4. **使用示例** ```sql SELECT sales_...
4. **维护操作**:考虑如何简化数据装载、更新和清理过程,例如滑动窗口策略。 **策略 I - 单独文件组的分区** 每个分区对应一个单独的文件组,这样可以独立调整不同分区的I/O资源,但可能会增加管理复杂性。 **...
9. **窗口滑动和跳跃**: 通过设置窗口的帧大小,可以创建滑动窗口(如每5行滑动一次)或跳跃窗口(如每隔5行开始新窗口),这在处理时间序列数据时特别有用。 在实际应用中,结合这些窗口函数,我们可以进行平均值...
窗口函数可以实现动态的分组统计,即在不同的分区或窗口范围内进行统计计算,而无需显式地使用GROUP BY语句。 ##### 3. Top N 通过窗口函数,可以轻松地找出每个分区内的Top N记录,例如找出每个月销售额最高的前几...
- **灵活性**:通过灵活定义窗口,可以进行各种复杂的数据分析,如滑动窗口计算、分区计算等。 - **简洁性**:相比传统的嵌套查询和子查询,窗口函数的语法更简洁,代码可读性更强。 总的来说,SQL2005中的窗口...
2. **分区表(Partitioning)**:通过将大表分成多个较小的、易于管理的部分(分区),提高查询性能和管理效率。 3. **并行查询(Parallel Query)**:利用多处理器或多核硬件资源,同时处理查询的不同部分,以加速...
- **滑动窗口**:通过滑动窗口机制简化历史数据的清理工作,提高系统管理效率。 - **查询示例**:提供了一个具体的查询示例,展示了如何通过连接维表和事实表来执行特定条件下的聚合查询。 #### 七、SQL Server ...
以上只是T-SQL中的一部分关键知识点,实际应用中还有更多复杂的概念和高级特性,如分区、XML处理、JSON支持、错误处理、并发控制等。有了这款参考手册,用户可以深入学习和掌握这些内容,更好地利用T-SQL进行数据库...
Partition Management工具采用了滑动窗口技术,能够从一个分区删除数据并将其转移到中转表中,这个中转表随后可以用来加载数据到其他的分区,对于分区表的管理和数据迁移操作非常有帮助。 SortSQLFilesInProject是...
13. **窗口函数**:如ROW_NUMBER、RANK、DENSE_RANK等,提供在数据集上进行滑动窗口计算的能力,用于排名、分区计算等。 SQL查询语言技术的学习需要不断实践和深入理解。从基础语法到复杂查询,从单一表操作到多表...
窗口聚合使用TUMBLE函数定义时间滑动窗口,以一小时为单位,统计每个窗口内的用户访问次数。而常规聚合则通过DATE_FORMAT函数对时间戳进行格式化,按照小时划分数据,然后进行计数。这两种方法都能达到同样的效果,...
- **扩展型SQL**:除了标准SQL之外,许多数据库系统提供了扩展功能,如窗口函数、分区等,这些功能可以用来处理更复杂的数据分析需求。 - **应用案例**:例如,在处理时间序列数据时,可以利用窗口函数计算滑动平均...
Spark SQL支持窗口函数,这在处理时间序列数据和排名问题时非常有用,例如计算累计和、滑动平均等。 总的来说,Spark SQL通过提供高性能、易于使用的接口,以及对SQL和Hive的兼容性,极大地简化了大数据分析任务。...
以及SQL的窗口函数,用于处理时间序列数据和计算滑动窗口统计。 7. **ODPS项目与权限管理**:在ODPS中,数据是以项目的形式组织的,每个项目都有独立的权限管理,用户可以被授予不同的角色,如只读、读写、管理员等...
7. **状态管理**:在Flink中,Java程序员可以处理有状态计算,这意味着程序可以记住并更新其处理过的数据,这对于处理窗口聚合、滑动窗口等操作至关重要。 8. **容错机制**:Flink提供了强大的容错机制,通过检查点...
7. 分析函数(Analytic Functions):类似于窗口函数,可以在分组数据上进行滑动计算,如RANK、ROW_NUMBER、LEAD和LAG等。 8. 存储过程(Stored Procedures)和函数:预编译的SQL代码块,可封装复杂逻辑并重复使用。...
5. **窗口函数**:如ROW_NUMBER、RANK、DENSE_RANK和LEAD/LAG,它们在数据集上提供滑动窗口,进行排名、分组计算和滞后/领先值操作。 6. **CTE(公共表表达式)**:定义临时的结果集,可在查询中多次引用,便于复杂...