Foreword |
|
xix | |
Introduction |
|
xxi | |
Chapter 1 Introducing the tabular model |
|
1 | (22) |
|
Semantic models in Analysis Services |
|
|
1 | (2) |
|
What is Analysis Services and why should I use it? |
|
|
1 | (1) |
|
A short history of Analysis Services |
|
|
2 | (1) |
|
Understanding Tabular and Multidimensional |
|
|
3 | (5) |
|
|
3 | (2) |
|
The multidimensional model |
|
|
5 | (2) |
|
|
7 | (1) |
|
The future of Analysis Services |
|
|
8 | (1) |
|
|
8 | (1) |
|
Choosing the right model for your project |
|
|
8 | (6) |
|
|
9 | (1) |
|
Upgrading from previous versions of Analysis Services |
|
|
10 | (1) |
|
|
10 | (1) |
|
Compatibility with Power Pivot |
|
|
10 | (1) |
|
Compatibility with Power BI |
|
|
10 | (1) |
|
Query performance characteristics |
|
|
10 | (1) |
|
Processing performance characteristics |
|
|
11 | (1) |
|
|
11 | (1) |
|
|
12 | (1) |
|
|
12 | (1) |
|
|
13 | (1) |
|
Understanding DAX and MDX |
|
|
14 | (2) |
|
|
15 | (1) |
|
|
15 | (1) |
|
Choosing the query language for Tabular |
|
|
16 | (1) |
|
Introduction to Tabular calculation engines |
|
|
16 | (3) |
|
|
17 | (1) |
|
Introduction to DirectQuery |
|
|
18 | (1) |
|
Tabular model compatibility level (1200 vs. 110x) |
|
|
19 | (1) |
|
Analysis Services and Power BI |
|
|
20 | (1) |
|
|
21 | (2) |
Chapter 2 Getting started with the tabular model |
|
23 | (60) |
|
Setting up a development environment |
|
|
23 | (10) |
|
Components of a development environment |
|
|
23 | (3) |
|
|
26 | (1) |
|
|
26 | (7) |
|
Working with SQL Server Data Tools |
|
|
33 | (10) |
|
|
33 | (2) |
|
Configuring a new project |
|
|
35 | (5) |
|
Importing from Power Pivot |
|
|
40 | (1) |
|
|
41 | (1) |
|
Importing a Deployed Project from Analysis Services |
|
|
41 | (1) |
|
Contents of a tabular project |
|
|
42 | (1) |
|
Building a simple tabular model |
|
|
43 | (16) |
|
|
44 | (10) |
|
Working in the diagram view |
|
|
54 | (4) |
|
Navigating in Tabular Model Explorer |
|
|
58 | (1) |
|
Deploying a tabular model |
|
|
59 | (1) |
|
Querying tabular models with Excel |
|
|
60 | (11) |
|
Connecting to a tabular model |
|
|
60 | (4) |
|
|
64 | (1) |
|
|
65 | (2) |
|
Sorting and filtering rows and columns |
|
|
67 | (3) |
|
Using Excel cube formulas |
|
|
70 | (1) |
|
Querying tabular models with Power BI Desktop |
|
|
71 | (7) |
|
Creating a connection to a tabular model |
|
|
71 | (2) |
|
Building a basic Power BI report |
|
|
73 | (1) |
|
Adding charts and slicers |
|
|
74 | (2) |
|
Interacting with a report |
|
|
76 | (2) |
|
Working with SQL Server Management Studio |
|
|
78 | (4) |
|
Importing from Power Pivot |
|
|
80 | (1) |
|
Importing from Power BI Desktop |
|
|
81 | (1) |
|
Using DAX Studio as an alternative to SSMS |
|
|
81 | (1) |
|
|
82 | (1) |
Chapter 3 Loading data inside Tabular |
|
83 | (36) |
|
Understanding data sources |
|
|
83 | (2) |
|
Understanding impersonation |
|
|
85 | (1) |
|
Understanding server-side and client-side credentials |
|
|
86 | (1) |
|
|
87 | (1) |
|
|
88 | (7) |
|
Loading from a list of tables |
|
|
90 | (3) |
|
|
93 | (1) |
|
|
94 | (1) |
|
Opening existing connections |
|
|
95 | (1) |
|
|
96 | (1) |
|
Loading from Analysis Services |
|
|
97 | (4) |
|
|
98 | (1) |
|
Loading from a tabular database |
|
|
99 | (2) |
|
Loading from an Excel file |
|
|
101 | (2) |
|
|
103 | (2) |
|
Loading from the clipboard |
|
|
105 | (2) |
|
Loading from a Reporting Services report |
|
|
107 | (7) |
|
Loading reports by using the report data source |
|
|
108 | (4) |
|
Loading reports by using data feeds |
|
|
112 | (2) |
|
|
114 | (2) |
|
|
116 | (1) |
|
Choosing the right data-loading method |
|
|
117 | (1) |
|
|
118 | (1) |
Chapter 4 Introducing calculations in DAX |
|
119 | (22) |
|
Introduction to the DAX language |
|
|
119 | (13) |
|
|
120 | (1) |
|
|
121 | (3) |
|
|
124 | (1) |
|
Column reference and measures reference |
|
|
125 | (1) |
|
|
126 | (1) |
|
|
126 | (1) |
|
|
127 | (2) |
|
CALCULATE and CALCULATETABLE |
|
|
129 | (3) |
|
|
132 | (1) |
|
|
132 | (1) |
|
|
133 | (2) |
|
|
135 | (1) |
|
|
136 | (2) |
|
|
138 | (2) |
|
DAX Formatter, DAX Studio, and DAX Editor |
|
|
139 | (1) |
|
|
140 | (1) |
Chapter 5 Building hierarchies |
|
141 | (18) |
|
|
141 | (7) |
|
|
141 | (2) |
|
When to build hierarchies |
|
|
143 | (1) |
|
|
143 | (1) |
|
Hierarchy design best practices |
|
|
144 | (1) |
|
Hierarchies spanning multiple tables |
|
|
145 | (2) |
|
Natural and unnatural hierarchies |
|
|
147 | (1) |
|
|
148 | (10) |
|
What are parent-child hierarchies? |
|
|
148 | (1) |
|
Configuring parent-child hierarchies |
|
|
149 | (5) |
|
|
154 | (4) |
|
|
158 | (1) |
Chapter 6 Data modeling in Tabular |
|
159 | (34) |
|
Understanding different data-modeling techniques |
|
|
159 | (3) |
|
|
161 | (1) |
|
Working with dimensional models |
|
|
162 | (7) |
|
Working with slowly changing dimensions |
|
|
163 | (3) |
|
Working with degenerate dimensions |
|
|
166 | (1) |
|
Using snapshot fact tables |
|
|
167 | (2) |
|
Using views to decouple from the database |
|
|
169 | (1) |
|
|
170 | (13) |
|
Cardinality of relationships |
|
|
172 | (4) |
|
Filter propagation in relationships |
|
|
176 | (4) |
|
Active state of relationships |
|
|
180 | (2) |
|
Implementing relationships in DAX |
|
|
182 | (1) |
|
Normalization versus denormalization |
|
|
183 | (4) |
|
Calculated tables versus an external ETL |
|
|
187 | (4) |
|
Circular reference using calculated tables |
|
|
189 | (2) |
|
|
191 | (2) |
Chapter 7 Tabular Model Scripting Language (TMSL) |
|
193 | (24) |
|
|
193 | (19) |
|
|
195 | (3) |
|
|
198 | (1) |
|
|
199 | (7) |
|
|
206 | (1) |
|
|
207 | (1) |
|
|
208 | (2) |
|
|
210 | (2) |
|
|
212 | (3) |
|
Object operations in TMSL |
|
|
212 | (2) |
|
Data-refresh and database-management operations in TMSL |
|
|
214 | (1) |
|
|
214 | (1) |
|
|
215 | (2) |
Chapter 8 The tabular presentation layer |
|
217 | (34) |
|
Setting metadata for a Date table |
|
|
217 | (1) |
|
Naming, sorting, and formatting |
|
|
218 | (10) |
|
|
219 | (1) |
|
Hiding columns and measures |
|
|
220 | (1) |
|
Organizing measures and columns |
|
|
221 | (1) |
|
|
222 | (3) |
|
|
225 | (3) |
|
|
228 | (2) |
|
Power View-related properties |
|
|
230 | (4) |
|
|
231 | (1) |
|
Table behavior properties |
|
|
232 | (2) |
|
Key performance indicators |
|
|
234 | (3) |
|
|
237 | (10) |
|
Creating a translation file |
|
|
238 | (2) |
|
Writing translated names in a translation file |
|
|
240 | (1) |
|
Choosing an editor for translation files |
|
|
241 | (2) |
|
Importing a translation file |
|
|
243 | (1) |
|
Testing translations using a client tool |
|
|
244 | (2) |
|
|
246 | (1) |
|
Best practices using translations |
|
|
246 | (1) |
|
Selecting culture and collation in a tabular model |
|
|
247 | (3) |
|
Changing culture and collation using an integrated workspace |
|
|
249 | (1) |
|
Changing culture and collation using a workspace server |
|
|
249 | (1) |
|
|
250 | (1) |
Chapter 9 Using DirectQuery |
|
251 | (18) |
|
|
252 | (9) |
|
Setting DirectQuery in a development environment |
|
|
252 | (6) |
|
Setting DirectQuery after deployment |
|
|
258 | (3) |
|
Limitations in tabular models for DirectQuery |
|
|
261 | (5) |
|
|
261 | (1) |
|
Restrictions for data sources |
|
|
262 | (1) |
|
Restrictions for data modeling |
|
|
262 | (1) |
|
Restrictions for DAX formulas |
|
|
262 | (2) |
|
Restrictions for MDX formulas |
|
|
264 | (1) |
|
|
264 | (2) |
|
Choosing between DirectQuery and VertiPaq |
|
|
266 | (1) |
|
|
267 | (2) |
Chapter 10 Security |
|
269 | (32) |
|
|
269 | (3) |
|
Connecting to Analysis Services from outside a domain |
|
|
270 | (1) |
|
Kerberos and the double-hop problem |
|
|
270 | (2) |
|
|
272 | (3) |
|
|
272 | (2) |
|
Membership of multiple roles |
|
|
274 | (1) |
|
|
275 | (2) |
|
Granting permission through the server administrator role |
|
|
275 | (1) |
|
Granting database roles and administrative permissions |
|
|
276 | (1) |
|
|
277 | (13) |
|
|
277 | (2) |
|
|
279 | (4) |
|
Advanced row-filter expressions |
|
|
283 | (5) |
|
Security in calculated columns and calculated tables |
|
|
288 | (1) |
|
Using a permissions table |
|
|
289 | (1) |
|
Evaluating the impact of data security on performance |
|
|
290 | (1) |
|
Creating dynamic security |
|
|
290 | (5) |
|
DAX functions for dynamic security |
|
|
290 | (1) |
|
Implementing dynamic security by using CUSTOMDATA |
|
|
291 | (2) |
|
Implementing dynamic security by using USERNAME |
|
|
293 | (2) |
|
|
295 | (3) |
|
Security and impersonation with DirectQuery |
|
|
295 | (2) |
|
Row-level security on SQL Server earlier than 2016 |
|
|
297 | (1) |
|
|
298 | (2) |
|
|
300 | (1) |
Chapter 11 Processing and partitioning tabular models |
|
301 | (46) |
|
Automating deployment to a production server |
|
|
301 | (1) |
|
|
302 | (9) |
|
Defining a partitioning strategy |
|
|
302 | (3) |
|
Defining partitions for a table in a tabular model |
|
|
305 | (4) |
|
Managing partitions for a table |
|
|
309 | (2) |
|
|
311 | (13) |
|
Available processing options |
|
|
312 | (5) |
|
Defining a processing strategy |
|
|
317 | (3) |
|
|
320 | (4) |
|
|
324 | (14) |
|
|
324 | (7) |
|
Using SQL Server Integration Services |
|
|
331 | (3) |
|
Using Analysis Management Objects (AMO) and Tabular Object Model (TOM) |
|
|
334 | (2) |
|
|
336 | (2) |
|
Sample processing scripts |
|
|
338 | (7) |
|
|
338 | (1) |
|
|
339 | (1) |
|
|
340 | (1) |
|
|
341 | (4) |
|
|
345 | (2) |
Chapter 12 Inside VertiPaq |
|
347 | (26) |
|
Understanding VertiPaq structures |
|
|
347 | (13) |
|
Understanding column storage |
|
|
348 | (3) |
|
Value encoding versus hash encoding |
|
|
351 | (3) |
|
|
354 | (2) |
|
Controlling column encoding |
|
|
356 | (1) |
|
Hierarchies and relationships |
|
|
357 | (1) |
|
Segmentation and partitioning |
|
|
358 | (2) |
|
Reading VertiPaq internal metadata |
|
|
360 | (6) |
|
Using DMVs for VertiPaq memory usage |
|
|
360 | (1) |
|
Interpreting VertiPaq Analyzer reports |
|
|
361 | (5) |
|
|
366 | (3) |
|
|
366 | (1) |
|
|
367 | (1) |
|
|
368 | (1) |
|
Understanding processing options |
|
|
369 | (3) |
|
What happens during processing |
|
|
369 | (2) |
|
Available processing options |
|
|
371 | (1) |
|
|
372 | (1) |
Chapter 13 Interfacing with Tabular |
|
373 | (22) |
|
Introducing the AMO and TOM libraries |
|
|
373 | (8) |
|
|
374 | (2) |
|
|
376 | (5) |
|
Introducing the TMSL commands |
|
|
381 | (2) |
|
Creating a database programmatically |
|
|
383 | (3) |
|
Automating data refresh and partitioning |
|
|
386 | (1) |
|
|
387 | (2) |
|
Manipulating a data model |
|
|
389 | (2) |
|
Automating project deployment |
|
|
391 | (3) |
|
Copying the same database on different servers |
|
|
391 | (1) |
|
Deploying a model.bim file by choosing a database and server name |
|
|
392 | (2) |
|
|
394 | (1) |
Chapter 14 Monitoring and tuning a Tabular service |
|
395 | (30) |
|
Finding the Analysis Services process |
|
|
395 | (2) |
|
Resources consumed by Analysis Services |
|
|
397 | (3) |
|
|
397 | (1) |
|
|
398 | (2) |
|
|
400 | (1) |
|
Understanding memory configuration |
|
|
400 | (5) |
|
Using memory-related performance counters |
|
|
405 | (4) |
|
Using dynamic management views |
|
|
409 | (3) |
|
Interesting DMVs to monitor a Tabular service |
|
|
411 | (1) |
|
Automating monitoring info and logs acquisition |
|
|
412 | (6) |
|
|
412 | (1) |
|
|
413 | (4) |
|
|
417 | (1) |
|
|
417 | (1) |
|
|
417 | (1) |
|
|
418 | (1) |
|
Monitoring data refresh (process) |
|
|
418 | (4) |
|
|
422 | (2) |
|
|
424 | (1) |
Chapter 15 Optimizing tabular models |
|
425 | (28) |
|
Optimizing data memory usage |
|
|
425 | (13) |
|
|
425 | (1) |
|
|
426 | (3) |
|
|
429 | (2) |
|
Reducing a database size by choosing the sort order |
|
|
431 | (2) |
|
Improving encoding and bit sizing |
|
|
433 | (1) |
|
Optimizing large dimensions |
|
|
434 | (4) |
|
Designing tabular models for large databases |
|
|
438 | (6) |
|
Optimizing compression by splitting columns |
|
|
438 | (1) |
|
Optimizing the process time of large tables |
|
|
439 | (1) |
|
Aggregating fact tables at different granularities |
|
|
440 | (4) |
|
Designing tabular models for near-real-time solutions |
|
|
444 | (7) |
|
Choosing between DirectQuery and VertiPaq |
|
|
445 | (1) |
|
|
446 | (2) |
|
Reducing recalculation time |
|
|
448 | (2) |
|
Managing lock during process |
|
|
450 | (1) |
|
|
451 | (2) |
Chapter 16 Choosing hardware and virtualization |
|
453 | (14) |
|
|
453 | (8) |
|
|
454 | (3) |
|
|
457 | (1) |
|
|
458 | (2) |
|
|
460 | (1) |
|
Hardware requirements for DirectQuery |
|
|
460 | (1) |
|
Optimizing hardware configuration |
|
|
461 | (2) |
|
|
461 | (1) |
|
|
462 | (1) |
|
|
463 | (1) |
|
|
463 | (1) |
|
Splitting NUMA nodes on different VMs |
|
|
464 | (1) |
|
|
464 | (1) |
|
Scalability of an SSAS Tabular solution |
|
|
464 | (2) |
|
Scalability for a single database (large size) |
|
|
465 | (1) |
|
Scalability for large user workload |
|
|
465 | (1) |
|
|
466 | (1) |
Index |
|
467 | |