partition

作者: 鲸鱼酱375 | 来源:发表于2019-08-23 19:23 被阅读0次

    1. what is

    • Partitioning is the process of breaking or separating something into smaller pieces
    • Partitioning a HDD allows for smaller, separate instances
    • Breaking data in a table down into smaller groupings allow for faster processing
    • Each partition created, if there is an index, will have a separate B-Tree

    2.Steps in Creating a Partition

    • Create a Partition Function
    • Create File Groups & Assign a File to Each
    • Create a Partition Scheme
    • Create/Modify a Table/Index with Partition Scheme

    3.Partition Point to Consider

    • Partitioning can create extra index B-Tree’s to monitor. Be sure the table should have an index at all
    • Partitioning can be done on tables easily, undoing them requires dropping the table
    • Partitioning takes time and memory, don’t partition unless it’s necessary
    • Usually only performed in Data Warehouses
    • can have 15000 partitions
    • always use data to create partition

    4. 优势

    • when index is created on partitioned table,A b-tree is created for each partition
      index depth is less
    • rebuild / reorganize index, only on particular partition
      faster and easy
    • if some wrong happened on a particular partition, it will not interval other partition
    • we can place partitions on different file groups
      easy back up
      data reterival fast
    • truncate partition faster than delete
      SWITCH (move data to other place?) fast
    • minize lock; max lock is on partition

    5. disadvantage

    • when we have more partition,we need merge them; maintaince and overhead

    6.note

    • you can create file groups and add partitions to different file groups but it is not a mandatory step.
    • ndf :secondary files
    • mdf: primary file
    • every table has partition(?)

    Common Questions on Partitioning

    1. How do you create partitioning on an existing table without dropping it
      https://www.mssqltips.com/sqlservertip/5296/implementation-of-sliding-window-partitioning-in-sql-server-to-purge-data/
    2. How do you create partitioning on an existing table with CI without dropping table
    3. How do you create different types of indexes on different partitions
      filtered index(?)
    4. What is sliding window or rolling window mechanism in partitions
      https://www.databasejournal.com/features/mssql/partitioning-in-sql-server-managing-sliding-window-scenario.html
    5. How can you back up data faster with partitions
    6. What is the new feature of 2016 related to partitioning? --TRUNCATE TABLE <TABLE NAME> WITH PARTITION (1)
    7. How many partitions are possible for each table? --2012 AND LATER 15000
    8. What are the advantages of partitions?

    7.switch

    https://www.mssqltips.com/sqlservertip/5296/implementation-of-sliding-window-partitioning-in-sql-server-to-purge-data/

    视频代码

    create partition function part_func (int)
    as
    range left for values (50,100,150,200)
    
    alter database test_db
        add filegroup filegroup1
    alter database test_db
        add filegroup filegroup2
    alter database test_db
        add filegroup filegroup3
    alter database test_db
        add filegroup filegroup4
    alter database test_db
        add filegroup filegroup5
    
    alter database test_db
    add file
    (name=fg1_dat,
    filename="c:\partition\fg1.ndf",
    size = 30mb,
    maxsize =50mb,
    filegrowth = 5mb)
    to filegroup filegroup1
    
    alter database test_db
    add file
    (name=fg2_dat,
    filename="c:\partition\fg2.ndf",
    size = 30mb,
    maxsize =50mb,
    filegrowth = 5mb)
    to filegroup filegroup2
    
    alter database test_db
    add file
    (name=fg3_dat,
    filename="c:\partition\fg3.ndf",
    size = 30mb,
    maxsize =50mb,
    filegrowth = 5mb)
    to filegroup filegroup3
    
    alter database test_db
    add file
    (name=fg4_dat,
    filename="c:\partition\fg4.ndf",
    size = 30mb,
    maxsize =50mb,
    filegrowth = 5mb)
    to filegroup filegroup4
    
    alter database test_db
    add file
    (name=fg5_dat,
    filename="c:\partition\fg5.ndf",
    size = 30mb,
    maxsize =50mb,
    filegrowth = 5mb)
    to filegroup filegroup5
    
    create partition scheme part_scheme
    as
    partition part_func to
    (filegroup1,filegroup2,filegroup3,filegroup4,filegroup5)
    
    create table partition_table
    (id int identity(1,1),name varchar(50)) on part_scheme (id)
    
    drop table partition_table
    drop partition scheme part_scheme
    drop partition function part_func
    
    alter database test_db
        remove file fg1_dat
    alter database test_db
        remove file fg2_dat
    alter database test_db
        remove file fg3_dat
    alter database test_db
        remove file fg4_dat
    alter database test_db
        remove file fg5_dat
    
    alter database test_db
    remove filegroup filegroup1
    alter database test_db
    remove filegroup filegroup2
    alter database test_db
    remove filegroup filegroup3
    alter database test_db
    remove filegroup filegroup4
    alter database test_db
    remove filegroup filegroup5
    

    note代码

    USE CSI
    GO
    
    --Step 1: Create Partition Function
    CREATE PARTITION FUNCTION fnPartFunction(DATE)
    AS
    RANGE LEFT FOR VALUES ('12/31/2016', '12/31/2017', '12/31/2018')
    /*
    Above Function will create 4 partitions
    With LEFT orientation/align
    P1 - Data with Dates on or Before 12/31/2016    
    P2 - 01/01/2017 - 12/31/2017
    P3 - 01/01/2018 - 12/31/2018
    P4 - Data with Dates on or After 01/01/2019
    
    With RIGHT orientation/align
    P1 - Data with Dates Before 12/31/2016  
    P2 - 12/31/2016 - 12/30/2017
    P3 - 12/31/2017 - 12/30/2018
    P4 - Data with Dates on or After 12/31/2018
    */
    
    --You can create file groups and add partitions to different file groups but it is not a mandatory step. 
    You can assign all partitions to 1 file group or PRIMARY file group
    ALTER DATABASE CSI 
    ADD FILEGROUP FG1
    GO
    ALTER DATABASE CSI 
    ADD FILEGROUP FG2
    GO
    ALTER DATABASE CSI 
    ADD FILEGROUP FG3
    GO
    ALTER DATABASE CSI 
    ADD FILEGROUP FG4
    GO
    
    --Creating secondary files for the Database
    ALTER DATABASE CSI
    ADD FILE
    (NAME = FG1_Dat,
    FileName = "C:\Partitions\FG1.ndf",
    SIZE = 10 MB,
    MaxSize = 50 MB,
    FileGrowth = 5 MB)
    TO FileGroup FG1
    GO
    
    ALTER DATABASE CSI
    ADD FILE
    (NAME = FG2_Dat,
    FileName = "C:\Partitions\FG2.ndf",
    SIZE = 10 MB,
    MaxSize = 50 MB,
    FileGrowth = 5 MB)
    TO FileGroup FG2
    GO
    
    ALTER DATABASE CSI
    ADD FILE
    (NAME = FG3_Dat,
    FileName = "C:\Partitions\FG3.ndf",
    SIZE = 10 MB,
    MaxSize = 50 MB,
    FileGrowth = 5 MB)
    TO FileGroup FG3
    GO
    
    ALTER DATABASE CSI
    ADD FILE
    (NAME = FG4_Dat,
    FileName = "C:\Partitions\FG4.ndf",
    SIZE = 10 MB,
    MaxSize = 50 MB,
    FileGrowth = 5 MB)
    TO FileGroup FG4
    GO
    
    --Creating partition scheme based on the function created earlier
    CREATE PARTITION SCHEME schPartScheme
    AS
    PARTITION fnPartFunction TO
    (FG1, FG2, FG3, FG4) --Assigning each partition to a different file
    GO
    
    --In the following case we are assigning 3 partitions to 1 file and 4th to another file
    CREATE PARTITION SCHEME schPartScheme
    AS
    PARTITION fnPartFunction TO
    (FG1, FG1, FG1, FG4)
    GO
    
    --In the following case we are assigning all partitions to primary file (.mdf)
    CREATE PARTITION SCHEME schPartScheme
    AS
    PARTITION fnPartFunction ALL TO
    ([PRIMARY])
    GO
    
    DROP TABLE IF EXISTS [tblPartition]
    GO
    
    --Creating table on partitions scheme
    CREATE TABLE [dbo].[tblPartition](
        [SalesPersonID] [int] NULL,
        [OrderDate] [date] NULL,
        [SalesOrderNumber] [nvarchar](25) NOT NULL,
        [CustomerID] [int] NOT NULL,
        [SubTotal] [money] NOT NULL,
        [TaxAmt] [money] NOT NULL,
        [Freight] [money] NOT NULL,
        [TotalDue] [money] NOT NULL,
        [FirstName] [nvarchar](50) NULL,
        [LastName] [nvarchar](50) NULL
    ) ON schPartScheme (OrderDate)
    GO
    
    DECLARE @Days INT
    SELECT @Days = DATEDIFF(DD, MAX(OrderDate), GETDATE())
    FROM AdventureWorks2017.Sales.SalesOrderHeader H
    
    INSERT INTO [tblPartition]
    SELECT H.SalesPersonID, CAST(DATEADD(DD, @Days, H.OrderDate) AS DATE) OrderDate, 
    H.SalesOrderNumber, H.CustomerID, H.SubTotal, H.TaxAmt, H.Freight, H.TotalDue, P.FirstName, P.LastName  
    FROM AdventureWorks2017.Sales.SalesOrderHeader H
    LEFT JOIN AdventureWorks2017.Person.Person P
    ON P.BusinessEntityID = H.SalesPersonID
    GO
    
    --Creating index on partition scheme
    CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_name
        ON <object> ( column [ ASC | DESC ] [ ,...n ] )
        [ INCLUDE ( column_name [ ,...n ] ) ]
        [ WHERE <filter_predicate> ]
        [ WITH ( <relational_index_option> [ ,...n ] ) ]
        [ ON { partition_scheme_name ( column_name )
             | filegroup_name
             | default
             }
        ]
        [ FILESTREAM_ON { filestream_filegroup_name | partition_scheme_name | "NULL" } ]
      
    [ ; ]
    
    
    SELECT * FROM SYS.partition_functions
    SELECT * FROM SYS.partition_schemes
    SELECT * FROM SYS.partition_parameters
    SELECT * FROM SYS.partition_range_values
    SELECT * FROM SYS.partitions
    WHERE object_id = OBJECT_ID('tblPartition')
    
    --Creating another table without Partitions to compare performance
    
    DROP TABLE IF EXISTS tblNonPartition
    
    DECLARE @Days INT
    SELECT @Days = DATEDIFF(DD, MAX(OrderDate), GETDATE())
    FROM AdventureWorks2017.Sales.SalesOrderHeader H
    
    SELECT H.SalesPersonID, CAST(DATEADD(DD, @Days, H.OrderDate) AS DATE) OrderDate, 
    H.SalesOrderNumber, H.CustomerID, H.SubTotal, H.TaxAmt, H.Freight, H.TotalDue, 
    P.FirstName, P.LastName INTO tblNonPartition  
    FROM AdventureWorks2017.Sales.SalesOrderHeader H
    LEFT JOIN AdventureWorks2017.Person.Person P
    ON P.BusinessEntityID = H.SalesPersonID
    GO
    
    --Enable actual exec plan and run following 2 queries together to compare the performance of partitions 
    and see in first execution plan that Table scan uses only 2 partitions eventhough there are 4 partitions. 
    In my execution plan first query took 16% and second query took 84%
    SELECT * FROM tblPartition
    WHERE OrderDate BETWEEN '5/1/2016' AND '6/15/2017'
    
    SELECT * FROM tblNonPartition
    WHERE OrderDate BETWEEN '5/1/2016' AND '6/15/2017'
    
    DROP TABLE IF EXISTS [tblNonPartition]
    GO
    
    --Removing Partitioning
    DROP TABLE IF EXISTS [tblPartition]
    GO
    
    DROP PARTITION SCHEME schPartScheme
    GO
    --Remove Files related to Partition Table
    ALTER DATABASE CSI
    REMOVE FILE FG1_dat
    GO
    
    ALTER DATABASE CSI
    REMOVE FILE FG2_dat
    GO
    
    ALTER DATABASE CSI
    REMOVE FILE FG3_dat
    GO
    
    ALTER DATABASE CSI
    REMOVE FILE FG4_dat
    GO
    
    --Removing File Groups
    ALTER DATABASE CSI
    REMOVE FILEGROUP FG1
    GO
    ALTER DATABASE CSI
    REMOVE FILEGROUP FG2
    GO
    ALTER DATABASE CSI
    REMOVE FILEGROUP FG3
    GO
    ALTER DATABASE CSI
    REMOVE FILEGROUP FG4
    GO
    
    --Drop partition function
    DROP PARTITION FUNCTION fnPartFunction
    
    

    相关文章

      网友评论

          本文标题:partition

          本文链接:https://www.haomeiwen.com/subject/rrbasctx.html