<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Azure SQL Data Warehouse</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/sqldw/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/sqldw/feed.xml</link>
    <description>Fast, flexible, and secure analytics platform for the enterprise</description>
    <lastBuildDate>Tue, 16 Apr 2019 05:31:08 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>SQL Data Warehouse and Non-Clustered Indexes</title>
      <link>https://docs.microsoft.com/archive/blogs/sqldw/sql-data-warehouse-and-non-clustered-indexes</link>
      <pubDate>Wed, 04 Apr 2018 22:47:02 GMT</pubDate>
      <dc:creator><![CDATA[Ellis Hiroki [MSFT]]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sqldw/?p=425</guid>
      <description><![CDATA[One performance optimization that is often over looked in SQL Data Warehouse (SQL DW) is the use of...]]></description>
      <content:encoded><![CDATA[One performance optimization that is often over looked in SQL Data Warehouse (SQL DW) is the use of non-clustered indexes (NCI) on tables with a clustered columnstore index (CCI). Clustered columnstore enhances the general performance benefits that RDBM systems bring to set based operations. Great value is derived from being able to apply set based operators on large amounts of data in parallel. However, not all operations in a workload are set based.

Massively parallel processing (MPP) systems like SQL DW generally provide enhanced scan rates due to parallelization of work across partitioned data, which in turn allows you to find specific rows very quickly. At a given number of nodes, as table sizes grow, the length of time to locate specific rows in your data grows linearly with the number of rows in the table. If the performance of lookups appears to increase with your table size at your performance level, you may find that adding a non-clustered index  will improve your seek operations (lookups) on certain IDs in your fact tables, such as looking up records of a single employee or order etc.

As an example, one of the more expensive operations in a database can be a delete operation. Your table type, the amount of data you’re deleting, and the amount of rows you’re deleting can all influence the amount of time a delete operation takes. As a rule of thumb, if you’re deleting from a high-cardinality column on a large table where a value represents less than 5% of the total table size, consider putting . Because NCIs can impact load performance on a table, consider performing table cleanup with a maintenance schedule such as monthly where you create an NCI, perform your delete operations, and then drop the index.

Delete operations generally should not be used to remove large amounts of data from a table. In this case, creating a new table with CTAS is more performant.

As an example, consider this taxi trip table:

[code language="sql"]
CREATE TABLE [dbo].[Trips2013]
(
	[DateID] [int] NOT NULL
,	[MedallionID] [int] NOT NULL
,	[HackneyLicenseID] [int] NOT NULL
,	[PickupTimeID] [int] NOT NULL
,	[DropoffTimeID] [int] NOT NULL
,	[PickupGeographyID] [int] NULL
,	[DropoffGeographyID] [int] NULL
,	[PickupLatitude] [float] NULL
,	[PickupLongitude] [float] NULL
,	[PickupLatLong] [varchar](50) NULL
,	[DropoffLatitude] [float] NULL
,	[DropoffLongitude] [float] NULL
,	[DropoffLatLong] [varchar](50) NULL
,	[PassengerCount] [int] NULL
,	[TripDurationSeconds] [int] NULL
,	[TripDistanceMiles] [float] NULL
,	[PaymentType] [varchar](50) NULL
,	[FareAmount] [money] NULL
,	[SurchargeAmount] [money] NULL
,	[TaxAmount] [money] NULL
,	[TipAmount] [money] NULL
,	[TollsAmount] [money] NULL
,	[TotalAmount] [money] NULL
)
[/code]

This table has 170,261,328 rows. If we look at the distribution of MedallionID, there are 13,688 different MedallionIDs, each with less than 1 percent of the total record set.

[code language="sql"]
DECLARE @Total FLOAT = (SELECT COUNT_BIG(*) FROM [dbo].[Trips2013])

SELECT  COUNT(*)            AS NumRecords
,       CAST(COUNT(*)/@Total AS DECIMAL(5,4))     AS PercentOfTotal
,       [MedallionID] 
FROM dbo.Trips2013 
GROUP BY [MedallionID]
ORDER BY COUNT(*) DESC
[/code]

<img src="https://msdnshared.blob.core.windows.net/media/2018/04/RecordDistribution-300x224.png" alt="" width="300" height="224" class="alignnone wp-image-505 size-medium" />

Let’s examine the delete performance to delete records where MedallionID is 11080. We’ll test the performance of CCI and HEAP tables, with and without NCI.

Here are the corresponding DML statements:

[code language="sql"]
-- CCI NO NCI
IF OBJECT_ID('CCI_DELETE', 'U') IS NOT NULL DROP TABLE CCI_DELETE
CREATE TABLE CCI_DELETE
WITH
(
	DISTRIBUTION = ROUND_ROBIN,
	CLUSTERED COLUMNSTORE INDEX
)
AS SELECT * FROM [dbo].[Trips2013]
OPTION (label = 'Creating CCI_DELETE table')

-- CCI WITH NCI
IF OBJECT_ID('CCI_NCI_DELETE', 'U') IS NOT NULL DROP TABLE CCI_NCI_DELETE
CREATE TABLE CCI_NCI_DELETE
WITH
(
	DISTRIBUTION = ROUND_ROBIN,
	CLUSTERED COLUMNSTORE INDEX
)
AS SELECT * FROM [dbo].[Trips2013]
OPTION (label = 'Creating CCI_NCI_DELETE table')

CREATE NONCLUSTERED INDEX CCI_NCI_DELETE_index ON CCI_NCI_DELETE([MedallionId])

-- HEAP NO NCI
IF OBJECT_ID('HEAP_DELETE', 'U') IS NOT NULL DROP TABLE HEAP_DELETE
CREATE TABLE HEAP_DELETE
WITH
(
	DISTRIBUTION = ROUND_ROBIN,
	HEAP
)
AS SELECT * FROM [dbo].[Trips2013]
OPTION (label = 'Creating HEAP_DELETE table')

-- HEAP WITH NCI
IF OBJECT_ID('HEAP_NCI_DELETE', 'U') IS NOT NULL DROP TABLE HEAP_NCI_DELETE
CREATE TABLE HEAP_NCI_DELETE
WITH
(
	DISTRIBUTION = ROUND_ROBIN,
	HEAP
)
AS SELECT * FROM [dbo].[Trips2013]
OPTION (label = 'Creating HEAP_NCI_DELETE table')

CREATE NONCLUSTERED INDEX HEAP_NCI_DELETE_index ON HEAP_NCI_DELETE([MedallionId])

-- CI NO NCI
IF OBJECT_ID('CI_DELETE', 'U') IS NOT NULL DROP TABLE CI_DELETE
CREATE TABLE CI_DELETE
WITH
(
	DISTRIBUTION = ROUND_ROBIN,
	CLUSTERED INDEX (DateID ASC) 
)
AS SELECT * FROM [dbo].[Trips2013]
OPTION (label = 'Creating CI_DELETE table')

-- CI WITH NCI
IF OBJECT_ID('CI_NCI_DELETE', 'U') IS NOT NULL DROP TABLE CI_NCI_DELETE
CREATE TABLE CI_NCI_DELETE
WITH
(
	DISTRIBUTION = ROUND_ROBIN,
	CLUSTERED INDEX (DateID ASC) 
)
AS SELECT * FROM [dbo].[Trips2013]
OPTION (label = 'Creating CI_NCI_DELETE table')

CREATE NONCLUSTERED INDEX CI_NCI_DELETE_index ON CI_NCI_DELETE([MedallionId])

-- DELETE FROM CCI NO NCI
DELETE  FROM CCI_DELETE
WHERE   MedallionId = 11080
OPTION (label = 'DELETE CCI NO NCI')

-- DELETE FROM CCI WITH NCI
DELETE  FROM CCI_NCI_DELETE
WHERE   MedallionId = 11080
OPTION (label = 'DELETE CCI WITH NCI')

-- DELETE FROM HEAP NO NCI
DELETE  FROM HEAP_DELETE
WHERE   MedallionId = 11080
OPTION (label = 'DELETE HEAP NO NCI')

-- DELETE FROM HEAP WITH NCI
DELETE  FROM HEAP_NCI_DELETE
WHERE   MedallionId = 11080
OPTION (label = 'DELETE HEAP WITH NCI')

-- DELETE FROM CCI NO NCI
DELETE  FROM CI_DELETE
WHERE   MedallionId = 11080
OPTION (label = 'DELETE CI NO NCI')

-- DELETE FROM CCI NO NCI
DELETE  FROM CI_NCI_DELETE
WHERE   MedallionId = 11080
OPTION (label = 'DELETE CI WITH NCI')

-- OVERALL
SELECT  AVG(DATEDIFF(millisecond, start_time, end_time)) AS avg_duration
,       [label]
FROM    sys.dm_pdw_exec_requests
WHERE   [label] = 'DELETE CCI NO NCI'
OR      [label] = 'DELETE CCI WITH NCI'
OR      [label] = 'DELETE HEAP NO NCI'
OR      [label] = 'DELETE HEAP WITH NCI'
OR      [label] = 'DELETE CI NO NCI'
OR      [label] = 'DELETE CI WITH NCI'
GROUP BY [label]
ORDER BY avg_duration DESC

[/code]

What we would expect to have happen here is that a table with NCI would perform deletes faster. Why is this? In the absence of an NCI, each of the SQL Server compute nodes will have to completely scan each distribution table of dbo.Trips2013 where MedallionID = 11080. With columnstore, there is some benefit of segment elimination, but without tight boundaries on segment min and max values, SQL Server will have to end up scanning most of the columnstore segments.

An NCI on top of your CCI provides pointers to the physical row locations. As long we’re not deleting large numbers of consecutive records, this physical pointer should enable us to find the columnstore segments that contain rows that match our delete predicate faster than scanning all segments.

<img src="https://msdnshared.blob.core.windows.net/media/2018/04/DurationByTableIndex.png" alt="" width="291" height="148" class="alignnone wp-image-495 size-full" />

Running these statements 10 times on DW1000, as we would expect, our average time demonstrates that having NCI for targeted lookups is indeed more performant for deletes than without an NCI. Bear in mind, these tests were run with round robin distributions. Hashing on a specific column may yield differences in performance due to data skew and where the deleted rows ultimately end up.

If you would like to try this for yourself, I used the 2013 New York taxi cab data that’s hosted publicly by the SQL Data Warehouse team which you can download following instructions here: <a href="https://docs.microsoft.com/en-us/azure/sql-data-warehouse/load-data-from-azure-blob-storage-using-polybase">https://docs.microsoft.com/en-us/azure/sql-data-warehouse/load-data-from-azure-blob-storage-using-polybase</a>.]]></content:encoded>
    </item>
    <item>
      <title>How many queries and slots are running in my Azure SQL Data Warehouse?</title>
      <link>https://docs.microsoft.com/archive/blogs/sqldw/how-many-queries-and-slots-are-running-in-my-azure-sql-data-warehouse</link>
      <pubDate>Thu, 08 Mar 2018 22:35:57 GMT</pubDate>
      <dc:creator><![CDATA[Matt Usher (MSFT)]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sqldw/?p=395</guid>
      <description><![CDATA[Azure SQL Data Warehouse allows you to manage your workload using resource classes and concurrency...]]></description>
      <content:encoded><![CDATA[Azure SQL Data Warehouse allows you to manage your workload using resource classes and concurrency slots for query execution. In the previous blog, <a target="_blank" href="https://blogs.msdn.microsoft.com/sqldw/2018/03/07/checking-for-queued-queries/" rel="noopener">Checking for Queued Queries</a>, we showed you how to check to see if your query was queued and awaiting execution. That's great to know why your query hasn't started executing yet but what if you want to know what <em>is</em> running in your data warehouse. There is a very simple way to do this via T-SQL - just query the <a target="_blank" href="https://docs.microsoft.com/sql/relational-databases/system-dynamic-management-views/sys-dm-pdw-exec-requests-transact-sql" rel="noopener">sys.dm_pdw_exec_requests</a> and <a target="_blank" href="https://docs.microsoft.com/sql/relational-databases/system-dynamic-management-views/sys-dm-pdw-resource-waits-transact-sql" rel="noopener">sys.dm_pdw_resource_waits</a> views.

Using these two views, we can get a sense of the running queries from the <em>dm_pdw_exec_requests</em> view and then merge that with any queued information from the <em>dm_pdw_resource_waits</em> view. Using the <a target="_blank" href="https://github.com/Microsoft/sql-data-warehouse-samples/blob/master/samples/scripts/monitor/concurrency/running_queued_queries_slots.sql" rel="noopener">running_queued_queries_slots T-SQL script</a>, we can see the number of running queries, how many concurrency slots those queries are taking, the number of queued queries and how many slots the queued queries will need.
<pre><span style="font-family: 'Courier New', Courier;font-size: small"><span style="color: #0000ff">SELECT</span>
 <span style="color: #FF34FF">SUM</span>(<span style="color: #0000ff">CASE WHEN</span> r.[status] = <span style="color: #FF0034">'Running'</span> <span style="color: #0000ff">THEN</span> 1 <span style="color: #0000ff">ELSE</span> 0 <span style="color: #0000ff">END</span>) [running_queries],
 <span style="color: #FF34FF">SUM</span>(<span style="color: #0000ff">CASE WHEN</span> r.[status] = <span style="color: #FF0034">'Running'</span> <span style="color: #0000ff">THEN</span> rw.concurrency_slots_used <span style="color: #0000ff">ELSE</span> 0 <span style="color: #0000ff">END</span>) [running_queries_slots],
 <span style="color: #FF34FF">SUM</span>(<span style="color: #0000ff">CASE WHEN</span> r.[status] = <span style="color: #FF0034">'Suspended'</span> <span style="color: #0000ff">THEN</span> 1 <span style="color: #0000ff">ELSE</span> 0 <span style="color: #0000ff">END</span>) [queued_queries],
 <span style="color: #FF34FF">SUM</span>(<span style="color: #0000ff">CASE WHEN</span> rw.[state] = <span style="color: #FF0034">'Queued'</span> <span style="color: #0000ff">THEN</span> rw.concurrency_slots_used <span style="color: #0000ff">ELSE</span> 0 <span style="color: #0000ff">END</span>) [queued_queries_slots]
<span style="color: #0000ff">FROM</span>
 <span style="color: #008000">sys</span>.<span style="color: #008000">dm_pdw_exec_requests</span> r 
 <span style="color: #808080">JOIN</span> <span style="color: #008000">sys</span>.<span style="color: #008000">dm_pdw_resource_waits</span> rw <span style="color: #0000ff">ON</span> rw.request_id = r.request_id
<span style="color: #0000ff">WHERE</span>
 ( (r.[status] = <span style="color: #FF0034">'Running'</span> <span style="color: #808080">AND</span> r.resource_class <span style="color: #808080">IS NOT NULL</span> ) <span style="color: #808080">OR</span> r.[status] =<span style="color: #FF0034">'Suspended'</span> )
 <span style="color: #808080">AND</span> rw.[type] = <span style="color: #FF0034">'UserConcurrencyResourceType'</span><span style="color: #808080">;</span></span></pre>
This query returns four columns:
<ul>
 	<li><em>running_queries</em> - this is the number of queries actively executing in the data warehouse.</li>
 	<li><em>running_queries_slots</em> - this is the number of concurrency slots consumed by the running queries.</li>
 	<li><em>queued_queries</em> - this is the number of queries queued.</li>
 	<li><em>queued_queries_slots</em> - this is the number of concurrency slots requested by the queued queries.</li>
</ul>
<a target="_blank" href="https://msdnshared.blob.core.windows.net/media/2018/03/concurrency_slots.png"><img src="https://msdnshared.blob.core.windows.net/media/2018/03/concurrency_slots-300x64.png" alt="" class="alignnone size-medium wp-image-405" width="300" height="64" /></a>

This example shows 4 running queries each consuming 8 concurrency slots with 6 additional queries each requesting 8 concurrency slots.

<strong>T-SQL for monitoring queries</strong>

SQL Data Warehouse Git Hub repo: <a target="_blank" href="https://github.com/Microsoft/sql-data-warehouse-samples" title="https://github.com/Microsoft/sql-data-warehouse-samples">https://github.com/Microsoft/sql-data-warehouse-samples</a>]]></content:encoded>
    </item>
    <item>
      <title>Checking for queued queries in Azure SQL Data Warehouse</title>
      <link>https://docs.microsoft.com/archive/blogs/sqldw/checking-for-queued-queries</link>
      <pubDate>Wed, 07 Mar 2018 18:48:30 GMT</pubDate>
      <dc:creator><![CDATA[Matt Usher (MSFT)]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sqldw/?p=365</guid>
      <description><![CDATA[Azure SQL Data Warehouse manages query workload through a combination of concurrent query execution...]]></description>
      <content:encoded><![CDATA[ <p><a href="https://aka.ms/sqldw" target="_blank">Azure SQL Data Warehouse</a> manages <a href="https://docs.microsoft.com/azure/sql-data-warehouse/resource-classes-for-workload-management" target="_blank">query workload</a> through a combination of concurrent query execution slots and resources classes. The SQL Data Warehouse workload manager enables you to manage your workload within your data warehouse that are contending for system resources. SQL Data Warehouse defines a set of concurrency slots for query execution. The system manages the resources consumed by each query to ensure proper system balance. You can see the concurrency slots per DWU setting on the <a href="https://docs.microsoft.com/azure/sql-data-warehouse/performance-tiers#concurrency-maximums" target="_blank">Concurrency Maximums article</a>. If you issue enough queries that require system resources from the distributed nodes, SQL Data Warehouse will queue the queries until enough system resources/concurrency slots are available.</p>
    <p>
        <strong>T-SQL for monitoring queries</strong>
    </p>
    <p>
        SQL Data Warehouse Git Hub repo: <a title="https://github.com/Microsoft/sql-data-warehouse-samples" href="https://github.com/Microsoft/sql-data-warehouse-samples">https://github.com/Microsoft/sql-data-warehouse-samples</a>
    </p>
    <p>Using the <a href="https://docs.microsoft.com/sql/relational-databases/system-dynamic-management-views/sys-dm-pdw-resource-waits-transact-sql" target="_blank">sys.dm_pdw_resource_waits</a> view, you can craft a query to see if any query is queued waiting for system resources. Using the sample <a href="https://github.com/Microsoft/sql-data-warehouse-samples/blob/master/samples/scripts/monitor/concurrency/queued_queries.sql" target="_blank">queued_queries T-SQL script</a>, we can see what is waiting for execution. </p>
        <pre>
            <span style="font-family: 'Courier New', Courier;font-size:small">
<span style="color: #0000ff">SELECT</span>
    *
    , [queued_sec] = <span style="color: #B4009E">DATEDIFF</span>(<span style="color: #0000ff">MILLISECOND</span>, request_time, <span style="color: #B4009E">GETDATE()</span>) / 1000.0
<span style="color: #0000ff">FROM</span>
    <span style="color: #339966">sys</span>.<span style="color: #339966">dm_pdw_resource_waits</span>
<span style="color: #0000ff">WHERE</span>
    [state] = <span style="color: #ff0000">'Queued'</span>
<span style="color: #0000ff">ORDER BY</span>
    queued_sec <span style="color: #0000ff">DESC</span>;
</span>
</pre>
<p>The results lists all queries that are queued with the number of concurrency slots requested and the duration of the queue. </p>
<p><a href="https://msdnshared.blob.core.windows.net/media/2018/03/queued.png"><img width="1028" height="79" title="queued" alt="queued" src="https://msdnshared.blob.core.windows.net/media/2018/03/queued_thumb.png" border="0"></a></p>]]></content:encoded>
    </item>
    <item>
      <title>Getting the full explain plan for long queries</title>
      <link>https://docs.microsoft.com/archive/blogs/sqldw/getting-the-full-explain-plan-for-long-queries</link>
      <pubDate>Mon, 12 Feb 2018 20:53:31 GMT</pubDate>
      <dc:creator><![CDATA[Matt Usher (MSFT)]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sqldw/?p=336</guid>
      <description><![CDATA[I was recently debugging a large stored procedure (2000+ lines of code) for a customer. I wanted to...]]></description>
      <content:encoded><![CDATA[I was recently debugging a large stored procedure (2000+ lines of code) for a customer. I wanted to look at the explain plan for a particularly long SELECT statement in the sproc right in the middle for optimal table design. I opened the statement in SSMS, copied in the text, added the <code>EXPLAIN</code> keyword in front, and hit <code>F5</code>. Waited for my results and ....wait a minute, the text is truncated.

You're natural reaction might be to go to the <em>Grid Result</em> options in SSMS and change the values. This won't help as the maximum non-XML result set within SSMS doesn't allow you to see all the data. So what do you do? <a target="_blank" href="https://docs.microsoft.com/en-us/sql/tools/sqlcmd-utility" rel="noopener">SQLCMD </a>to the rescue. You can simply run the statement at the command line and have <em>sqlcmd</em> return the results as a file. The key is the <em>-y</em> and <em>-o</em> parameters. The <em>-y</em> parameter is used to set the variable_length_type_display_width value. The <em>-o</em> parameter is used to specify the output file to write to. If you put these two together with the secret <code>-y 0</code> (to return all of the data), you have magic. An example of how to use this:

<code>sqlcmd.exe -S  -d  -U  -P  -I -y 0 -o explain.txt -Q "EXPLAIN SELECT * FROM table"</code>

If you open the explain.txt file, you'll see the full EXPLAIN plan for the query. ]]></content:encoded>
    </item>
    <item>
      <title>Creating a SQL Data Warehouse user with a specific resource class</title>
      <link>https://docs.microsoft.com/archive/blogs/sqldw/creating-a-sql-data-warehouse-user-with-a-specific-resource-class</link>
      <pubDate>Fri, 22 Sep 2017 17:17:55 GMT</pubDate>
      <dc:creator><![CDATA[Matt Usher (MSFT)]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sqldw/?p=325</guid>
      <description><![CDATA[In your data warehouse, you probably have multiple user groupings that perform different tasks: data...]]></description>
      <content:encoded><![CDATA[In your data warehouse, you probably have multiple user groupings that perform different tasks: data loading; system tasks; querying; transformation and aggregations. Each of these groups has it’s own characteristics that can impact each other – a large data load might need a lot of memory while a user running a dashboard might not. <a target="_blank" href="https://aka.ms/sqldw" rel="noopener noreferrer">Azure SQL Data Warehouse</a> gives you the ability to manage resource utilization via resource classes. In this post, we’re going to add a login and user then adjust the resource class they are in. The steps are:
<ol>
 	<li>Create a server level login</li>
 	<li>Create a database level user</li>
 	<li>Add the user to the resource class</li>
 	<li>[Optional] Grant permissions</li>
</ol>
<h2>Create a Server Level LOGIN</h2>
The first step is to create a LOGIN at the server level (see <a target="_blank" href="https://docs.microsoft.com/en-us/sql/t-sql/statements/create-login-transact-sql" rel="noopener noreferrer">CREATE LOGIN</a>). We will connect to the <strong>master</strong> database on the logical server and create the LOGIN. In this case, I’m using a SQL login (username/password combination) managed by the SQL Server/SQL Data Warehouse services. You can also use Azure Active Directory Connect and Federation to utilize single sign-on from your corporate accounts. See the <a target="_blank" href="https://blogs.msdn.microsoft.com/sqldw/2017/07/28/adding-ad-users-and-security-groups-to-azure-sql-data-warehouse/" rel="noopener noreferrer">Adding AD Users and security Groups to Azure SQL Data Warehouse</a> post to learn more.
<pre><span style="color: #0000ff">CREATE LOGIN</span> cloudsaxl <span style="color: #0000ff">WITH PASSWORD</span> = <span style="color: #ff0000">‘&lt;use a strong password&gt;’</span>;</pre>
<h2>Create a Database Level USER</h2>
The next step is to create a USER at the database level (see <a target="_blank" href="https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql" rel="noopener noreferrer">CREATE USER</a>). We will connect to your SQL Data Warehouse database to execute the statement.
<pre><span style="color: #0000ff">CREATE USER</span> cloudsaxl <span style="color: #0000ff">FOR LOGIN</span> cloudsaxl;</pre>
<h2>Add the User to the XLargeRC resource class</h2>
The third step is to add the user to the resource class (see <a target="_blank" href="https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-develop-concurrency" rel="noopener noreferrer">Concurrency and Resource Classes</a>). We will connect to your SQL Data Warehouse database to execute the statement.
<pre><span style="color: #0000ff">EXEC</span> <span style="color: #800000">sp_addrolemember</span> <span style="color: #ff0000">'xlargerc'</span>, <span style="color: #ff0000">'cloudsaxl'</span>;</pre>
<h2>[Optional] Grant permissions</h2>
Now that the user is available on the server, you can optionally grant permissions to the user based on your workload needs. This could be granting a login for data loading into your data loading group that has read/write permissions or it could be adding a login for a user to have read only access. In the example below, I’m connected to my SQL Data Warehouse instance and am granting my user full permissions to the db_owner role.
<pre><span style="color: #0000ff">EXEC</span> <span style="color: #800000">sp_addrolemember</span> <span style="color: #ff0000">'db_owner'</span>, <span style="color: #ff0000">'cloudsaxl'</span>;</pre>]]></content:encoded>
    </item>
    <item>
      <title>Adding AD Users and Security Groups to Azure SQL Data Warehouse</title>
      <link>https://docs.microsoft.com/archive/blogs/sqldw/adding-ad-users-and-security-groups-to-azure-sql-data-warehouse</link>
      <pubDate>Fri, 28 Jul 2017 21:12:28 GMT</pubDate>
      <dc:creator><![CDATA[Matt Usher (MSFT)]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sqldw/?p=316</guid>
      <description><![CDATA[Azure offers you the ability to federate your corporate Active Directory to the cloud through Azure...]]></description>
      <content:encoded><![CDATA[Azure offers you the ability to federate your corporate Active Directory to the cloud through <a target="_blank" href="https://docs.microsoft.com/en-us/azure/active-directory/connect/active-directory-aadconnectfed-whatis" rel="noopener noreferrer">Azure Active Directory Connect and Federation</a>. The federation to the cloud allows you to authenticate against your <a target="_blank" href="https://aka.ms/sqldw" rel="noopener noreferrer">Azure SQL Data Warehouse</a> instance using your domain credentials. We often are asked how to create a user or security group in SQL DW. This blog will show you the simple steps to create a Windows authenticated user in the cloud.
<h2>Prerequisites</h2>
<ul>
 	<li>You have successfully configured your Azure Active Directory and connected it to SQL Data Warehouse (see the <a target="_blank" href="https://docs.microsoft.com/en-us/azure/sql-database/sql-database-aad-authentication" rel="noopener noreferrer">Use Azure Active Directory Authentication for authentication with SQL Database or SQL Data Warehouse</a> topic for details on configuration).</li>
</ul>
<h2>Creating a User for an individual</h2>
To create a windows user account, simply connect to your SQL Data Warehouse and execute the following script:
<pre><span style="font-family: 'Courier New'"><span style="color: #0000ff">CREATE USER</span> [&lt;alais@domain&gt;] <span style="color: #0000ff">FROM EXTERNAL PROVIDER WITH DEFAULT_SCHEMA <span style="color: #000000">=</span></span> [&lt;schema&gt;];</span></pre>
You simply have to add the user by their alias and domain and optionally set their default schema. If you want to allow <a href="mailto:user@company.com">user@company.com</a> access to the sales schema you would simply execute:
<pre><span style="font-family: 'Courier New'"><span style="color: #0000ff">CREATE USER</span> [user@company.com] <span style="color: #0000ff">FROM EXTERNAL PROVIDER WITH DEFAULT_SCHEMA</span> = [sales];</span></pre>
<h2>Create a User for a security group</h2>
A best practice for managing your database is to use Windows security groups to manage user access. That way you can simply manage the customer at the Security Group level in Active Directory granting appropriate permissions. To add a security group to SQL Data Warehouse, you use the <strong><em>Display Name</em></strong> of the security group as the principal in the <em>CREATE USER</em> statement.
<pre><span style="font-family: 'Courier New'"><span style="color: #0000ff">CREATE USER</span> [&lt;Security Group Display Name&gt;] <span style="color: #0000ff">FROM EXTERNAL PROVIDER WITH DEFAULT_SCHEMA</span> = [&lt;schema&gt;];</span></pre>
In our AD instance, we have a security group called <em>Sales Team</em> with an alias of <em><a href="mailto:salesteam@company.com">salesteam@company.com</a></em>. To add this security group to SQL Data Warehouse you simply run the following statement:
<pre><span style="font-family: 'Courier New'"><span style="color: #0000ff">CREATE USER</span> [Sales Team] <span style="color: #0000ff">FROM EXTERNAL PROVIDER WITH DEFAULT_SCHEMA</span> = [sales];</span></pre>
If you run the statement using the alias, you will get an error that the principal is not found:
<pre><span style="font-family: 'Courier New'"><span style="color: #0000ff">CREATE USER</span> [salesteam@company.com] <span style="color: #0000ff">FROM EXTERNAL PROVIDER WITH DEFAULT_SCHEMA</span> = [sales];</span>

<span style="color: #ff0000;font-family: 'Courier New'">Msg 33130, Level 16, State 1, Line 4
Principal 'salesteam@company.com' could not be found or this principal type is not supported.</span></pre>]]></content:encoded>
    </item>
    <item>
      <title>Enabling TDE for Azure SQL Data Warehouse</title>
      <link>https://docs.microsoft.com/archive/blogs/sqldw/enabling-tde-for-azure-sql-data-warehouse</link>
      <pubDate>Wed, 27 Jul 2016 08:55:19 GMT</pubDate>
      <dc:creator><![CDATA[musher]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sqldw/?p=55</guid>
      <description><![CDATA[Security is top of mind for everyone these days - securing your identity, securing your data. When...]]></description>
      <content:encoded><![CDATA[Security is top of mind for everyone these days - securing your identity, securing your data. When you think about how you secure your data in the cloud you need to ensure that you understand how your data is stored and accessed. The <a href="https://aka.ms/sqldw" target="_blank">Azure SQL Data Warehouse</a> service utilizes <a href="https://msdn.microsoft.com/library/bb934049.aspx" target="_blank">Transparent Data Encryption (TDE)</a> to encrypt your database, associated backups, and transaction log files at rest without requiring changes to your application.

SQL Data Warehouse's TDE implementation is based on SQL Server's TDE technology which encrypts the storage of an entire database by using industry standard AES-256 symmetric key called the database encryption key. SQL Data Warehouse protects this database encryption key with a service managed certificate.
<h1>Getting Started (the portal way)</h1>
The easiest way to turn on TDE for your database instance is via the <a href="https://portal.azure.com">Azure portal</a>. Once in the portal, just navigate to your database, and expand the <strong>Transparent data encryption</strong> blade.

<a href="https://msdnshared.blob.core.windows.net/media/2016/04/DefaultState.png"><img src="https://msdnshared.blob.core.windows.net/media/2016/04/DefaultState-300x226.png" alt="DefaultState" width="300" height="226" class="alignnone size-medium wp-image-246" /></a>

You simply click on the <strong>On</strong> button and then the <strong>Save</strong> button at the top.

<a href="https://msdnshared.blob.core.windows.net/media/2016/04/Changed.png"><img src="https://msdnshared.blob.core.windows.net/media/2016/04/Changed-300x227.png" alt="Changed" width="300" height="227" class="alignnone size-medium wp-image-255" /></a>

In just a minute or so, your database will be secured.
<h1>Getting Started (the T-SQL way)</h1>
To enable TDE, via T-SQL you simple connect to the <strong>master</strong> database and execute the following command:
<pre><span style="color: #0078d7">ALTER DATABASE</span> [DemoDW] <span style="color: #0078d7">SET ENCRYPTION ON</span>;</pre>
<h1>Verify Encrypted Status</h1>
You can verify the state of all of your databases by connecting to the <strong>master</strong> database and executing the following command:
<pre><span style="color: #0078d7">SELECT</span> name, is_encrypted <span style="color: #0078d7">FROM</span> <span style="color: #107c10">sys.databases</span><span>;</span></pre>
The results list all of the databases by name and encrypted status (0 = not encrypted, 1 = encrypted).

<a href="https://msdnshared.blob.core.windows.net/media/2016/07/Results.png"><img src="https://msdnshared.blob.core.windows.net/media/2016/07/Results.png" alt="Results" width="216" height="141" class="alignnone size-full wp-image-265" /></a>
<h1>Next Steps</h1>
Visit the <a href="https://aka.ms/sqldw">SQL Data Warehouse Overview</a> to learn more about Microsoft’s scale out relational data warehouse.]]></content:encoded>
    </item>
    <item>
      <title>Loading Data to SQL Data Warehouse with the .NET SqlBulkCopy class</title>
      <link>https://docs.microsoft.com/archive/blogs/sqldw/loading-data-to-sql-data-warehouse-with-the-net-sqlbulkcopy-class</link>
      <pubDate>Tue, 26 Jul 2016 09:00:07 GMT</pubDate>
      <dc:creator><![CDATA[Matt Usher (MSFT)]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sqldw/?p=216</guid>
      <description><![CDATA[The Azure SQL Data Warehouse service is built on SQL Server and extends the capabilities of SQL...]]></description>
      <content:encoded><![CDATA[<span>The <a href="https://aka.ms/sqldw" target="_blank">Azure SQL Data Warehouse service</a> is built on SQL Server and extends the capabilities of SQL Server for large scale relational data warehouse workloads. By leveraging SQL Server as the core relational component, customers are able to quickly take advantage of the large ecosystem of solutions and partner products to build their data story. Having a strong set of integrations with Azure Services such as <a href="https://azure.microsoft.com/services/data-factory/" target="_blank">Azure Data Factory</a>, <a href="https://azure.microsoft.com/services/data-catalog/" target="_blank">Azure Data Catalog</a>, and <a href="https://azure.microsoft.com/services/stream-analytics/" target="_blank">Azure Stream Analytics</a> as well as a growing number of <a href="https://azure.microsoft.com/documentation/articles/sql-data-warehouse-partner-data-management/" target="_blank">Data Management</a> and <a href="https://azure.microsoft.com/documentation/articles/sql-data-warehouse-partner-data-integration/" target="_blank">Data Integration</a> partners, the SQL  Data Warehouse service offers a vast solution set to migrate to the cloud. </span>

For customers that need to build custom pipelines, the SQL Data Warehouse service offers support for bulk data loading through the .NET <a href="https://msdn.microsoft.com/library/system.data.sqlclient.sqlbulkcopy.aspx" target="_blank">SqlBulkCopy class</a>. This is a .NET class that "<em>l</em><span><em>ets you efficiently bulk load a SQL Server table with data from another source</em>." Practically, this means you can get data from whatever source you'd like and then insert it into SQL Data Warehouse using a standard .NET framework library. For example, you could create an <a href="https://github.com/hdinsight/hdinsight-storm-examples/tree/master/SCPNetExamples" target="_blank">HDInsight Bolt</a> to pull data into SQL Data Warehouse from Hadoop. </span>

<span> Let's build out a sample to try this out.</span>
<h1>Database Design</h1>
In this example, let's imagine we have a set of data that describes our products managed in a file (I know it simple but just illustrative).
<pre>1,Cables &amp; Power,
2,Camera &amp; Photo,
3,Cell Phones, That latest mobile devices.
4,Computers,
5,GPS &amp; Navigation,
6,Headphones,
7,Home Audio,
8,Office Electronics,
9,Security &amp; Survelliance,
10,Software,
11,Tablets, All of your tablet needs.
12,Televisions, The latest in LCD/LED and 4K.
13,Wearable Technology,</pre>
We can model this file in our database by creating a simple Products table:
<pre><span style="color: #0078d7">CREATE TABLE</span> DimProducts
(
 [ProductID] <span style="color: #0078d7">INT</span> <span style="color: #737373">NOT NULL,</span>
 [Name] <span style="color: #0078d7">VARCHAR</span>(50) <span style="color: #737373">NOT NULL,</span>
 [Description] <span style="color: #0078d7">NVARCHAR</span>(256) <span style="color: #737373">NULL</span>
)
<span style="color: #0078d7">WITH</span>
(
 <span style="color: #0078d7">HEAP</span>,
 <span style="color: #0078d7">DISTRIBUTION</span>=<span style="color: #0078d7">ROUND_ROBIN</span>
)<span style="color: #737373">;
</span></pre>
<h1>Code Sample</h1>
Now that we have our table, let's start loading it from .NET. I've created a simple Windows console application that reads a file, creates a <a href="https://msdn.microsoft.com/library/system.data.datatable.aspx" target="_blank">System.Data.DataTable</a>, loads the DataTable with data,  connects to SQL Data Warehouse and then bulk inserts the data. The main body is encapsulated in the Load method:
<pre><span style="color: #0078d7">static void</span> Load(<span style="color: #0078d7">string</span> path)
{
    <span style="color: #107c10">// Load the file</span>
    <span style="color: #0078d7">var</span> reader = <span style="color: #0078d7">new</span> <span style="color: #33cccc">StreamReader</span>(path);

<span style="color: #107c10">    // Get the Data Table to hold the rows</span>
    <span style="color: #0078d7">var</span> datatable = GetDataTable();

<span style="color: #107c10">    // Setup our SQL Connection to our SQL Data Warehouse</span>
    <span style="color: #0078d7">var</span> connection = GetConnection();

<span style="color: #107c10">    // Iterate through the file</span>
    <span style="color: #0078d7">string</span> row;
    <span style="color: #0078d7">while</span> ((row = reader.ReadLine()) != <span style="color: #0078d7">null</span>)
    {
<span style="color: #107c10">        // Split the row by comma</span>
        var values = row.Split(',');

<span style="color: #107c10">        // Add the row values to the Data Table</span>
        datatable.Rows.Add(values[0], values[1], values[2]);
    };

<span style="color: #107c10">    // Open the connection to SQL Data Warehouse</span>
    connection.Open();

<span style="color: #107c10">    // Create a Bulk Copy class</span>
    <span style="color: #0078d7">var</span> bulkCopy = <span style="color: #0078d7">new</span> <span style="color: #33cccc">SqlBulkCopy</span>(connection);

<span style="color: #107c10">    // Define the target table</span>
    bulkCopy.DestinationTableName = "<span style="color: #a80000">dbo.DimProducts</span>";

<span style="color: #107c10">    // Write the rows to the table</span>
    bulkCopy.WriteToServer(datatable);

    ...
 }</pre>
The key steps are the last four - simply connecting to SQL Data Warehouse just like SQL Server, creating a new SqlBulkCopy class, defining the target table, and then inserting the data via the <a href="https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.writetoserver.aspx" target="_blank">WriteToServer</a> method.

To verify your results, simply <a href="https://azure.microsoft.com/en-us/documentation/articles/sql-data-warehouse-connect-overview/" target="_blank">Connect to SQL Data Warehouse</a> and run the following query:
<pre><span style="color: #0078d7">SELECT</span> * <span style="color: #0078d7">FROM</span> DimProducts;</pre>
You'll see our 13 rows added:

<a href="https://msdnshared.blob.core.windows.net/media/2016/05/Results.png" rel="attachment wp-att-235"><img src="https://msdnshared.blob.core.windows.net/media/2016/05/Results-300x230.png" alt="Results" width="300" height="230" class="alignnone size-medium wp-image-235" /></a>
<h1>Download</h1>
You can download the <a href="https://github.com/Microsoft/sql-server-samples/tree/master/samples/features/sql-bulk-load" target="_blank">SQL Bulk Load</a> sample from the <a href="https://github.com/Microsoft/sql-server-samples" target="_blank">SQL Server Samples GitHub repo</a>.]]></content:encoded>
    </item>
    <item>
      <title>The effects of column level compression</title>
      <link>https://docs.microsoft.com/archive/blogs/sqldw/the-effects-of-column-level-compression</link>
      <pubDate>Thu, 05 May 2016 15:53:03 GMT</pubDate>
      <dc:creator><![CDATA[Matt Usher (MSFT)]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sqldw/?p=195</guid>
      <description><![CDATA[The Azure SQL Data Warehouse service is built on SQL Server and extends the capabilities of SQL...]]></description>
      <content:encoded><![CDATA[<p>The Azure SQL Data Warehouse service is built on SQL Server and extends the capabilities of SQL Server for large scale relational data warehouse workloads. One of the areas of interest is how to you optimize for databases with terabytes or petabytes of data. One answer is Clustered Columnar indexes (CCI). A columnar index is a technology for storing, retrieving, and managing data by using a columnar data format – called a columnstore. The idea is to store data in columns vs. row format which allows for the data to be compressed. Since the data is compressed, the impact is smaller storage requirements and faster data movement (you’re moving smaller amounts of data</b>). We won’t dive into the depths of columnar indexing here, there are plenty of guides that cover this in depth (see <a href="https://msdn.microsoft.com/en-us/library/gg492088.aspx">Columnstore Index Guide</a>, <a href="https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/03/13/columnstore-index-what-is-new-in-sql-server-2016/">Columnstore Index: What is new in SQL Server 2016?</a>, and <a href="https://msdn.microsoft.com/en-us/library/gg492153.aspx">CREATE COLUMNSTORE INDEX</a>). <p>Now why do you care? When using CCI with SQL Data Warehouse, you’ll often be presented with this problem: I loaded <em>n</em> MB/GB/TB of data into the service, ran <a href="https://msdn.microsoft.com/en-us/library/mt204028.aspx">DBCC PDW_SHOWSPACEUSED</a>, summed the DATA_SPACE column and see that the space used is dramatically smaller than the amount of data you put in. <h5><strong>An Example</strong></h5> <ul> <li><strong>Scenario #1: </strong>You have a 750 MB csv file (represents 1 hour of data) that you generated from your business and have <a href="https://azure.microsoft.com/en-us/documentation/articles/sql-data-warehouse-get-started-load-with-polybase/">loaded the data via PolyBase</a> into SQL Data Warehouse. You check the database via <a href="https://msdn.microsoft.com/en-us/library/mt204028.aspx">DBCC PDW_SHOWSPACEUSED</a> and see that you have about 1.4 GB of data.  <li><strong>Scenario #2</strong>: You use that same 750 MB csv file with the other 23 from that day (to represent a full day of data about 14GB of data), loaded in SQL Data Warehouse, and the results of DBCC PDW_SHOWSPACEUSED is 850MB.</li></ul> <p>So what magic is happening to make the data on disk so much smaller? Our friend, CCI! <h5>A Simple Explanation</h5> <p>In scenario #1, there are not enough rows in the data to meet the criteria for compression. SQL Server will optimize and move the data into Clustered Index (CI) format which does not enable compression. The difference in size is due to the table storage, CI storage, and the possibility that all of the data pages are not fully packed. <p>In scenario #2, there are enough rows in the data to meet the criteria for compression. In this case the data is very compressible and we achieve around 14x compression. <h5>Best Practice</h5> <ul> <li>CCI works best with data sets above 1M rows. This gives optimal row group sizes for compression and query performance.</li></ul> <h5>Monitoring</h5> <p>To monitor CCI data, you can inspect the metadata for the table to determine the open rowgroups and rows (min, max, and average) as an indicator if CCI is the correct indexing strategy. We have a great tutorial on <a href="https://azure.microsoft.com/en-us/documentation/articles/sql-data-warehouse-manage-columnstore-indexes/">Managing Columnstore Indexes</a> that walks you through how to determine rowgroups, rowgroup rows/counts, and a couple of strategies for tuning your system to get the best possible performance. <h3>Next Steps</h3> <p>Visit the <a href="https://aka.ms/sqldw">SQL Data Warehouse Overview</a> to learn more about Microsoft’s scale out relational data warehouse.</p>]]></content:encoded>
    </item>
    <item>
      <title>Exporting to a single file in SQL Data Warehouse</title>
      <link>https://docs.microsoft.com/archive/blogs/sqldw/exporting-to-a-single-file-in-sql-data-warehouse</link>
      <pubDate>Thu, 05 May 2016 15:46:12 GMT</pubDate>
      <dc:creator><![CDATA[Matt Usher (MSFT)]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/sqldw/?p=185</guid>
      <description><![CDATA[Azure SQL Data Warehouse includes PolyBase - a technology that accesses and combines both...]]></description>
      <content:encoded><![CDATA[<p>Azure SQL Data Warehouse includes <a href="https://msdn.microsoft.com/en-us/library/mt143171.aspx">PolyBase</a> - a technology that accesses and combines both non-relational and relational data from T-SQL . It allows you to run queries on external data in Azure blob storage and can be used for <a href="https://azure.microsoft.com/en-us/documentation/articles/sql-data-warehouse-get-started-load-with-polybase/">importing</a> or exporting data. External data is exposed through a concept called an external table (see <a href="https://msdn.microsoft.com/en-us/library/dn935021.aspx">MSDN</a> for details on setting up an external table) - essentially a normal SQL table that is backed by data stored outside of the relational engine.</p> <p>SQL Data Warehouse is a multi-node scale out relational SQL Server data warehouse. PolyBase has the capability of using all of the nodes in the SQL Data Warehouse cluster to import or export data in parallel. This is great for performance reasons (multiple nodes working in parallel can produce very large ingestion rates) but can cause some confusion if you're not aware of this design.</p> <p>Let's take a look at an example.</p> <h3>Exporting Data Default</h3> <p>When exporting data, you'll use a T-SQL command to create an external table from a SELECT statement. We call this a <a href="https://msdn.microsoft.com/en-us/library/dn935021.aspx">CETAS (<strong>C</strong>reate <strong>E</strong>xternal <strong>T</strong>able <strong>A</strong>s <strong>S</strong>elect)</a>. The processing of moving data from one table to another via CETAS will invoke PolyBase to create an external storage mechanism for the data to land into. In this example, a set of files on Azure Blob Storage.</p><pre><font size="2" face="Courier New"><font color="#007cd7">CREATE EXTERNAL TABLE</font> dbo.Orders<br><font color="#007cd7">WITH</font><br>(<br>&nbsp;&nbsp;&nbsp; LOCATION = '/Orders/',<br>&nbsp;&nbsp;&nbsp; <font color="#007cd7">DATA_SOURCE</font> = AzureStorage,<br>&nbsp;&nbsp;&nbsp; <font color="#007cd7">FILE_FORMAT</font> = TextFile<br>)<br><font color="#007cd7">AS<br>SELECT</font><br>*<br><font color="#007cd7">FROM</font><br>dbo.OrderHistory;</font></pre>
<p>This will produce 60 text files in Azure Blob Storage. This by design as PolyBase as the capability of reading multiple files in a directory or directory tree as the backing data for an External Table (a handy feature we’ll blog about in the future).</p>
<h3>Exporting a Single File</h3>
<p>But wait, what if I want to export all of my data to a single file? There is a handy trick that you can use – the TOP clause. Using the TOP clause forces the data to the control node in the service and the output will be sent to a single file:</p><pre><font size="2" face="Courier New"><font color="#007cd7">CREATE EXTERNAL TABLE</font> dbo.Orders<br><font color="#007cd7">WITH</font><br>(<br>&nbsp;&nbsp;&nbsp; LOCATION = '/Orders/',<br>&nbsp;&nbsp;&nbsp; <font color="#007cd7">DATA_SOURCE</font> = AzureStorage,<br>&nbsp;&nbsp;&nbsp; <font color="#007cd7">FILE_FORMAT</font> = TextFile<br>)<br><font color="#007cd7">AS<br>SELECT TOP [<em>N]</em></font><br>*<br><font color="#007cd7">FROM</font><br>dbo.OrderHistory;</font></pre>
<p><strong>Note</strong>: You’ll need to replace the [N] value with the row count of the table (if you’re doing a full export).</p>
<p>After executing the CETAS with the TOP clause, you’ll be left with a single file in Azure Blob Storage.</p>
<h3>Next Steps</h3>
<p>Visit the <a href="https://aka.ms/sqldw">SQL Data Warehouse Overview</a> to learn more about Microsoft’s scale out relational data warehouse.</p>]]></content:encoded>
    </item>
  </channel>
</rss>