51
Essbase ASO Performance Essbase ASO Performance When NOT to Depend on MDX Dan Pressman nTuple, LLC

Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Embed Size (px)

Citation preview

Page 1: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Essbase ASO PerformanceEssbase ASO Performance

When NOT to Depend on MDX

Dan PressmannTuple, LLC

Page 2: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 2

AgendaAgenda

IntroductionObjectivesHow and Why Relying on MDX Can Hurt

PerformanceASO Cubes and how they calculateASO Hierarchies and how they interactASO Aggregations

Real-World ExamplesThe Normal Way and How to “Cheat”

Page 3: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 3

ObjectivesObjectives

Design Hierarchies to Improve Performance of:YTD, QTD and MTD calculationsAverage Daily Balance calculationsAlternate Hierarchies

Reduce Dependence on Aggregation

Hierarchy Design Greatly Affects Performance

Page 4: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 4

ASO CubesASO Cubes

How many people have seen an ASO cube?

Are you sure?

Maybe you’ve just worked with them?

An ASO cube you can see and touch …

Page 5: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 5

A PreA Pre--Computer ASO CubeComputer ASO Cube

Page 6: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 6

PrePre--Computer FactDataComputer FactData

Page 7: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 7

PrePre--Computer FactDataComputer FactData

Coded FactData:• Punched holes represent

MetaData• Notches represent the

absence of MetaData• Holes & Notches for both:

– Level 0 metadata– Upper Level metadata

• FactData Printed on the card body– Manual Calculation

Page 8: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 8

PrePre--Computer QueryingComputer Querying

Page 9: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 9

PrePre--Computer QueryingComputer Querying

• Queries performed with knitting needles– aka Sorting Needles– Multiple query passes

through the data were required

Unless you had …

Page 10: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 10

PrePre--Computer QueryingComputer Querying

The new and improved –

Multi-Processor Model

Page 11: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 11

ASO ASO MetaDataMetaData CodingCoding

In Essbase, ASO cubes work the same way for stored hierarchies:

– The Holes and Notches are replaced by a bitmap as seen on the statistics page:

Page 12: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 12

ASO ASO MetaDataMetaData CodingCoding

In Essbase, ASO cubes work the same way for stored hierarchies:– The Holes and Notches are replaced by bitmap– The needles are replaced by a bitmap mask– The mask passes through all of the FactData “cards”– If all of the “cards” are:

• Coded with upper-level members and alternate hierarchies– i.e. Stored Hierarchies

• In the same “card box” (i.e., memory)

Then Queries are fast and simple

Page 13: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 13

ASO FactData CodingASO FactData Coding

In Essbase, each Level 0 FactData cell:– In Stored Dimensions/Hierarchies:

• Has a bitmap indicating its L0 “identity” (sibling position) in the primary hierarchy

• Has a bitmap indicating its full ancestry in its primary hierarchy

• No additional bitmap is required indicating its L0 “identity” in any alternate hierarchies

• Has a bitmap indicating its full ancestry in any alternate hierarchies

Page 14: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 14

ASO FactData CodingASO FactData Coding

In Essbase, each Level 0 FactData cell also has:– In Dynamic Dimensions/Hierarchies:

• A bitmap indicating its L0 “identity” amongst any stored (non- share) members

And of course:8 bytes of real, live FactData

Page 15: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 15

ASO Bitmap CodingASO Bitmap Coding

Paying attention to the metadata bitmap as seen on the Statistics Page is important because:

– The number of metadata bits is rounded up to the nearest 64-bit (8 byte) multiple

– Each 8-byte FactData cell has at least 8 bytes of metadata attached

– When there are hundreds of millions of FactData cells, a few bits here and a few bits there multiply

– Increase in the Input-Level data size increases the size of the “card” box (memory) required

• Remember, ASO queries are fast if all of the “cards” fit in memory

Page 16: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 16

ASO QueriesASO Queries

Stored Hierarchies: Fast - allow ASO to be ASO – All queries are eventually resolved to be a

combination of queries against the stored dimensions• Each stored query is a bitmap-mask pass through the

database • Performance is therefore based on the Input-Level Data Size• All stored dimension queries against the same Aggregation

level should be equal• Note: possible exception across multiple members of the

compression dimension

– Calculation order for dynamic dimensions is critical – keep them high up

Page 17: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 17

ASO QueriesASO Queries

– It can be worth paying the “cost” of increasing the bitmap and the Input-Level data size to increase performance without Aggregation

– There are also ways to design the hierarchy to minimize the size

– Dynamic queries can be used as “dimension translators” to redirect to a stored compound hierarchy hidden in another dimension

Page 18: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 18

ASO Bitmap Size CalculationASO Bitmap Size Calculation

The bitmap is sized as follows for each dimension:– For Stored Hierarchies:

• The sum for each level of the hierarchy of…– The number of bits required to represent the number of non-

shared siblings of the widest family of siblings for that level

– For Dynamic Hierarchies:• The number of bits required to represent the count of all

stored, non-shared members of the hierarchy

Note: Dimensions with only one stored member do not require any bits in the bitmap

Page 19: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 19

ASO Bitmap Size CalculationASO Bitmap Size Calculation

Bitmap Size, continued:– For Dimensions with Multiple Hierarchies enabled:

• The number of bits required to represent the number of non- shared siblings of the widest family of siblings for that level across all hierarchies for that dimension

– The number of stored, non-shared members for dynamic hierarchies are considered to be at level 0

• Plus the number of bits required to represent the number hierarchies in the dimension

– If there is only one hierarchy for the dimension, the number of bits required is zero, even if Multiple Hierarchies are enabled

The sum of the bits across all dimensions is then rounded up to the nearest multiple of 64

Page 20: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 20

ASO Bitmap Coding ExampleASO Bitmap Coding Example

Page 21: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 21

ASO Bitmap Coding ExampleASO Bitmap Coding Example

Page 22: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 22

ASO Bitmap Coding SummaryASO Bitmap Coding Summary

• Similar-sized families reduce cost• Ragged hierarchies impose little penalty

– The widest levels are usually at the bottom and are compared with other bottom levels no matter how many generations down

• Alternate hierarchies are not expensive– Only the upper-level members are stored

• Analysis dimensions (TimeSpan, Variance) with only one stored member impose no size cost

Page 23: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 23

ASO Bitmap Coding OtherASO Bitmap Coding Other

• Label-Only Members impose no size cost– They can be used freely, particularly in Dynamic

Hierarchies to improve readability• Implicit Sharing is still around

– Even with “Never Share” enabled, the only child exists only in the outline and is not represented explicitly in the bitmap

– “Never Share” appears only to have bearing in the cell count calculation for partitions

Page 24: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 24

ASO AggregationsASO Aggregations

• Are like a DB copy with a different (shortened) bitmap

• Remember, stored alternate hierarchies cannot use upper-level members from the primary hierarchy

• Consider loading aggregate levels of data to enhance performance – Data loads are fast – Data either can be loaded twice or aggregated at the

source for the upper-level load

Page 25: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 25

ExamplesExamples

• These examples demonstrate different ways of calculating YTD Results based on different cube styles:– Style A

• Year Dimension• Month Dimension• Day Dimension

– Style B• Year Dimension• Combined Month/Day Dimension

– Style C• Combined Year/Month/Day Dimension

• Each Style has a timespan dimension as well as four other dimensions

Page 26: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 26

Example Example –– Style A2Style A2

Page 27: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 27

Example Example –– Style A2Style A2

Using MDX to sum 17 days and sum 6 months

• July 17th YTD MDX:SUM(PeriodsToDate([Day].Levels (0) , [Day].CurrentMember

), [TimeSpan].[Per])+ SUM(PeriodsToDate([Month].Levels (0), PrevMember (

[Month].CurrentMember, Level ) ), ( [TimeSpan].[Per], [FullMonth]))

• Requires 23 bitmap passes through the data:

Page 28: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 28

Example Example –– Style B1Style B1

Page 29: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 29

Example Example –– Style B1Style B1

Using MDX to sum 197 days

• July 17th YTD MDX:SUM(PeriodsToDate([Period].CurrentMember.Level,

[Period].CurrentMember ), [TimeSpan].[Per])

• Requires 197 bitmap passes through the data

Page 30: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 30

Example Example –– Style C1Style C1

Page 31: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 31

Example Example –– Style C1Style C1

Using MDX to sum 197 days

• July 17th YTD MDX:SUM(PeriodsToDate([Date].Levels (0) ,

[Date].CurrentMember ), [TimeSpan].[Per])

• Requires 197 bitmap passes through the data

Page 32: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 32

Example Example –– Bitmap SizesBitmap Sizes

Page 33: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 33

Example Example –– Style B2Style B2

Using Improved MDX to sum 17 days and sum 6 months

• July 17th YTD MDX:SUM(tuplerange( ( [Period].CurrentMember.FirstSibling

, [TimeSpan].[Per]) , ( [Period].CurrentMember, [TimeSpan].[Per])))

+ SUM(PeriodsToDate([Period].CurrentMember.Parent.Level, [Period].CurrentMember.Parent ), [TimeSpan].[Per])

• Requires 23 bitmap passes through the data:

Page 34: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 34

Example Example –– Style C2Style C2

• Using Improved MDX to sum 17 days and sum 6 months

• July 17th YTD MDX:SUM(tuplerange( ( [Date].CurrentMember.FirstSibling

, [TimeSpan].[Per]) , ( [Date].CurrentMember, [TimeSpan].[Per])))

+ SUM(PeriodsToDate([Date].CurrentMember.Parent.Level, [Date].CurrentMember.Parent ), [TimeSpan].[Per])

• Requires 23 bitmap passes through the data:

Page 35: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 35

Example Example –– Style A3Style A3

Using ASO to roll up the 17 days

MDX to sum the 6 months

Page 36: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 36

Example Example –– Style A3Style A3

Using ASO to roll up the 17 daysMDX to sum up the 6 months

• July 17th YTD MDX:– INSERT HERE ******

• Requires 7 bitmap passes through the data• Bitmap for the time dimensions increase from 11 to 39 bits

Page 37: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 37

Example Example –– Style A4Style A4

Using ASO to roll up the 17 days

A separate load of full- month totals

Then use ASO to roll up the full-month totals

Page 38: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 38

Example Example –– Style A4Style A4

Using ASO to roll up the 17 daysA separate load of full-month totalsThen use ASO to roll up the full-month totals

• July 17th YTD MDX:– INSERT HERE ******

• Requires 2 bitmap passes through the data• Bitmap for the time dimensions increase from 11 to 45 bits

Page 39: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 39

Example Example –– Style B4Style B4

Using ASO to roll up the 17 days

Using ASO to Roll up the 6 full-months (no separate load required)

Page 40: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 40

Example Example –– Style B4Style B4

Using ASO to roll up the 17 days Using ASO to Roll up the 6 full-months (no separate

load required)

• July 17th YTD MDX:– INSERT HERE ******

• Requires 2 bitmap passes through the data• Bitmap for the time dimensions increase from 12 to 38 bits

Page 41: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 41

Example Example –– Style B5Style B5

Using a separate load of monthly YTD totals

Then use ASO to roll up the 17 days and the prior month YTD

Page 42: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 42

Example Example –– Style B5Style B5

Using a separate load of monthly YTD totalsThen use ASO to roll up the 17 days and the prior

month YTD

• July 17th YTD Simple MDX:– INSERT HERE ******

• Requires 1 bitmap passes through the data• Bitmap for the time dimensions increase from 12 to 39 bits

Page 43: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 43

Example Example –– Style C3Style C3

Using ASO to roll up the 17 days

MDX to sum up the 6 months

Page 44: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 44

Example Example –– Style C3Style C3

Using ASO to roll up the 17 daysMDX to sum up the 6 months

• July 17th YTD MDX:– INSERT HERE ******

• Requires 7 bitmap passes through the data• Bitmap for the time dimensions increase from 12 to 38 bits

Page 45: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 45

Example Example –– Style C5Style C5

Using a separate load of monthly YTD totals

Then use ASO to roll up the 17 days and the prior month YTD

Page 46: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 46

Example Example –– Style C5Style C5

Using separate load of monthly YTD totalsThen use ASO to roll up the 17 days and the prior

month YTD

• July 17th YTD Simple MDX:– INSERT HERE ******

• Requires 1 bitmap passes through the data• Bitmap for the time dimensions increase from 12 to 39 bits

Page 47: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 47

ASO Example ASO Example –– Style B5 & C5Style B5 & C5

• No Aggregation needed on this dimension– Turn it off

• “Squeeze” the YTD’s to get QTDs and HTDs

• Rolling time spans require 1 pass in C5 if within the year and 3 in B5 (if spanning years)

Page 48: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 48

Example Example –– Style DStyle D

Another example which adds the calculation of Average Daily Balances (ADB). The Monthly YTDs and Monthly YTD-ADBs are loaded.

Instead of using MDX to redirect the YTD timespans, a Transparent partion was used from a BSO cube. This way all of the extra roll ups were hidden from the user.

Page 49: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 49

ASO Example ASO Example –– Style DStyle D

• No Aggregation needed on this dimension– Turn it off

• “Squeeze” the YTD’s to get QTDs and HTDs

• Rolling time spans require 1 pass

Page 50: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 50

SummarySummary

• Let ASO be ASO• Use “hidden” compound dimensions

– Let ASO roll them up– Redirect/translate with MDX to maximize the use of

“hidden” dimensions

Page 51: Essbase ASO Performanceessbase.ru/Uploads/Aso/aso ppt.pdf · Essbase ASO Performance When NOT to Depend on MDX. Dan Pressman. nTuple, LLC

Dan Pressman, nTuple, LLC 51

Q & AQ & A

Questions, Answers and Discussion

Presenter: Dan PressmannTuple, LLC

973 [email protected]