Help: SQL Server

Sharing my knowlege about SQL Server Troubleshooting Skills

  • Blog Stats

    • 2,153,609 hits
  • Select GETDATE()

    December 2025
    M T W T F S S
    1234567
    891011121314
    15161718192021
    22232425262728
    293031  

Posts Tagged ‘SQL Server 2014’

SQL 2014 Learning Series # 6 – New Feature – Incremental Statistics (Part 2)

Posted by blakhani on April 17, 2014


In part 1 of Incremental Statistics, we saw demo about “CREATE STATISTICS …INCREMENTAL = ON” and “UPDATE STATISTICS… RESAMPLE ON PARTITIONS(9, 10). As I mentioned in the closing note of last post, there are few more places where syntax has been enhanced. So, we would cover those in this post.

ALTER DATABASE in SQL 2014 provides an option for auto-stats to be created on incremental basis. Here is the command.

ALTER DATABASE [AdventureWorks2014]
 SET AUTO_CREATE_STATISTICS ON  (INCREMENTAL=ON)


UPDATE STATISTICS also has clause INCREMENTAL ON|OFF. Why? When we specify ON, per partition statistics are recreated whereas OFF would drop existing statistics and recompute the statistics. 

UPDATE STATISTICS Production.TransactionHistoryArchive_IncrementalDemo (IncrementalStatsDemo)
with INCREMENTAL= OFF


To identify whether a statistics is created as with incremental or not, we can use catalog view sys.stats. In SQL Server 2014 a new column is_incremental has been introduced.

UPDATE STATISTICS Production.TransactionHistoryArchive_IncrementalDemo(IncrementalStatsDemo)
with INCREMENTAL= ON
go
select * from sys.stats where is_incremental = 1
go
UPDATE STATISTICS Production.TransactionHistoryArchive_IncrementalDemo(IncrementalStatsDemo)
with INCREMENTAL= OFF
go
select * from sys.stats where is_incremental = 1
go

In first select query output, we should see IncrementalStatsDemo and since we turned it off later, the second select should not show the output.

image

There are some error messages which you should be aware of.

Msg 9111, Level 16, State 1, Line 1

UPDATE STATISTICS ON PARTITIONS syntax is not supported for non-incremental statistics.

Msg 9108, Level 16, State 1, Line 1

This type of statistics is not supported to be incremental.

First error is self-explanatory. If we attempt to update traditional statistics and provide partition clause, we would get first error. Second error is more generic and can be caused in various situation. Books online motioned those limitation here. I am pasting them below.

<Snip from books online>

Incremental stats are not supported for following statistics types:

  • Statistics created with indexes that are not partition-aligned with the base table.
  • Statistics created on AlwaysOn readable secondary databases.
  • Statistics created on read-only databases.
  • Statistics created on filtered indexes.
  • Statistics created on views.
  • Statistics created on internal tables.
  • Statistics created with spatial indexes or XML indexes.

</Snip from books online>

Hope this blog helped you in learning new feature.

  • Cheers,
  • Balmukund Lakhani
  • Twitter @blakhani
  • Author: SQL Server 2012 AlwaysOnPaperback, Kindle
  • Posted in SQL 2014 Learning Series, SQL Server 2014 | Tagged: , , | 4 Comments »

    SQL 2014 Learning Series # 5 – New Feature – Incremental Statistics (Part 1)

    Posted by blakhani on April 15, 2014


    Many times you might have to update the statistics (index stats or normal stats) with fullscan, either manually or via scheduled job. If the table is large then time taken would be considerably huge because it has to scan each and every record of the table. Let’s assume that we have created partitions on the table and we only modified data for one partition. Earlier version of SQL didn’t offer any choice to update statistics only for one partition. Only choice we had was “FULLSCAN”.

    To overcome this, SQL Server 2014 introduced “INCREMENTAL” keyword under Create Statistics. As per books online “When ON, the statistics created are per partition statistics. When OFF, stats are combined for all partitions. The default is OFF.”

    To have some sample data, I have downloaded base AdventureWorks sample database from: http://msftdbprodsamples.codeplex.com/downloads/get/417885

    I have restored it in SQL Server 2014 and named as AdventureWorks2014. I would be playing around with [AdventureWorks2014].[Production].[TransactionHistoryArchive] table which has transactions from 2005-05-17 to 2007-08-31. I have created quarterly partition.

    Use AdventureWorks2014;
    GO
    
    CREATE partition FUNCTION [QuarterlyDate](datetime) AS range LEFT FOR VALUES ( 
    N'2005-05-01T00:00:00', N'2005-08-01T00:00:00', N'2005-11-01T00:00:00', 
    N'2006-02-01T00:00:00', N'2006-05-01T00:00:00', N'2006-08-01T00:00:00', 
    N'2006-11-01T00:00:00', N'2007-02-01T00:00:00', N'2007-05-01T00:00:00', 
    N'2007-08-01T00:00:00', N'2007-11-01T00:00:00'); 
    GO
    
    CREATE partition scheme [TransactionDatePS] AS partition [QuarterlyDate] TO ( 
    [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], 
    [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY]);
    GO
    
    CREATE TABLE Production.TransactionHistoryArchive_IncrementalDemo(
        TransactionID int NOT NULL,
        ProductID int NOT NULL,
        ReferenceOrderID int NOT NULL,
        ReferenceOrderLineID int NOT NULL, 
        TransactionDate datetime NOT NULL,
        TransactionType nchar(1) NOT NULL,
        Quantity int NOT NULL,
        ActualCost money NOT NULL,
        ModifiedDate datetime NOT NULL)
    ON TransactionDatePS(TransactionDate);
    GO
    

    Now, I am going to populate partitioned table. To show before and after effect, we would populate only one partition at this point. Since our PF is defined as “LFET” which mean boundary value would go to left side. If I have to populate 8th partition, the range would be TransactionDate > N’2006-11-01T00:00:00′ and TransactionDate <= N’2007-02-01T00:00:00′. Here is the query to dump data into newly created table.

    INSERT INTO Production.TransactionHistoryArchive_IncrementalDemo
    SELECT * FROM Production.TransactionHistoryArchive
    WHERE TransactionDate > N'2006-11-01T00:00:00' and 
    TransactionDate <= N'2007-02-01T00:00:00'
    
    

    (10324 row(s) affected). Now, let’s look at partitions

    SELECT * FROM sys.partitions
      WHERE object_id = OBJECT_ID('Production.TransactionHistoryArchive_IncrementalDemo');
    

     

    image

    As expected, we have 10324 rows in 8th partition. Use below to create “incremental” statistics. Notice that I have added new clause which is available in SQL Server 2014.

    CREATE STATISTICS IncrementalStatsDemo 
    ON Production.TransactionHistoryArchive_IncrementalDemo (TransactionDate) 
    WITH FULLSCAN, INCREMENTAL = ON;
    
    

    Execute DBCC SHOW_STATISTICS command to look at histogram

    DBCC SHOW_STATISTICS('Production.TransactionHistoryArchive_IncrementalDemo', IncrementalStatsDemo)
    with histogram
    

    image

     

    Added more rows to different partition

    INSERT INTO Production.TransactionHistoryArchive_IncrementalDemo
    SELECT * FROM Production.TransactionHistoryArchive
    WHERE TransactionDate > N'2007-02-01T00:00:00' and 
    TransactionDate <= N'2007-08-01T00:00:00'

    (27318 row(s) affected)

    image

    UPDATE STATISTICS Production.TransactionHistoryArchive_IncrementalDemo (IncrementalStatsDemo)
    with resample ON PARTITIONS(9, 10)

    Now, lets look at stats again.

    image

    If we compare with earlier histogram image, the highlighted range was at step 81 earlier which has moved to step 60 now and Total number of steps have increased to 192 (as compared to 81 earlier). This means that update statistics command has read those partitions which were specified (9 and 10) and merged with earlier created statistics. As per books online “ON PARTITIONS – Forces the leaf-level statistics covering the partitions specified in the ON PARTITIONS clause to be recomputed, and then merged to build the global statistics. WITH RESAMPLE is required because partition statistics built with different sample rates cannot be merged together.”

    There is more to cover because there are various syntax added on different places. In next blog, I would cover those.

    Stay tuned.

  • Cheers,
  • Balmukund Lakhani
  • Twitter @blakhani
  • Author: SQL Server 2012 AlwaysOnPaperback, Kindle
  • Posted in SQL 2014 Learning Series | Tagged: , , | 4 Comments »

    SQL 2014 Learning Series # 4 – New Feature – Buffer Pool Extension

    Posted by blakhani on April 8, 2014


    Today I am going to pick up another new feature of SQL Server 2014 called as Buffer Pool Extension (a.k.a. BPE).  As the name suggests, this feature allows DBA to extend buffer pool beyond the size of the memory allocated to SQL Server. Buffer pool is biggest chunk of memory allocated in SQL Server process. BPE can use nonvolatile storage devices (like SSD) for increasing amount of memory available for buffer pool consumers. This allows usage of SSD as an intermediate buffer pool pages which would help in getting price advantage over the memory increase on the server. Adding storage device on server is less invasive as compare to adding memory and fetching a page from SSD is faster than fetching it from data file. You can think of this as pagefile for SQL buffer pool only.

    Steps to configure:

    To enable the feature we need provide file path and the size. That’s it? Well, keep in mind that size of BPE should be more than current memory allocation, else we would get below error
    Msg 868, Level 16, State 1, Line 40
    Buffer pool extension size must be larger than the current memory allocation threshold 12784 MB. Buffer pool extension is not enabled.

    Due to above check, I have reduced max server memory on my SQL instance so that I can create the demo.

    EXEC sys.sp_configure N'show advanced options', N'1'  
    GO
    RECONFIGURE WITH OVERRIDE
    GO
    EXEC sys.sp_configure N'max server memory (MB)', N'1024'
    GO
    RECONFIGURE WITH OVERRIDE
    GO
    EXEC sys.sp_configure N'show advanced options', N'0'  
    GO
    RECONFIGURE WITH OVERRIDE
    GO
    

    using above commands, now the max server memory if 1 GB. Then I ran below command to create BPE file of 2 GB (to avoid error 868)

    ALTER SERVER CONFIGURATION 
    SET BUFFER POOL EXTENSION 
    ON ( FILENAME = 'F:\BufferPoolExtensionDemo\BPE.bpe' ,SIZE = 2 GB) 
    

    To get configuration information

    Select * from sys.dm_os_buffer_pool_extension_configuration
    

     

    image

    Read state_description carefully. It says “BUFFER POOL EXTENSION CLEAN PAGE CACHING ENABLED”. Clean page is a page in SQL memory which has no write pending. It’s generally the page which has been read from data file and no transaction has done the update of that page. Any modification to clean page would make it “dirty page”, which means there is some write on the page which is not yet written to the data file. Only clean pages can be stored in BPE file.

    As per whitepaper mentioned in blog “The dual write design is that dirty pages evicted from the buffer pool are written both to the SSD and to the database on disks; in effect, treating the SSD as a “write-through” cache for dirty pages”

    image

     

    Where is my page? memory or BPE file?

    To identify that, we can use DMV sys.dm_os_buffer_descriptors which has additional column introduced called is_in_bpool_extension. Here is the query to show such pages.

    Select    *
    from    sys.dm_os_buffer_descriptors
    where    is_in_bpool_extension = 1
    

     

    What if you want to change the file size of BPE? In case we want to change the configuration, the only option is to disable and enable the configuration. There is no ALTER command to modify it. Here is the command to turn it off.

    ALTER SERVER CONFIGURATION
    SET BUFFER POOL EXTENSION OFF
    

     

    If we query sys.dm_os_buffer_pool_extension_configuration again, we’ll see new information on our buffer pool extension.

     image

    
    

    To monitor. Below XEvents are available in SQL Server 2014 to monitor the functionality of BPE

    sqlserver.buffer_pool_extension_pages_written
    sqlserver.buffer_pool_extension_pages_read
    sqlserver.buffer_pool_extension_pages_evicted
    sqlserver.buffer_pool_eviction_thresholds_recalculated

    Here are various messages which contains text buffer pool extension. (taken from sys.messages catalog view)

    Buffer pool extension “%.*ls” has been initialized successfully with size is %I64d MB.
    Failed to create buffer pool extension of size %I64d MB on path “%.*ls”.
    Buffer pool extension configuration “%.*ls” is in wrong format. The format should be “<extension directory>,<size in GB>”.
    Buffer pool extension size must be larger than the physical memory size %I64d MB. Buffer pool extension is not enabled.
    Attempt to disable buffer pool extension when in state %ls is not allowed.
    Attempt to enable buffer pool extension when in state %ls is not allowed.
    Attempting to allocate %1ld BUF for buffer pool extension for a maximum of %2ld page descriptors.
    Buffer pool extension is only supported on Standard and Enterprise Editions of SQL Server.
    Buffer pool extension is not supported on the %ls architecture.
    Buffer pool extension has been disabled successfully. Deleting buffer pool extension “%.*ls”.
    Buffer pool extension size must be larger than the current memory allocation threshold %I64d MB. Buffer pool extension is not enabled.
    Buffer pool extension “%.*ls” cannot be closed because %ld asynchronous I/Os are outstanding.
    Could not change the value of the ‘BPoolExtensionPath’ property. Operating system error %ls

    Important Points:

    • Since BPE files stores only clean pages, there is no risk of data loss in event of loss of extension file or device which stores the file.
    • Available in Enterprise (developer and evaluation) and standard edition feature. Note that this is only for 64 bit SQL Server.

    I would not recommend putting BPE on spinning media. Since I don’t have SSD, I have used F drive but that should NOT be done in production.

    For more information on the buffer pool extension, please read book online topic Buffer Pool Extension.

    Hope this is helpful.

  • Cheers,
  • Balmukund Lakhani
  • Twitter @blakhani
  • Author: SQL Server 2012 AlwaysOnPaperback, Kindle
  • Posted in SQL 2014 Learning Series, SQL Server 2014 | Tagged: , , , | 6 Comments »