{"id":527,"date":"2011-04-18T13:24:46","date_gmt":"2011-04-18T13:24:46","guid":{"rendered":"\/blogs\/jonathan\/post\/Looking-at-multiple-data-files-and-proportional-fill-with-Extended-Events.aspx"},"modified":"2017-04-13T12:18:21","modified_gmt":"2017-04-13T16:18:21","slug":"looking-at-multiple-data-files-and-proportional-fill-with-extended-events","status":"publish","type":"post","link":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/","title":{"rendered":"Looking at multiple data files and proportional fill with Extended Events"},"content":{"rendered":"<p>At SQL Connections, I presented a session titled \u201cLearn SQL Server Internals with Extended Events\u201d where I demonstrated a number ways to use Extended Events to learn about the internal workings of the database engine for SQL Server.&#160; The morning of the session I was chatting with someone about a problem they had seen and the topic of proportional fill came up and how the database engine stripes data across multiple files in a user database.&#160; From this discussion, I got the idea to play around with multiple database files and built a demo using Extended Events that showed how proportional fill worked inside of the database engine.&#160; This wasn\u2019t a planned demo for my presentation, and I had plenty of other demo\u2019s that showed various SQL Server Internals, but it became a really good demo that I decided to throw into the mix, which put me way over budget for time.&#160; I decided to leave it up the audience which demo they wanted to see for the last demo of the session, an originally planned one, or the one I wrote that morning for proportional fill; the majority wanted to see the one on proportional fill and it turned out to be the best demo of the entire session based on the crowd interest and feedback.&#160; What was most interesting to me was the number of people attending the session that had never heard of the concept of proportional fill with SQL Server.&#160; Proportional fill is the algorithm used by SQL Server to determine how much information is written to each of the files in a multi-file filegroup based on the proportion of free space within each file; which allows the files to become full at approximately the same time.&#160; Proportional fill has nothing to do with the actual file sizes, it is strictly based on the free space within a file.&#160; <\/p>\n<p>To demonstrate proportional fill in SQL Server, we\u2019ll take a look at how the page writes and I\/O operations are distributed across varying configurations for a test database using the same test and event session for each configuration<\/p>\n<h1>Basic Example<\/h1>\n<p>To look at how proportional fill functions, we\u2019ll start with a basic example, using a database with a separate filegroup for user objects that has been marked as the default filegroup for the database.&#160; The UserObjects filegroup will have four data files, each 32MB in size.<\/p>\n<blockquote>\n<div class=\"csharpcode\">\n<pre class=\"alt\"><span class=\"rem\">-- Create a multi-file database with evenly sized files<\/span><\/pre>\n<pre><span class=\"kwrd\">CREATE<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <span class=\"kwrd\">ON<\/span>  <span class=\"kwrd\">PRIMARY<\/span> <\/pre>\n<pre class=\"alt\">( NAME = N<span class=\"str\">'MultipleDataFiles'<\/span>, <\/pre>\n<pre>    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles.mdf'<\/span> , <\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre>    FILEGROWTH = 32768KB ), <\/pre>\n<pre class=\"alt\">FILEGROUP [UserObjects] <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects1'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects1.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 32768KB ), <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects2'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects2.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 32768KB ), <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects3'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects3.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 32768KB ), <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects4'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects4.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 32768KB )<\/pre>\n<pre> LOG <span class=\"kwrd\">ON<\/span> <\/pre>\n<pre class=\"alt\">( NAME = N<span class=\"str\">'MultipleDataFiles_log'<\/span>, <\/pre>\n<pre>    FILENAME = N<span class=\"str\">'L:\\SQLLogs\\MultipleDataFiles_log.ldf'<\/span> , <\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">SIZE<\/span> = 131072KB , <\/pre>\n<pre>    FILEGROWTH = 32768KB )<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<pre><span class=\"kwrd\">ALTER<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">MODIFY<\/span> FILEGROUP [UserObjects] <span class=\"kwrd\">DEFAULT<\/span><\/pre>\n<pre>GO<\/pre>\n<\/p><\/div>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<\/blockquote>\n<p>With the database created, we\u2019ll create a table to load data into for our tests based on the AdventureWorks SalesOrderHeader table which will be the source for the test data:<\/p>\n<blockquote>\n<div class=\"csharpcode\">\n<pre class=\"alt\">- <span class=\"kwrd\">Create<\/span> a <span class=\"kwrd\">table<\/span> <span class=\"kwrd\">to<\/span> <span class=\"kwrd\">load<\/span> <span class=\"kwrd\">data<\/span> <span class=\"kwrd\">into<\/span> <span class=\"kwrd\">for<\/span> the tests<\/pre>\n<pre><span class=\"kwrd\">USE<\/span> [MultipleDataFiles]<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<pre><span class=\"kwrd\">IF<\/span> OBJECT_ID(<span class=\"str\">'SalesOrderHeader'<\/span>) <span class=\"kwrd\">IS<\/span> <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span><\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">DROP<\/span> <span class=\"kwrd\">TABLE<\/span> [dbo].[SalesOrderHeader]<\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">SET<\/span> NOCOUNT <span class=\"kwrd\">ON<\/span><\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">CREATE<\/span> <span class=\"kwrd\">TABLE<\/span> [dbo].[SalesOrderHeader](<\/pre>\n<pre>    [SalesOrderID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">IDENTITY<\/span>(1,1) <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span> <span class=\"kwrd\">PRIMARY<\/span> <span class=\"kwrd\">KEY<\/span>,<\/pre>\n<pre class=\"alt\">    [RevisionNumber] [tinyint] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [OrderDate] [datetime] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [DueDate] [datetime] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [ShipDate] [datetime] <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [Status] [tinyint] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [OnlineOrderFlag] [<span class=\"kwrd\">bit<\/span>] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [SalesOrderNumber] [nvarchar](25) <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [PurchaseOrderNumber] [nvarchar](25) <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [AccountNumber] [nvarchar](15) <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [CustomerID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [SalesPersonID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [TerritoryID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [BillToAddressID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [ShipToAddressID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [ShipMethodID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [CreditCardID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [CreditCardApprovalCode] [<span class=\"kwrd\">varchar<\/span>](15) <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [CurrencyRateID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [SubTotal] [money] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [TaxAmt] [money] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [Freight] [money] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [TotalDue] [money] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [Comment] [nvarchar](128) <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [rowguid] [uniqueidentifier] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [ModifiedDate] [datetime] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span><\/pre>\n<pre>) <\/pre>\n<pre class=\"alt\">GO<\/pre>\n<\/p><\/div>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<\/blockquote>\n<p>Now we\u2019ll create our event session using dynamic SQL to add the database_id for our test database to the predicate for each of the events, restricting them to firing only for our test database to minimize the need to filter through the event session data later on.&#160; The event session is going to collect the sqlserver.checkpoint_begin, sqlserver.checkpoint_end. sqlserver.file_written, sqlserver.file_write_completed, sqlserver.physical_page_write, sqlos.async_io_requested, and sqlos.async_io_completed events.&#160; The checkpoint events are included in the event session to show that writes don\u2019t immediately begin to occur to the data files, but instead occur in response to the checkpoint operations in the database engine.<\/p>\n<blockquote>\n<div class=\"csharpcode\">\n<pre class=\"alt\"><span class=\"rem\">-- Create our Event Session dynamically<\/span><\/pre>\n<pre><span class=\"kwrd\">IF<\/span> <span class=\"kwrd\">EXISTS<\/span>(<span class=\"kwrd\">SELECT<\/span> * <span class=\"kwrd\">FROM<\/span> sys.server_event_sessions <span class=\"kwrd\">WHERE<\/span> name=<span class=\"str\">'MultipleDataFiles'<\/span>)<\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">DROP<\/span> EVENT <span class=\"kwrd\">SESSION<\/span> [MultipleDataFiles] <span class=\"kwrd\">ON<\/span> SERVER;<\/pre>\n<pre><span class=\"kwrd\">DECLARE<\/span> @sqlcmd nvarchar(4000) = <span class=\"str\">'<\/pre>\n<pre class=\"alt\">CREATE EVENT SESSION MultipleDataFiles<\/pre>\n<pre>ON SERVER<\/pre>\n<pre class=\"alt\">ADD EVENT sqlserver.checkpoint_begin<\/pre>\n<pre>( WHERE (sqlserver.database_id = '<\/span>+ <span class=\"kwrd\">cast<\/span>(DB_ID() <span class=\"kwrd\">as<\/span> <span class=\"kwrd\">varchar<\/span>(3))+<span class=\"str\">')),<\/pre>\n<pre class=\"alt\">ADD EVENT sqlserver.checkpoint_end<\/pre>\n<pre>( WHERE (sqlserver.database_id = '<\/span>+ <span class=\"kwrd\">cast<\/span>(DB_ID() <span class=\"kwrd\">as<\/span> <span class=\"kwrd\">varchar<\/span>(3))+<span class=\"str\">')),<\/pre>\n<pre class=\"alt\">ADD EVENT sqlserver.file_written<\/pre>\n<pre>( WHERE (sqlserver.database_id = '<\/span>+ <span class=\"kwrd\">cast<\/span>(DB_ID() <span class=\"kwrd\">as<\/span> <span class=\"kwrd\">varchar<\/span>(3))+<span class=\"str\">')),<\/pre>\n<pre class=\"alt\">ADD EVENT sqlserver.file_write_completed<\/pre>\n<pre>( WHERE (sqlserver.database_id = '<\/span>+ <span class=\"kwrd\">cast<\/span>(DB_ID() <span class=\"kwrd\">as<\/span> <span class=\"kwrd\">varchar<\/span>(3))+<span class=\"str\">')),<\/pre>\n<pre class=\"alt\">ADD EVENT sqlserver.physical_page_write<\/pre>\n<pre>( WHERE (sqlserver.database_id = '<\/span>+ <span class=\"kwrd\">cast<\/span>(DB_ID() <span class=\"kwrd\">as<\/span> <span class=\"kwrd\">varchar<\/span>(3))+<span class=\"str\">')),<\/pre>\n<pre class=\"alt\">ADD EVENT sqlos.async_io_requested<\/pre>\n<pre>( WHERE (sqlserver.database_id = '<\/span>+ <span class=\"kwrd\">cast<\/span>(DB_ID() <span class=\"kwrd\">as<\/span> <span class=\"kwrd\">varchar<\/span>(3))+<span class=\"str\">')),<\/pre>\n<pre class=\"alt\">ADD EVENT sqlos.async_io_completed<\/pre>\n<pre>( WHERE (sqlserver.database_id = '<\/span>+ <span class=\"kwrd\">cast<\/span>(DB_ID() <span class=\"kwrd\">as<\/span> <span class=\"kwrd\">varchar<\/span>(3))+<span class=\"str\">'))--,<\/pre>\n<pre class=\"alt\">ADD TARGET package0.asynchronous_file_target(<\/pre>\n<pre>     SET filename='<\/span><span class=\"str\">'C:\\SQLskills\\MultipleDataFiles.xel'<\/span><span class=\"str\">',<\/pre>\n<pre class=\"alt\">         metadatafile='<\/span><span class=\"str\">'C:\\SQLskills\\MultipleDataFiles.xem'<\/span><span class=\"str\">')<\/pre>\n<pre>WITH (MAX_MEMORY = 8MB, EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS, TRACK_CAUSALITY = ON, MAX_DISPATCH_LATENCY=5SECONDS)'<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">EXEC<\/span> (@sqlcmd)<\/pre>\n<\/p><\/div>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<\/blockquote>\n<p>With the event session created we can run our data load:<\/p>\n<blockquote>\n<div class=\"csharpcode\">\n<pre class=\"alt\"><span class=\"rem\">-- Start the Event Session<\/span><\/pre>\n<pre><span class=\"kwrd\">ALTER<\/span> EVENT <span class=\"kwrd\">SESSION<\/span> MultipleDataFiles<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">ON<\/span> SERVER<\/pre>\n<pre><span class=\"kwrd\">STATE<\/span>=<span class=\"kwrd\">START<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<pre>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"rem\">-- Load data into the test database<\/span><\/pre>\n<pre>INSERT <span class=\"kwrd\">INTO<\/span> dbo.SalesOrderHeader<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">SELECT<\/span> RevisionNumber, <\/pre>\n<pre>    DATEADD(DD, 1126+number, OrderDate), <\/pre>\n<pre class=\"alt\">    DATEADD(DD, 1126+number, DueDate), <\/pre>\n<pre>    DATEADD(DD, 1126+number, ShipDate), <\/pre>\n<pre class=\"alt\">    soh.Status, OnlineOrderFlag, SalesOrderNumber, <\/pre>\n<pre>    PurchaseOrderNumber, AccountNumber, <\/pre>\n<pre class=\"alt\">    CustomerID, SalesPersonID, TerritoryID, <\/pre>\n<pre>    BillToAddressID, ShipToAddressID, <\/pre>\n<pre class=\"alt\">    ShipMethodID, CreditCardID, CreditCardApprovalCode, <\/pre>\n<pre>    CurrencyRateID, SubTotal, TaxAmt, Freight, <\/pre>\n<pre class=\"alt\">    TotalDue, Comment, rowguid, <\/pre>\n<pre>    DATEADD(DD, 1126+number, ModifiedDate)<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">FROM<\/span> AdventureWorks2008R2.Sales.SalesOrderHeader <span class=\"kwrd\">AS<\/span> soh<\/pre>\n<pre><span class=\"kwrd\">CROSS<\/span> <span class=\"kwrd\">JOIN<\/span> master.dbo.spt_values <span class=\"kwrd\">AS<\/span> sv<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">WHERE<\/span> sv.type = N<span class=\"str\">'P'<\/span><\/pre>\n<pre>  <span class=\"kwrd\">AND<\/span> sv.number &gt; 0 <span class=\"kwrd\">AND<\/span> sv.number &lt; 6<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span> 3<\/pre>\n<pre>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"rem\">-- Flush all dirty pages to disk<\/span><\/pre>\n<pre><span class=\"kwrd\">CHECKPOINT<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<pre>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"rem\">-- Stop the Event Session<\/span><\/pre>\n<pre><span class=\"kwrd\">ALTER<\/span> EVENT <span class=\"kwrd\">SESSION<\/span> MultipleDataFiles<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">ON<\/span> SERVER<\/pre>\n<pre><span class=\"kwrd\">STATE<\/span>=STOP<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<\/p><\/div>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<\/p>\n<\/blockquote>\n<p>The above script will load roughly 92MB of data into the test table which makes the insert operation smaller than the size of all four data files.&#160; Note that there is an explicit checkpoint in the test to force all dirty pages to be written to the appropriate data files on disk.&#160; Without this checkpoint, the file writes may appear to be imbalanced incorrectly due to the timing of the last automatic checkpoint and the dirty pages in cache when it occurred.&#160; By manually checkpointing the database before ending the event session we ensure we have the file writes captured accurately.&#160; To view the information captured by the event session we will read the event data into a table and then shred the XML into another intermediate table to allow for further analysis of the detailed information if you so desire.&#160; Finally we\u2019ll aggregate the events and pivot the results based on the file_id to see how SQL Server wrote to the database files for the database.&#160; <\/p>\n<blockquote>\n<div class=\"csharpcode\">\n<pre class=\"alt\"><span class=\"rem\">-- Drop Results tables if they exist<\/span><\/pre>\n<pre><span class=\"kwrd\">IF<\/span> OBJECT_ID(<span class=\"str\">'MultipleDataFileResults'<\/span>) <span class=\"kwrd\">IS<\/span> <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span><\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">DROP<\/span> <span class=\"kwrd\">TABLE<\/span> MultipleDataFileResults <\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">IF<\/span> OBJECT_ID(<span class=\"str\">'MultipleDataFileResultsParsed'<\/span>) <span class=\"kwrd\">IS<\/span> <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span><\/pre>\n<pre>    <span class=\"kwrd\">DROP<\/span> <span class=\"kwrd\">TABLE<\/span> MultipleDataFileResultsParsed <\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<pre>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"rem\">-- Create results table to load data from XE files<\/span><\/pre>\n<pre><span class=\"kwrd\">CREATE<\/span> <span class=\"kwrd\">TABLE<\/span> MultipleDataFileResults<\/pre>\n<pre class=\"alt\">(RowID <span class=\"kwrd\">int<\/span> <span class=\"kwrd\">identity<\/span> <span class=\"kwrd\">primary<\/span> <span class=\"kwrd\">key<\/span>, event_data XML)<\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\">&#160;<\/pre>\n<pre><span class=\"rem\">-- Load the event data from the file target<\/span><\/pre>\n<pre class=\"alt\">INSERT <span class=\"kwrd\">INTO<\/span> MultipleDataFileResults(event_data)<\/pre>\n<pre><span class=\"kwrd\">SELECT<\/span><\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">CAST<\/span>(event_data <span class=\"kwrd\">AS<\/span> XML) <span class=\"kwrd\">AS<\/span> event_data<\/pre>\n<pre><span class=\"kwrd\">FROM<\/span> sys.fn_xe_file_target_read_file(<span class=\"str\">'C:\\SQLskills\\MultipleDataFiles*.xel'<\/span>, <\/pre>\n<pre class=\"alt\">                                     <span class=\"str\">'C:\\SQLskills\\MultipleDataFiles*.xem'<\/span>, <\/pre>\n<pre>                                     <span class=\"kwrd\">null<\/span>, <span class=\"kwrd\">null<\/span>)<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<pre>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"rem\">-- Parse the event data<\/span><\/pre>\n<pre><span class=\"kwrd\">SELECT<\/span> <\/pre>\n<pre class=\"alt\">    RowID,<\/pre>\n<pre>    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/@name)[1]'<\/span>, <span class=\"str\">'varchar(50)'<\/span>) <span class=\"kwrd\">AS<\/span> event_name,<\/pre>\n<pre class=\"alt\">    DATEADD(hh, <\/pre>\n<pre>            DATEDIFF(hh, GETUTCDATE(), <span class=\"kwrd\">CURRENT_TIMESTAMP<\/span>), <\/pre>\n<pre class=\"alt\">            event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/@timestamp)[1]'<\/span>, <span class=\"str\">'datetime2'<\/span>)) <span class=\"kwrd\">AS<\/span> [<span class=\"kwrd\">timestamp<\/span>],<\/pre>\n<pre>    <span class=\"kwrd\">COALESCE<\/span>(event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;database_id&quot;]\/value)[1]'<\/span>, <span class=\"str\">'int'<\/span>), <\/pre>\n<pre class=\"alt\">             event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/action[@name=&quot;database_id&quot;]\/value)[1]'<\/span>, <span class=\"str\">'int'<\/span>)) <span class=\"kwrd\">AS<\/span> database_id,<\/pre>\n<pre>    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;mode&quot;]\/text)[1]'<\/span>, <span class=\"str\">'nvarchar(4000)'<\/span>) <span class=\"kwrd\">AS<\/span> [mode],<\/pre>\n<pre class=\"alt\">    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;file_handle&quot;]\/value)[1]'<\/span>, <span class=\"str\">'nvarchar(4000)'<\/span>) <span class=\"kwrd\">AS<\/span> [file_handle],<\/pre>\n<pre>    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;offset&quot;]\/value)[1]'<\/span>, <span class=\"str\">'bigint'<\/span>) <span class=\"kwrd\">AS<\/span> [offset],<\/pre>\n<pre class=\"alt\">    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;page_id&quot;]\/value)[1]'<\/span>, <span class=\"str\">'int'<\/span>) <span class=\"kwrd\">AS<\/span> [page_id],<\/pre>\n<pre>    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;file_id&quot;]\/value)[1]'<\/span>, <span class=\"str\">'int'<\/span>) <span class=\"kwrd\">AS<\/span> [file_id],<\/pre>\n<pre class=\"alt\">    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;file_group_id&quot;]\/value)[1]'<\/span>, <span class=\"str\">'int'<\/span>) <span class=\"kwrd\">AS<\/span> [file_group_id],<\/pre>\n<pre>    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;wait_type&quot;]\/text)[1]'<\/span>, <span class=\"str\">'nvarchar(100)'<\/span>) <span class=\"kwrd\">AS<\/span> [wait_type],<\/pre>\n<pre class=\"alt\">    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;duration&quot;]\/value)[1]'<\/span>, <span class=\"str\">'bigint'<\/span>) <span class=\"kwrd\">AS<\/span> [duration],<\/pre>\n<pre>    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/action[@name=&quot;sql_text&quot;]\/value)[1]'<\/span>, <span class=\"str\">'nvarchar(4000)'<\/span>) <span class=\"kwrd\">AS<\/span> [sql_text],<\/pre>\n<pre class=\"alt\">    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;cpu&quot;]\/value)[1]'<\/span>, <span class=\"str\">'int'<\/span>) <span class=\"kwrd\">AS<\/span> [cpu],<\/pre>\n<pre>    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;reads&quot;]\/value)[1]'<\/span>, <span class=\"str\">'bigint'<\/span>) <span class=\"kwrd\">AS<\/span> [<span class=\"kwrd\">reads<\/span>],<\/pre>\n<pre class=\"alt\">    event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/data[@name=&quot;writes&quot;]\/value)[1]'<\/span>, <span class=\"str\">'bigint'<\/span>) <span class=\"kwrd\">AS<\/span> [writes],<\/pre>\n<pre>    <span class=\"kwrd\">CAST<\/span>(<span class=\"kwrd\">SUBSTRING<\/span>(event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/action[@name=&quot;attach_activity_id&quot;]\/value)[1]'<\/span>, <span class=\"str\">'varchar(50)'<\/span>), 1, 36) <span class=\"kwrd\">AS<\/span> uniqueidentifier) <span class=\"kwrd\">as<\/span> activity_id,<\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">CAST<\/span>(<span class=\"kwrd\">SUBSTRING<\/span>(event_data.<span class=\"kwrd\">value<\/span>(<span class=\"str\">'(event\/action[@name=&quot;attach_activity_id&quot;]\/value)[1]'<\/span>, <span class=\"str\">'varchar(50)'<\/span>), 38, 10) <span class=\"kwrd\">AS<\/span> <span class=\"kwrd\">int<\/span>) <span class=\"kwrd\">as<\/span> event_sequence<\/pre>\n<pre><span class=\"kwrd\">INTO<\/span> MultipleDataFileResultsParsed<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">FROM<\/span> MultipleDataFileResults<\/pre>\n<pre><span class=\"kwrd\">ORDER<\/span> <span class=\"kwrd\">BY<\/span> Rowid<\/pre>\n<pre class=\"alt\">&#160;<\/pre>\n<pre><span class=\"rem\">-- Aggregate the results by the event name and file_id<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">SELECT<\/span> file_id, [file_write_completed],[file_written], [physical_page_write]<\/pre>\n<pre><span class=\"kwrd\">FROM<\/span><\/pre>\n<pre class=\"alt\">(    <span class=\"kwrd\">SELECT<\/span> event_name, file_id, <span class=\"kwrd\">COUNT<\/span>(*) <span class=\"kwrd\">AS<\/span> occurences<\/pre>\n<pre>    <span class=\"kwrd\">FROM<\/span> MultipleDataFileResultsParsed<\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">WHERE<\/span> event_name <span class=\"kwrd\">IN<\/span> (<span class=\"str\">'file_write_completed'<\/span>, <span class=\"str\">'file_written'<\/span>, <span class=\"str\">'physical_page_write'<\/span>)<\/pre>\n<pre>    <span class=\"kwrd\">GROUP<\/span> <span class=\"kwrd\">BY<\/span> event_name, file_id<\/pre>\n<pre class=\"alt\">) <span class=\"kwrd\">AS<\/span> tab<\/pre>\n<pre>PIVOT<\/pre>\n<pre class=\"alt\">(    <span class=\"kwrd\">MAX<\/span>(occurences) <\/pre>\n<pre>    <span class=\"kwrd\">FOR<\/span> event_name <span class=\"kwrd\">IN<\/span> ([file_write_completed],[file_written], [physical_page_write])) <span class=\"kwrd\">AS<\/span> pvt<\/pre>\n<\/p><\/div>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<\/blockquote>\n<p>The output of our pivot operation shows that the four data files in the UserObjects filegroup are written to relatively evenly, which should be expected based on the amount of free space being equal across the four data files.&#160; One item that should become incredibly apparent is the importance of the transaction log which has twenty-three times the file writes occurring to it than the nearest data file.&#160; <\/p>\n<p><a href=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/14e7c3b4\/image.png\"><img fetchpriority=\"high\" decoding=\"async\" style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/063d17cf\/image_thumb.png\" width=\"381\" height=\"169\" \/><\/a><\/p>\n<h1>Different file size but same free space<\/h1>\n<p>As previously stated in the intro to this blog post, proportional fill is based on the amount of free space in each file in relation to the other files and not the actual file sizes themselves.&#160; To demonstrate this, we\u2019ll create a single file database with our table and then load approximately 31MB of data into the table.&#160; Then we\u2019ll increase the size of the first file to 63MB and add three additional files that are 32MB each to the database.<\/p>\n<blockquote>\n<div class=\"csharpcode\">\n<pre class=\"alt\"><span class=\"rem\">-- Delete target files from previous tests<\/span><\/pre>\n<pre><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'show advanced options'<\/span>, 1; <span class=\"kwrd\">RECONFIGURE<\/span>;<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'xp_cmdshell'<\/span>, 1; <span class=\"kwrd\">RECONFIGURE<\/span>; <\/pre>\n<pre><span class=\"kwrd\">EXEC<\/span> xp_cmdshell <span class=\"str\">'DEL C:\\SQLskills\\MultipleDataFiles*'<\/span>;<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'xp_cmdshell'<\/span>, 0; <span class=\"kwrd\">RECONFIGURE<\/span>;<\/pre>\n<pre><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'show advanced options'<\/span>, 0; <span class=\"kwrd\">RECONFIGURE<\/span>;<\/pre>\n<pre class=\"alt\">&#160;<\/pre>\n<pre><span class=\"rem\">-- Drop the test database from the server<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">USE<\/span> [master]<\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">IF<\/span> DB_ID(<span class=\"str\">'MultipleDataFiles'<\/span>) <span class=\"kwrd\">IS<\/span> <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span><\/pre>\n<pre><span class=\"kwrd\">BEGIN<\/span><\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">ALTER<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <span class=\"kwrd\">SET<\/span> SINGLE_USER <span class=\"kwrd\">WITH<\/span> <span class=\"kwrd\">ROLLBACK<\/span> <span class=\"kwrd\">IMMEDIATE<\/span>;<\/pre>\n<pre>    <span class=\"kwrd\">DROP<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles];<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">END<\/span><\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\"><span class=\"rem\">-- Create a single-file database <\/span><\/pre>\n<pre><span class=\"kwrd\">CREATE<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <span class=\"kwrd\">ON<\/span>  <span class=\"kwrd\">PRIMARY<\/span> <\/pre>\n<pre class=\"alt\">( NAME = N<span class=\"str\">'MultipleDataFiles'<\/span>, <\/pre>\n<pre>    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles.mdf'<\/span> , <\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre>    FILEGROWTH = 32768KB ), <\/pre>\n<pre class=\"alt\">FILEGROUP [UserObjects] <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects1'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects1.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 32768KB )<\/pre>\n<pre>LOG <span class=\"kwrd\">ON<\/span> <\/pre>\n<pre class=\"alt\">( NAME = N<span class=\"str\">'MultipleDataFiles_log'<\/span>, <\/pre>\n<pre>    FILENAME = N<span class=\"str\">'L:\\SQLLogs\\MultipleDataFiles_log.ldf'<\/span> , <\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">SIZE<\/span> = 131072KB , <\/pre>\n<pre>    FILEGROWTH = 32768KB )<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<pre><span class=\"kwrd\">ALTER<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">MODIFY<\/span> FILEGROUP [UserObjects] <span class=\"kwrd\">DEFAULT<\/span><\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\">&#160;<\/pre>\n<pre><span class=\"rem\">-- Create a table to load data into for the tests<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">USE<\/span> [MultipleDataFiles]<\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">CREATE<\/span> <span class=\"kwrd\">TABLE<\/span> [dbo].[SalesOrderHeader](<\/pre>\n<pre>    [SalesOrderID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">IDENTITY<\/span>(1,1) <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span> <span class=\"kwrd\">PRIMARY<\/span> <span class=\"kwrd\">KEY<\/span>,<\/pre>\n<pre class=\"alt\">    [RevisionNumber] [tinyint] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [OrderDate] [datetime] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [DueDate] [datetime] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [ShipDate] [datetime] <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [Status] [tinyint] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [OnlineOrderFlag] [<span class=\"kwrd\">bit<\/span>] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [SalesOrderNumber] [nvarchar](25) <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [PurchaseOrderNumber] [nvarchar](25) <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [AccountNumber] [nvarchar](15) <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [CustomerID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [SalesPersonID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [TerritoryID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [BillToAddressID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [ShipToAddressID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [ShipMethodID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [CreditCardID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [CreditCardApprovalCode] [<span class=\"kwrd\">varchar<\/span>](15) <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [CurrencyRateID] [<span class=\"kwrd\">int<\/span>] <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [SubTotal] [money] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [TaxAmt] [money] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [Freight] [money] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [TotalDue] [money] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [Comment] [nvarchar](128) <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre>    [rowguid] [uniqueidentifier] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span>,<\/pre>\n<pre class=\"alt\">    [ModifiedDate] [datetime] <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span><\/pre>\n<pre>) <\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<pre>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"rem\">-- Load ~31MB of data into the test database<\/span><\/pre>\n<pre>INSERT <span class=\"kwrd\">INTO<\/span> dbo.SalesOrderHeader<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">SELECT<\/span> RevisionNumber, <\/pre>\n<pre>    DATEADD(DD, 1126+number, OrderDate), <\/pre>\n<pre class=\"alt\">    DATEADD(DD, 1126+number, DueDate), <\/pre>\n<pre>    DATEADD(DD, 1126+number, ShipDate), <\/pre>\n<pre class=\"alt\">    soh.Status, OnlineOrderFlag, SalesOrderNumber, <\/pre>\n<pre>    PurchaseOrderNumber, AccountNumber, <\/pre>\n<pre class=\"alt\">    CustomerID, SalesPersonID, TerritoryID, <\/pre>\n<pre>    BillToAddressID, ShipToAddressID, <\/pre>\n<pre class=\"alt\">    ShipMethodID, CreditCardID, CreditCardApprovalCode, <\/pre>\n<pre>    CurrencyRateID, SubTotal, TaxAmt, Freight, <\/pre>\n<pre class=\"alt\">    TotalDue, Comment, rowguid, <\/pre>\n<pre>    DATEADD(DD, 1126+number, ModifiedDate)<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">FROM<\/span> AdventureWorks2008R2.Sales.SalesOrderHeader <span class=\"kwrd\">AS<\/span> soh<\/pre>\n<pre><span class=\"kwrd\">CROSS<\/span> <span class=\"kwrd\">JOIN<\/span> master.dbo.spt_values <span class=\"kwrd\">AS<\/span> sv<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">WHERE<\/span> sv.type = N<span class=\"str\">'P'<\/span><\/pre>\n<pre>  <span class=\"kwrd\">AND<\/span> sv.number &gt; 0 <span class=\"kwrd\">AND<\/span> sv.number &lt; 6<\/pre>\n<pre class=\"alt\">&#160;<\/pre>\n<pre><span class=\"rem\">-- Grow the first data file to 63MB leaving 32MB free space<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">ALTER<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <\/pre>\n<pre><span class=\"kwrd\">MODIFY<\/span> <span class=\"kwrd\">FILE<\/span> (    NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects1'<\/span>, <\/pre>\n<pre class=\"alt\">                <span class=\"kwrd\">SIZE<\/span> = 64512KB )<\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\">&#160;<\/pre>\n<pre><span class=\"rem\">-- Add second file with 32MB size<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">ALTER<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <\/pre>\n<pre><span class=\"kwrd\">ADD<\/span> <span class=\"kwrd\">FILE<\/span> (    NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects2'<\/span>, <\/pre>\n<pre class=\"alt\">            FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects2.ndf'<\/span> , <\/pre>\n<pre>            <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre class=\"alt\">            FILEGROWTH = 32768KB ) <\/pre>\n<pre><span class=\"kwrd\">TO<\/span> FILEGROUP [UserObjects]<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<pre>&#160;<\/pre>\n<pre class=\"alt\"><span class=\"rem\">-- Add third file with 32MB size<\/span><\/pre>\n<pre><span class=\"kwrd\">ALTER<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">ADD<\/span> <span class=\"kwrd\">FILE<\/span> (    NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects3'<\/span>, <\/pre>\n<pre>            FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects3.ndf'<\/span> , <\/pre>\n<pre class=\"alt\">            <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre>            FILEGROWTH = 32768KB ) <\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">TO<\/span> FILEGROUP [UserObjects]<\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\">&#160;<\/pre>\n<pre><span class=\"rem\">-- Add fourth file with 32MB size<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">ALTER<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <\/pre>\n<pre><span class=\"kwrd\">ADD<\/span> <span class=\"kwrd\">FILE<\/span> (    NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects4'<\/span>, <\/pre>\n<pre class=\"alt\">            FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects4.ndf'<\/span> , <\/pre>\n<pre>            <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre class=\"alt\">            FILEGROWTH = 32768KB ) <\/pre>\n<pre><span class=\"kwrd\">TO<\/span> FILEGROUP [UserObjects]<\/pre>\n<pre class=\"alt\">GO<\/pre>\n<\/p><\/div>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<\/blockquote>\n<p>With new database setup, the exact same test from the first demo can be run to view how proportional fill functions with one data file larger than the others, but with the same free space.<\/p>\n<p><a href=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/459acb5f\/image.png\"><img decoding=\"async\" style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/04f87ef0\/image_thumb.png\" width=\"383\" height=\"171\" \/><\/a><\/p>\n<h1>The impact of different free space amounts<\/h1>\n<p>Since proportional fill is free space based, lets look at the impact that having different free space in one file has to the writes that occur.&#160; To setup this test, the database will be created with one file sized at 64MB and remaining files sized at 32MB.<\/p>\n<blockquote>\n<div class=\"csharpcode\">\n<pre class=\"alt\"><span class=\"rem\">-- Delete target files from previous tests<\/span><\/pre>\n<pre><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'show advanced options'<\/span>, 1; <span class=\"kwrd\">RECONFIGURE<\/span>;<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'xp_cmdshell'<\/span>, 1; <span class=\"kwrd\">RECONFIGURE<\/span>; <\/pre>\n<pre><span class=\"kwrd\">EXEC<\/span> xp_cmdshell <span class=\"str\">'DEL C:\\SQLskills\\MultipleDataFiles*'<\/span>;<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'xp_cmdshell'<\/span>, 0; <span class=\"kwrd\">RECONFIGURE<\/span>;<\/pre>\n<pre><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'show advanced options'<\/span>, 0; <span class=\"kwrd\">RECONFIGURE<\/span>;<\/pre>\n<pre class=\"alt\">&#160;<\/pre>\n<pre><span class=\"rem\">-- Drop the database from the server<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">USE<\/span> [master]<\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">IF<\/span> DB_ID(<span class=\"str\">'MultipleDataFiles'<\/span>) <span class=\"kwrd\">IS<\/span> <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span><\/pre>\n<pre><span class=\"kwrd\">BEGIN<\/span><\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">ALTER<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <span class=\"kwrd\">SET<\/span> SINGLE_USER <span class=\"kwrd\">WITH<\/span> <span class=\"kwrd\">ROLLBACK<\/span> <span class=\"kwrd\">IMMEDIATE<\/span>;<\/pre>\n<pre>    <span class=\"kwrd\">DROP<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles];<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">END<\/span><\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\"><span class=\"rem\">-- Create a multi-file database with one file larger than the others<\/span><\/pre>\n<pre><span class=\"kwrd\">CREATE<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <span class=\"kwrd\">ON<\/span>  <span class=\"kwrd\">PRIMARY<\/span> <\/pre>\n<pre class=\"alt\">( NAME = N<span class=\"str\">'MultipleDataFiles'<\/span>, <\/pre>\n<pre>    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles.mdf'<\/span> , <\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre>    FILEGROWTH = 32768KB ), <\/pre>\n<pre class=\"alt\">FILEGROUP [UserObjects] <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects1'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects1.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 65536KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 32768KB ), <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects2'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects2.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 32768KB ), <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects3'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects3.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 32768KB ), <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects4'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects4.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 32768KB )<\/pre>\n<pre> LOG <span class=\"kwrd\">ON<\/span> <\/pre>\n<pre class=\"alt\">( NAME = N<span class=\"str\">'MultipleDataFiles_log'<\/span>, <\/pre>\n<pre>    FILENAME = N<span class=\"str\">'L:\\SQLLogs\\MultipleDataFiles_log.ldf'<\/span> , <\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">SIZE<\/span> = 131072KB , <\/pre>\n<pre>    FILEGROWTH = 32768KB )<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<pre><span class=\"kwrd\">ALTER<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">MODIFY<\/span> FILEGROUP [UserObjects] <span class=\"kwrd\">DEFAULT<\/span><\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<\/p><\/div>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<\/blockquote>\n<p>The exact same test can be rerun and when the event data is parsed, the 64MB file will show roughly twice as many write operations and pages as the 32MB files, right in proportion to its free space.<\/p>\n<p>&#160; <a href=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/0e249464\/image.png\"><img decoding=\"async\" style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/4d8247f4\/image_thumb.png\" width=\"383\" height=\"171\" \/><\/a><\/p>\n<h1>The impact of autogrowth<\/h1>\n<p>One question I had after beginning to look at this was, what impact autogrowth would have on data files that were evenly sized, and using the same sizes for autogrowth? We could easily test this by upping the number of executions for our insert operation from the original test to force the database to grow, but I was really interested in the impact over repeated growth operations, and being impatient I wasn\u2019t really willing to wait for large insert operations to complete.&#160; I instead went back a recreated the database using 8MB data files set to grow by 8MB.&#160; Then I changed the GO 3 batch terminator for the INSERT in the test to a GO 5 to retest the impact of autogrowth.<\/p>\n<blockquote>\n<div class=\"csharpcode\">\n<pre class=\"alt\"><span class=\"rem\">-- Delete target files from previous tests<\/span><\/pre>\n<pre><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'show advanced options'<\/span>, 1; <span class=\"kwrd\">RECONFIGURE<\/span>;<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'xp_cmdshell'<\/span>, 1; <span class=\"kwrd\">RECONFIGURE<\/span>; <\/pre>\n<pre><span class=\"kwrd\">EXEC<\/span> xp_cmdshell <span class=\"str\">'DEL C:\\SQLskills\\MultipleDataFiles*'<\/span>;<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'xp_cmdshell'<\/span>, 0; <span class=\"kwrd\">RECONFIGURE<\/span>;<\/pre>\n<pre><span class=\"kwrd\">EXECUTE<\/span> sp_configure <span class=\"str\">'show advanced options'<\/span>, 0; <span class=\"kwrd\">RECONFIGURE<\/span>;<\/pre>\n<pre class=\"alt\">&#160;<\/pre>\n<pre><span class=\"rem\">-- Drop the database from the server<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">USE<\/span> [master]<\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">IF<\/span> DB_ID(<span class=\"str\">'MultipleDataFiles'<\/span>) <span class=\"kwrd\">IS<\/span> <span class=\"kwrd\">NOT<\/span> <span class=\"kwrd\">NULL<\/span><\/pre>\n<pre><span class=\"kwrd\">BEGIN<\/span><\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">ALTER<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <span class=\"kwrd\">SET<\/span> SINGLE_USER <span class=\"kwrd\">WITH<\/span> <span class=\"kwrd\">ROLLBACK<\/span> <span class=\"kwrd\">IMMEDIATE<\/span>;<\/pre>\n<pre>    <span class=\"kwrd\">DROP<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles];<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">END<\/span><\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<pre class=\"alt\"><span class=\"rem\">-- Create a multi-file database with one file larger than the others<\/span><\/pre>\n<pre><span class=\"kwrd\">CREATE<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <span class=\"kwrd\">ON<\/span>  <span class=\"kwrd\">PRIMARY<\/span> <\/pre>\n<pre class=\"alt\">( NAME = N<span class=\"str\">'MultipleDataFiles'<\/span>, <\/pre>\n<pre>    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles.mdf'<\/span> , <\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">SIZE<\/span> = 32768KB , <\/pre>\n<pre>    FILEGROWTH = 32768KB ), <\/pre>\n<pre class=\"alt\">FILEGROUP [UserObjects] <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects1'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects1.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 8192KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 8192KB ), <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects2'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects2.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 8192KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 8192KB ), <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects3'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects3.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 8192KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 8192KB ), <\/pre>\n<pre>( NAME = N<span class=\"str\">'MultipleDataFiles_UserObjects4'<\/span>, <\/pre>\n<pre class=\"alt\">    FILENAME = N<span class=\"str\">'H:\\SQLData\\MultipleDataFiles_UserObjects4.ndf'<\/span> , <\/pre>\n<pre>    <span class=\"kwrd\">SIZE<\/span> = 8192KB , <\/pre>\n<pre class=\"alt\">    FILEGROWTH = 8192KB )<\/pre>\n<pre> LOG <span class=\"kwrd\">ON<\/span> <\/pre>\n<pre class=\"alt\">( NAME = N<span class=\"str\">'MultipleDataFiles_log'<\/span>, <\/pre>\n<pre>    FILENAME = N<span class=\"str\">'L:\\SQLLogs\\MultipleDataFiles_log.ldf'<\/span> , <\/pre>\n<pre class=\"alt\">    <span class=\"kwrd\">SIZE<\/span> = 131072KB , <\/pre>\n<pre>    FILEGROWTH = 32768KB )<\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">GO<\/span><\/pre>\n<pre><span class=\"kwrd\">ALTER<\/span> <span class=\"kwrd\">DATABASE<\/span> [MultipleDataFiles] <\/pre>\n<pre class=\"alt\"><span class=\"kwrd\">MODIFY<\/span> FILEGROUP [UserObjects] <span class=\"kwrd\">DEFAULT<\/span><\/pre>\n<pre><span class=\"kwrd\">GO<\/span><\/pre>\n<\/p><\/div>\n<style type=\"text\/css\">\n.csharpcode, .csharpcode pre\n{\n\tfont-size: small;\n\tcolor: black;\n\tfont-family: consolas, \"Courier New\", courier, monospace;\n\tbackground-color: #ffffff;\n\t\/*white-space: pre;*\/\n}\n.csharpcode pre { margin: 0em; }\n.csharpcode .rem { color: #008000; }\n.csharpcode .kwrd { color: #0000ff; }\n.csharpcode .str { color: #006080; }\n.csharpcode .op { color: #0000c0; }\n.csharpcode .preproc { color: #cc6633; }\n.csharpcode .asp { background-color: #ffff00; }\n.csharpcode .html { color: #800000; }\n.csharpcode .attr { color: #ff0000; }\n.csharpcode .alt \n{\n\tbackground-color: #f4f4f4;\n\twidth: 100%;\n\tmargin: 0em;\n}\n.csharpcode .lnum { color: #606060; }<\/style>\n<\/blockquote>\n<p>The outcome of the autogrowth tests at five iterations for the INSERT batch seemed odd to me because one of the files was lagging the other three significantly.<\/p>\n<p><a href=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/0cdffb85\/image.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/4c3daf15\/image_thumb.png\" width=\"383\" height=\"169\" \/><\/a><\/p>\n<p>I wasn\u2019t satisfied with the initial results of a couple of iterations with five batch executions for the INSERT so I decided to validate the results at various scales including ten, twenty and fifty iterations of the INSERT operation.<\/p>\n<p align=\"center\"><strong>Using GO 10<\/strong><\/p>\n<p align=\"center\"><a href=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/568ed375\/image.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/2ade0979\/image_thumb.png\" width=\"381\" height=\"169\" \/><\/a><\/p>\n<p align=\"center\"><strong>Using GO 20<\/strong><\/p>\n<p align=\"center\"><a href=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/352f2dd9\/image.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/748ce169\/image_thumb.png\" width=\"381\" height=\"168\" \/><\/a><\/p>\n<p align=\"center\"><strong>Using GO 50<\/strong><\/p>\n<p align=\"center\"><a href=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/13cf883d\/image.png\"><img loading=\"lazy\" decoding=\"async\" style=\"background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px\" title=\"image\" border=\"0\" alt=\"image\" src=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/681ebe40\/image_thumb.png\" width=\"381\" height=\"171\" \/><\/a><\/p>\n<p>At the end of each of these series of tests, the files were always within a single autogrowth size of each other, so it is obvious that proportional fill is keeping things relatively equal throughout the tests, but there is the potential for hot spotting of a single data file when auto grow occurs, at least until the other data files grow as well.&#160; In this test the auto grow numbers were kept small, primarily due to storage limitations on the SSD in my laptop, and in the configuration of the VM I was working on, but I am definitely going to make it a point to test this again at a later date using larger autogrowth numbers to see what the impact is longer term and whether the hot spots caused by autogrowth can impact performance significantly?&#160; I have always espoused manual file size management, even in large environments so that certain factors like a filegroup with multiple files can be addressed at the same time.<\/p>\n<p>So there you have it, evidence of how proportional fill functions inside of SQL Server.&#160; Hope you found it interesting.<\/p>\n<p>See you on the playground!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>At SQL Connections, I presented a session titled \u201cLearn SQL Server Internals with Extended Events\u201d where I demonstrated a number ways to use Extended Events to learn about the internal workings of the database engine for SQL Server.&#160; The morning of the session I was chatting with someone about a problem they had seen and [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,27,38,40],"tags":[],"class_list":["post-527","post","type-post","status-publish","format-standard","hentry","category-extended-events","category-internals","category-sql-server-2008","category-sql-server-denali"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Looking at multiple data files and proportional fill with Extended Events - Jonathan Kehayias<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Looking at multiple data files and proportional fill with Extended Events - Jonathan Kehayias\" \/>\n<meta property=\"og:description\" content=\"At SQL Connections, I presented a session titled \u201cLearn SQL Server Internals with Extended Events\u201d where I demonstrated a number ways to use Extended Events to learn about the internal workings of the database engine for SQL Server.&#160; The morning of the session I was chatting with someone about a problem they had seen and [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/\" \/>\n<meta property=\"og:site_name\" content=\"Jonathan Kehayias\" \/>\n<meta property=\"article:published_time\" content=\"2011-04-18T13:24:46+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-04-13T16:18:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/063d17cf\/image_thumb.png\" \/>\n<meta name=\"author\" content=\"Jonathan Kehayias\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jonathan Kehayias\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"16 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/\"},\"author\":{\"name\":\"Jonathan Kehayias\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#\\\/schema\\\/person\\\/01c10d94f3648654ef706d5e6305f69c\"},\"headline\":\"Looking at multiple data files and proportional fill with Extended Events\",\"datePublished\":\"2011-04-18T13:24:46+00:00\",\"dateModified\":\"2017-04-13T16:18:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/\"},\"wordCount\":1423,\"commentCount\":1,\"image\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.SQLskills.com\\\/blogs\\\/jonathan\\\/wp-content\\\/uploads\\\/windows-live-writer\\\/looking-at-multiple-data-files-and-propo\\\/063d17cf\\\/image_thumb.png\",\"articleSection\":[\"Extended Events\",\"Internals\",\"SQL Server 2008\",\"SQL Server Denali\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/\",\"url\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/\",\"name\":\"Looking at multiple data files and proportional fill with Extended Events - Jonathan Kehayias\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.SQLskills.com\\\/blogs\\\/jonathan\\\/wp-content\\\/uploads\\\/windows-live-writer\\\/looking-at-multiple-data-files-and-propo\\\/063d17cf\\\/image_thumb.png\",\"datePublished\":\"2011-04-18T13:24:46+00:00\",\"dateModified\":\"2017-04-13T16:18:21+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#\\\/schema\\\/person\\\/01c10d94f3648654ef706d5e6305f69c\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.SQLskills.com\\\/blogs\\\/jonathan\\\/wp-content\\\/uploads\\\/windows-live-writer\\\/looking-at-multiple-data-files-and-propo\\\/063d17cf\\\/image_thumb.png\",\"contentUrl\":\"https:\\\/\\\/www.SQLskills.com\\\/blogs\\\/jonathan\\\/wp-content\\\/uploads\\\/windows-live-writer\\\/looking-at-multiple-data-files-and-propo\\\/063d17cf\\\/image_thumb.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Extended Events\",\"item\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/category\\\/extended-events\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Looking at multiple data files and proportional fill with Extended Events\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#website\",\"url\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/\",\"name\":\"Jonathan Kehayias - The Rambling DBA\",\"description\":\"The Rambling DBA\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.sqlskills.com\\\/blogs\\\/jonathan\\\/#\\\/schema\\\/person\\\/01c10d94f3648654ef706d5e6305f69c\",\"name\":\"Jonathan Kehayias\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g\",\"caption\":\"Jonathan Kehayias\"},\"sameAs\":[\"http:\\\/\\\/3.209.169.194\\\/blogs\\\/jonathan\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Looking at multiple data files and proportional fill with Extended Events - Jonathan Kehayias","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/","og_locale":"en_US","og_type":"article","og_title":"Looking at multiple data files and proportional fill with Extended Events - Jonathan Kehayias","og_description":"At SQL Connections, I presented a session titled \u201cLearn SQL Server Internals with Extended Events\u201d where I demonstrated a number ways to use Extended Events to learn about the internal workings of the database engine for SQL Server.&#160; The morning of the session I was chatting with someone about a problem they had seen and [&hellip;]","og_url":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/","og_site_name":"Jonathan Kehayias","article_published_time":"2011-04-18T13:24:46+00:00","article_modified_time":"2017-04-13T16:18:21+00:00","og_image":[{"url":"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/063d17cf\/image_thumb.png","type":"","width":"","height":""}],"author":"Jonathan Kehayias","twitter_misc":{"Written by":"Jonathan Kehayias","Est. reading time":"16 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/#article","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/"},"author":{"name":"Jonathan Kehayias","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#\/schema\/person\/01c10d94f3648654ef706d5e6305f69c"},"headline":"Looking at multiple data files and proportional fill with Extended Events","datePublished":"2011-04-18T13:24:46+00:00","dateModified":"2017-04-13T16:18:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/"},"wordCount":1423,"commentCount":1,"image":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/#primaryimage"},"thumbnailUrl":"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/063d17cf\/image_thumb.png","articleSection":["Extended Events","Internals","SQL Server 2008","SQL Server Denali"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/","url":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/","name":"Looking at multiple data files and proportional fill with Extended Events - Jonathan Kehayias","isPartOf":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/#primaryimage"},"image":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/#primaryimage"},"thumbnailUrl":"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/063d17cf\/image_thumb.png","datePublished":"2011-04-18T13:24:46+00:00","dateModified":"2017-04-13T16:18:21+00:00","author":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#\/schema\/person\/01c10d94f3648654ef706d5e6305f69c"},"breadcrumb":{"@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/#primaryimage","url":"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/063d17cf\/image_thumb.png","contentUrl":"https:\/\/www.SQLskills.com\/blogs\/jonathan\/wp-content\/uploads\/windows-live-writer\/looking-at-multiple-data-files-and-propo\/063d17cf\/image_thumb.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/looking-at-multiple-data-files-and-proportional-fill-with-extended-events\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/"},{"@type":"ListItem","position":2,"name":"Extended Events","item":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/category\/extended-events\/"},{"@type":"ListItem","position":3,"name":"Looking at multiple data files and proportional fill with Extended Events"}]},{"@type":"WebSite","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#website","url":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/","name":"Jonathan Kehayias - The Rambling DBA","description":"The Rambling DBA","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/#\/schema\/person\/01c10d94f3648654ef706d5e6305f69c","name":"Jonathan Kehayias","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/86630e27f5deecc5c393ea57fc7c3b6a068949f4fd6b5309f81de5a276f12855?s=96&d=mm&r=g","caption":"Jonathan Kehayias"},"sameAs":["http:\/\/3.209.169.194\/blogs\/jonathan"]}]}},"_links":{"self":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/posts\/527","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/comments?post=527"}],"version-history":[{"count":0,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/posts\/527\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/media?parent=527"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/categories?post=527"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sqlskills.com\/blogs\/jonathan\/wp-json\/wp\/v2\/tags?post=527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}