Bagikan melalui


Pemrograman objek dasar AMO OLAP

Berlaku untuk: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

Membuat objek Analysis Services yang kompleks sederhana dan mudah tetapi memerlukan perhatian terhadap detail. Topik ini menjelaskan detail pemrograman objek dasar OLAP. Topik ini berisi bagian berikut:

Objek dimensi

Untuk mengelola atau memproses dimensi, Anda memprogram Dimension objek .

Membuat, menghilangkan, dan menemukan Dimensi

Membuat Dimension objek dicapai dalam empat langkah:

  1. Buat objek dimensi dan isi atribut dasar.

    Atribut dasar adalah Nama, Jenis Dimensi, Mode Penyimpanan, Pengikatan Sumber Data, Atribut Semua Nama Anggota, dan atribut dimensi lainnya.

    Sebelum membuat dimensi, Anda harus memverifikasi bahwa dimensi belum ada. Jika dimensi ada, dimensi akan dihilangkan dan dibuat ulang.

  2. Buat atribut yang menentukan dimensi.

    Setiap atribut harus ditambahkan satu per satu ke skema sebelum menggunakannya (temukan metode CreateDataItem di akhir kode sampel), lalu dapat ditambahkan ke koleksi atribut dimensi.

    Kolom Kunci dan Nama harus ditentukan di semua atribut.

    Atribut kunci utama dimensi harus didefinisikan sebagai AttributeUsage.Key untuk memperjelas bahwa atribut ini adalah akses kunci ke dimensi.

  3. Buat hierarki yang akan diakses pengguna untuk menavigasi dimensi.

    Saat Anda membuat hierarki, urutan tingkat ditentukan oleh urutan di mana tingkat dibuat dari atas ke bawah. Tingkat tertinggi adalah yang pertama ditambahkan ke kumpulan tingkat hierarki.

  4. Perbarui server dengan menggunakan metode Perbarui dimensi saat ini.

Kode sampel berikut membuat dimensi Produk dari tabel produk Adventure Works dalam database sampel.

static void CreateProductDimension(Database db, string datasourceName)  
{  
    // Create the Product dimension  
    Dimension dim = db.Dimensions.FindByName("Product");  
    if ( dim != null)  
       dim.Drop();  
    dim = db.Dimensions.Add("Product");  
    dim.Type = DimensionType.Products;  
    dim.UnknownMember = UnknownMemberBehavior.Hidden;  
    dim.AttributeAllMemberName = "All Products";  
    dim.Source = new DataSourceViewBinding(datasourceName);  
    dim.StorageMode = DimensionStorageMode.Molap;  
  
    #region Create attributes  
  
    DimensionAttribute attr;  
  
    attr = dim.Attributes.Add("Product Name");  
    attr.Usage = AttributeUsage.Key;  
    attr.Type = AttributeType.Product;  
    attr.OrderBy = OrderBy.Name;  
    attr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "DimProduct", "ProductKey"));  
    attr.NameColumn = CreateDataItem(db.DataSourceViews[0], "DimProduct", "EnglishProductName");  
  
    attr = dim.Attributes.Add("Product Line");  
    attr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "DimProduct", "ProductLine"));  
    attr.NameColumn = CreateDataItem(db.DataSourceViews[0], "DimProduct", "ProductLineName");  
  
    attr = dim.Attributes.Add("Model Name");  
    attr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "DimProduct", "ModelName"));  
    attr.AttributeRelationships.Add(new AttributeRelationship("Product Line"));  
    attr.AttributeRelationships.Add(new AttributeRelationship("Subcategory"));  
  
    attr = dim.Attributes.Add("Subcategory");  
    attr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "DimProductSubcategory", "ProductSubcategoryKey"));  
    attr.KeyColumns[0].NullProcessing = NullProcessing.UnknownMember;  
    attr.NameColumn = CreateDataItem(db.DataSourceViews[0], "DimProductSubcategory", "EnglishProductSubcategoryName");  
    attr.AttributeRelationships.Add(new AttributeRelationship("Category"));  
  
    attr = dim.Attributes.Add("Category");  
    attr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "DimProductCategory", "ProductCategoryKey"));  
    attr.NameColumn = CreateDataItem(db.DataSourceViews[0], "DimProductCategory", "EnglishProductCategoryName");  
  
    attr = dim.Attributes.Add("List Price");  
    attr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "DimProduct", "ListPrice"));  
    attr.AttributeHierarchyEnabled = false;  
  
    attr = dim.Attributes.Add("Size");  
    attr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "DimProduct", "Size"));  
    attr.AttributeHierarchyEnabled = false;  
  
    attr = dim.Attributes.Add("Weight");  
    attr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "DimProduct", "Weight"));  
    attr.AttributeHierarchyEnabled = false;  
  
    #endregion  
  
    #region Create hierarchies  
  
    Hierarchy hier;  
  
    hier = dim.Hierarchies.Add("Product Model Categories");  
    hier.AllMemberName = "All Products";  
    hier.Levels.Add("Category").SourceAttributeID = "Category";  
    hier.Levels.Add("Subcategory").SourceAttributeID = "Subcategory";  
    hier.Levels.Add("Model Name").SourceAttributeID = "Model Name";  
  
    hier = dim.Hierarchies.Add("Product Categories");  
    hier.AllMemberName = "All Products";  
    hier.Levels.Add("Category").SourceAttributeID = "Category";  
    hier.Levels.Add("Subcategory").SourceAttributeID = "Subcategory";  
    hier.Levels.Add("Model Name").SourceAttributeID = "Product Name";  
  
    hier = dim.Hierarchies.Add("Product Model Lines");  
    hier.AllMemberName = "All Products";  
    hier.Levels.Add("Subcategory").SourceAttributeID = "Product Line";  
    hier.Levels.Add("Model Name").SourceAttributeID = "Model Name";  
  
    #endregion  
  
    dim.Update();  
}  
  
static DataItem CreateDataItem(DataSourceView dsv, string tableName, string columnName)  
{  
    DataTable dataTable = ((DataSourceView)dsv).Schema.Tables[tableName];  
    DataColumn dataColumn = dataTable.Columns[columnName];  
    return new DataItem(tableName, columnName,  
        OleDbTypeConverter.GetRestrictedOleDbType(dataColumn.DataType));  
}  
  

Memproses dimensi

Memproses dimensi semahal menggunakan metode Dimension Proses objek.

Memproses dimensi dapat memengaruhi semua kubus yang menggunakan dimensi.

Kode berikut melakukan pembaruan bertahap di semua dimensi database yang disediakan:

static void UpdateAllDimensions(Database db)  
{  
    foreach (Dimension dim in db.Dimensions)  
        dim.Process(ProcessType.ProcessUpdate);  
}  

Objek kubus

Untuk mengelola atau memproses kubus, Anda memprogram Cube objek .

Membuat, menghilangkan, dan menemukan kubus

Mengelola kubus mirip dengan mengelola dimensi. Membuat Cube objek dicapai dalam empat langkah:

  1. Buat objek kubus dan isi atribut dasar.

    Atribut dasar adalah Nama, Mode Penyimpanan, Pengikatan Sumber Data, Pengukuran Default, dan atribut kubus lainnya.

    Sebelum membuat kubus, Anda harus memverifikasi bahwa kubus tidak ada. Dalam sampel jika kubus ada, kubus dijatuhkan lalu dibuat ulang.

  2. Tambahkan dimensi kubus.

    Dimensi ditambahkan ke koleksi dimensi kubus saat ini dari database; dimensi dalam kubus adalah referensi ke koleksi dimensi database. Setiap dimensi harus dipetakan ke kubus satu per satu. Dalam dimensi sampel dipetakan menyediakan: Pengidentifikasi Internal dimensi database, Nama untuk dimensi dalam kubus dan Id untuk dimensi bernama di kubus.

    Dalam kode sampel, perhatikan bahwa dimensi "Tanggal" ditambahkan tiga kali, setiap kali ditambahkan dengan menggunakan nama dimensi kubus yang berbeda: Tanggal, Tanggal Pengiriman, Tanggal Pengiriman. Dimensi ini disebut dimensi "bermain peran". Dimensi dasar sama (Tanggal), tetapi dalam tabel fakta dimensi digunakan dalam "peran" yang berbeda (Tanggal Pesanan, Tanggal Pengiriman, Tanggal Pengiriman) -lihat "Membuat, menghilangkan, dan menemukan MeasureGroup" nanti dalam dokumen ini untuk memahami bagaimana dimensi "bermain peran" ditentukan.

  3. Buat Grup Ukuran yang akan diakses pengguna untuk menelusuri data kubus.

    Pengukuran pembuatan grup akan dijelaskan dalam "Membuat, menghilangkan, dan menemukan MeasureGroup" nanti dalam dokumen ini. Sampel membungkus pengukuran pembuatan grup dalam metode yang berbeda, satu untuk setiap grup pengukuran.

  4. Perbarui server dengan menggunakan metode Perbarui kubus saat ini.

    Metode pembaruan digunakan dengan opsi Perbarui ExpandFull untuk memastikan bahwa semua objek sepenuhnya diperbarui di server.

Contoh kode berikut membuat bagian kubus Adventure Works. Sampel kode tidak membuat semua dimensi atau grup pengukuran yang disertakan dalam sampel Proyek Adventure Works Analysis Services.

static void CreateAdventureWorksCube(Database db, string datasourceName)  
{  
    // Create the Adventure Works cube  
    Cube cube = db.Cubes.FindByName("Adventure Works");  
    if ( cube != null)  
       cube.Drop();  
    db.Cubes.Add("Adventure Works");  
    cube.DefaultMeasure = "[Reseller Sales Amount]";  
    cube.Source = new DataSourceViewBinding(datasourceName);  
    cube.StorageMode = StorageMode.Molap;  
  
    #region Create cube dimensions  
  
    Dimension dim;  
  
    dim = db.Dimensions.GetByName("Date");  
    cube.Dimensions.Add(dim.ID, "Date", "Order Date Key - Dim Time");  
    cube.Dimensions.Add(dim.ID, "Ship Date",  
        "Ship Date Key - Dim Time");  
    cube.Dimensions.Add(dim.ID, "Delivery Date",  
        "Delivery Date Key - Dim Time");  
  
    dim = db.Dimensions.GetByName("Customer");  
    cube.Dimensions.Add(dim.ID);  
  
    dim = db.Dimensions.GetByName("Reseller");  
    cube.Dimensions.Add(dim.ID);  
    #endregion  
  
    #region Create measure groups  
  
    CreateSalesReasonsMeasureGroup(cube);  
    CreateInternetSalesMeasureGroup(cube);  
    CreateResellerSalesMeasureGroup(cube);  
    CreateCustomersMeasureGroup(cube);  
    CreateCurrencyRatesMeasureGroup(cube);  
  
    #endregion  
  
    cube.Update(UpdateOptions.ExpandFull);  
}  

Memproses kubus

Memproses kubus semahal menggunakan metode Cube Proses objek. Memproses kubus juga memproses semua grup pengukuran dalam kubus, dan semua partisi dalam grup pengukuran. Dalam kubus, partisi adalah satu-satunya objek yang dapat diproses; untuk tujuan pemrosesan, kelompok pengukuran hanyalah kontainer partisi. Jenis pemrosesan yang ditentukan untuk kubus menyebar ke partisi. Pemrosesan kubus dan grup pengukuran secara internal diselesaikan untuk memproses dimensi dan partisi.

Kode berikut akan melakukan proses penuh pada semua kubus dalam database tertentu:

foreach (Cube cube in db.Cubes)  
             cube.Process(ProcessType.ProcessFull);  
     }  

Objek MeasureGroup

Untuk mengelola atau memproses grup pengukuran, Anda memprogram MeasureGroup objek .

Membuat, menghilangkan, dan menemukan MeasureGroup

Mengelola grup pengukuran mirip dengan mengelola dimensi dan kubus. Membuat MeasureGroup objek dicapai dalam langkah-langkah berikut:

  1. Buat objek grup pengukuran dan isi atribut dasar.

    Atribut dasar termasuk Nama, Mode Penyimpanan, Mode Pemrosesan, Pengukuran Default, dan atribut grup pengukuran lainnya.

    Sebelum membuat grup pengukuran, verifikasi bahwa grup pengukuran tidak ada. Dalam kode sampel yang mengikuti, jika grup pengukuran ada, maka grup pengukuran dihilangkan dan dibuat ulang.

  2. Buat ukuran grup pengukuran. Untuk setiap ukuran yang dibuat, atribut berikut ditetapkan: nama, fungsi agregasi, kolom sumber, string format. Atribut lain juga dapat ditetapkan. Perhatikan bahwa dalam kode sampel berikut, metode CreateDataItem menambahkan kolom ke skema.

  3. Tambahkan dimensi grup pengukuran.

  4. Dimensi ditambahkan ke koleksi dimensi grup pengukuran saat ini dari koleksi dimensi kubus induk. Segera setelah dimensi disertakan dalam pengumpulan dimensi grup pengukuran, kolom kunci dari tabel fakta dapat dipetakan ke dimensi sehingga grup pengukuran dapat dijelajahi melalui dimensi.

    Dalam kode sampel berikut, lihat baris di bawah "Dimensi pemetaan dan kolom kunci dari tabel fakta". Dimensi pemutaran peran diimplementasikan dengan menautkan kunci pengganti yang berbeda ke dimensi yang sama dengan nama yang berbeda. Untuk setiap dimensi pemutaran peran (Tanggal, Tanggal Pengiriman, Tanggal Pengiriman), kunci pengganti yang berbeda ditautkan ke dimensi tersebut (OrderDateKey, ShipDateKey, DueDateKey). Semua kunci berasal dari tabel fakta FactInternetSales.

  5. Tambahkan partisi yang dirancang dari grup pengukuran.

    dalam kode sampel yang mengikuti, pembuatan partisi dibungkus dalam satu metode.

  6. Perbarui server dengan menggunakan metode Perbarui grup pengukuran saat ini.

    Dalam kode sampel yang mengikuti, semua grup pengukuran diperbarui saat kubus diperbarui.

Kode sampel berikut akan membuat grup pengukuran InternetSales dari sampel Proyek Adventure Works Analysis Services.

static void CreateInternetSalesMeasureGroup(Cube cube)  
{  
    // Create the Internet Sales measure group  
    Database db = cube.Parent;  
    MeasureGroup mg = cube.MeasureGroups.FindByName("Internet Sales");  
    if ( mg != null)  
       mg.Drop();  
    mg = cube.MeasureGroups.Add("Internet Sales");  
    mg.StorageMode = StorageMode.Molap;  
    mg.ProcessingMode = ProcessingMode.LazyAggregations;  
    mg.Type = MeasureGroupType.Sales;  
  
    #region Create measures  
  
    Measure meas;  
  
    meas = mg.Measures.Add("Internet Sales Amount");  
    meas.AggregateFunction = AggregationFunction.Sum;  
    meas.FormatString = "Currency";  
    meas.Source = CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "SalesAmount");  
  
    meas = mg.Measures.Add("Internet Order Quantity");  
    meas.AggregateFunction = AggregationFunction.Sum;  
    meas.FormatString = "#,#";  
    meas.Source = CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "OrderQuantity");  
  
    meas = mg.Measures.Add("Internet Unit Price");  
    meas.AggregateFunction = AggregationFunction.Sum;  
    meas.FormatString = "Currency";  
    meas.Visible = false;  
    meas.Source = CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "UnitPrice");  
  
    meas = mg.Measures.Add("Internet Total Product Cost");  
    meas.AggregateFunction = AggregationFunction.Sum;  
    //meas.MeasureExpression = "[Internet Total Product Cost] * [Average Rate]";  
    meas.FormatString = "Currency";  
    meas.Source = CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "TotalProductCost");  
  
    meas = mg.Measures.Add("Internet Order Count");  
    meas.AggregateFunction = AggregationFunction.Count;  
    meas.FormatString = "#,#";  
    meas.Source = CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "ProductKey");  
  
    #endregion  
  
    #region Create measure group dimensions  
  
    CubeDimension cubeDim;  
    RegularMeasureGroupDimension regMgDim;  
    ManyToManyMeasureGroupDimension mmMgDim;  
    MeasureGroupAttribute mgAttr;  
  
    //   Mapping dimension and key column from fact table  
    //      > select dimension and add it to the measure group  
    cubeDim = cube.Dimensions.GetByName("Date");  
    regMgDim = new RegularMeasureGroupDimension(cubeDim.ID);  
    mg.Dimensions.Add(regMgDim);  
  
    //      > add key column from dimension and map it with   
    //        the surrogate key in the fact table  
    mgAttr = regMgDim.Attributes.Add(cubeDim.Dimension.Attributes.GetByName("Date").ID);   // this is dimension key column  
    mgAttr.Type = MeasureGroupAttributeType.Granularity;  
    mgAttr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "OrderDateKey"));   // this surrogate key in fact table  
  
    cubeDim = cube.Dimensions.GetByName("Ship Date");  
    regMgDim = new RegularMeasureGroupDimension(cubeDim.ID);  
    mg.Dimensions.Add(regMgDim);  
    mgAttr = regMgDim.Attributes.Add(cubeDim.Dimension.Attributes.GetByName("Date").ID);  
    mgAttr.Type = MeasureGroupAttributeType.Granularity;  
    mgAttr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "ShipDateKey"));  
  
    cubeDim = cube.Dimensions.GetByName("Delivery Date");  
    regMgDim = new RegularMeasureGroupDimension(cubeDim.ID);  
    mg.Dimensions.Add(regMgDim);  
    mgAttr = regMgDim.Attributes.Add(cubeDim.Dimension.Attributes.GetByName("Date").ID);  
    mgAttr.Type = MeasureGroupAttributeType.Granularity;  
    mgAttr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "DueDateKey"));  
  
    cubeDim = cube.Dimensions.GetByName("Customer");  
    regMgDim = new RegularMeasureGroupDimension(cubeDim.ID);  
    mg.Dimensions.Add(regMgDim);  
    mgAttr = regMgDim.Attributes.Add(cubeDim.Dimension.Attributes.GetByName("Full Name").ID);  
    mgAttr.Type = MeasureGroupAttributeType.Granularity;  
    mgAttr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "CustomerKey"));  
  
    cubeDim = cube.Dimensions.GetByName("Product");  
    regMgDim = new RegularMeasureGroupDimension(cubeDim.ID);  
    mg.Dimensions.Add(regMgDim);  
    mgAttr = regMgDim.Attributes.Add(cubeDim.Dimension.Attributes.GetByName("Product Name").ID);  
    mgAttr.Type = MeasureGroupAttributeType.Granularity;  
    mgAttr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "ProductKey"));  
  
    cubeDim = cube.Dimensions.GetByName("Source Currency");  
    regMgDim = new RegularMeasureGroupDimension(cubeDim.ID);  
    mg.Dimensions.Add(regMgDim);  
    mgAttr = regMgDim.Attributes.Add(cubeDim.Dimension.Attributes.GetByName("Currency").ID);  
    mgAttr.Type = MeasureGroupAttributeType.Granularity;  
    mgAttr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "CurrencyKey"));  
  
    cubeDim = cube.Dimensions.GetByName("Sales Reason");  
    mmMgDim = new ManyToManyMeasureGroupDimension();  
    mmMgDim.CubeDimensionID = cubeDim.ID;  
    mmMgDim.MeasureGroupID = cube.MeasureGroups.GetByName("Sales Reasons").ID;  
    mg.Dimensions.Add(mmMgDim);  
  
    cubeDim = cube.Dimensions.GetByName("Internet Sales Order Details");  
    regMgDim = new RegularMeasureGroupDimension(cubeDim.ID);  
    mg.Dimensions.Add(regMgDim);  
    mgAttr = regMgDim.Attributes.Add(cubeDim.Dimension.Attributes.GetByName("Sales Order Key").ID);  
    mgAttr.Type = MeasureGroupAttributeType.Granularity;  
    mgAttr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "SalesOrderNumber"));  
    mgAttr.KeyColumns.Add(CreateDataItem(db.DataSourceViews[0], "FactInternetSales", "SalesOrderLineNumber"));  
  
    #endregion  
  
    #region Create partitions  
  
    CreateInternetSalesMeasureGroupPartitions( mg)  
  
    #endregion  
}  

Memproses grup pengukuran

Memproses grup pengukuran semahal menggunakan metode MeasureGroup Proses objek. Memproses grup pengukuran akan memproses semua partisi yang termasuk dalam grup pengukuran. Memproses grup pengukuran secara internal diselesaikan untuk memproses dimensi dan partisi. Lihat Memproses Partisi dalam dokumen ini.

Kode berikut akan melakukan proses penuh di semua grup ukuran kubus yang disediakan.

static void FullProcessAllMeasureGroups(Cube cube)  
{  
    foreach (MeasureGroup mg in cube.MeasureGroups)  
        mg.Process(ProcessType.ProcessFull);  
}  

Objek partisi

Untuk mengelola atau memproses partisi, Anda memprogram Partition objek.

Membuat, menghilangkan, dan menemukan partisi

Partisi adalah objek sederhana yang dapat dibuat dalam dua langkah.

  1. Buat objek partisi dan isi atribut dasar.

    Atribut dasar adalah Nama, Mode Penyimpanan, sumber partisi, Ipotong, serta atribut grup pengukuran lainnya. Sumber partisi mendefinisikan pernyataan pemilihan SQL untuk partisi saat ini. Slice adalah ekspresi MDX yang menentukan tuple atau set yang memisahkan bagian dimensi dari grup ukuran induk yang terkandung dalam partisi saat ini. Untuk partisi MOLAP, pemotongan ditentukan secara otomatis setiap kali partisi diproses.

    Sebelum membuat partisi, Anda harus memverifikasi bahwa partisi tidak ada. Dalam kode sampel yang mengikuti, jika partisi ada, itu dihilangkan dan kemudian dibuat ulang.

  2. Perbarui server dengan menggunakan metode Perbarui partisi saat ini.

    Dalam kode sampel yang mengikuti, semua partisi diperbarui saat kubus diperbarui.

Sampel kode berikut membuat partisi untuk grup pengukuran 'InternetSales'.

static void CreateInternetSalesMeasureGroupPartitions(MeasureGroup mg)  
{  
    Partition part;  
    part = mg.Partitions.FindByName("Internet_Sales_184");  
    if ( part != null)  
       part.Drop();  
    part = mg.Partitions.Add("Internet_Sales_184");  
    part.StorageMode = StorageMode.Molap;  
    part.Source = new QueryBinding(db.DataSources[0].ID, "SELECT * FROM [dbo].[FactInternetSales] WHERE OrderDateKey <= '184'");  
    part.Slice = "[Date].[Calendar Year].&[2001]";  
    part.Annotations.Add("LastOrderDateKey", "184");  
  
    part = mg.Partitions.FindByName("Internet_Sales_549");  
    if ( part != null)  
       part.Drop();  
    part = mg.Partitions.Add("Internet_Sales_549");  
    part.StorageMode = StorageMode.Molap;  
    part.Source = new QueryBinding(db.DataSources[0].ID, "SELECT * FROM [dbo].[FactInternetSales] WHERE OrderDateKey > '184' AND OrderDateKey <= '549'");  
    part.Slice = "[Date].[Calendar Year].&[2002]";  
    part.Annotations.Add("LastOrderDateKey", "549");  
  
    part = mg.Partitions.FindByName("Internet_Sales_914");  
    if ( part != null)  
       part.Drop();  
    part = mg.Partitions.Add("Internet_Sales_914");  
    part.StorageMode = StorageMode.Molap;  
    part.Source = new QueryBinding(db.DataSources[0].ID, "SELECT * FROM [dbo].[FactInternetSales] WHERE OrderDateKey > '549' AND OrderDateKey <= '914'");  
    part.Slice = "[Date].[Calendar Year].&[2003]";  
    part.Annotations.Add("LastOrderDateKey", "914");  
}  

Memproses partisi

Memproses partisi sesingkat menggunakan metode Partition Proses objek.

Sampel kode berikut melakukan proses penuh di semua partisi grup pengukuran tertentu.

static void FullProcessAllPartitions(MeasureGroup mg)  
{  
    foreach (Partition part in mg.Partitions)  
        part.Process(ProcessType.ProcessFull);  
}  

Menggabungkan partisi

Menggabungkan partisi berarti melakukan operasi apa pun yang menghasilkan dua partisi atau lebih menjadi satu partisi.

Menggabungkan partisi adalah metode objek Partition . Perintah ini menggabungkan data dari satu atau beberapa partisi sumber ke dalam partisi target dan menghapus partisi sumber.

Partisi hanya dapat digabungkan jika memenuhi semua kriteria berikut:

  • Partisi berada dalam grup ukuran yang sama.

  • Partisi disimpan dalam mode yang sama (MOLAP, HOLAP, dan ROLAP).

  • Partisi berada di server yang sama; partisi jarak jauh dapat digabungkan jika berada di server yang sama.

Tidak seperti versi sebelumnya, di Analysis Services, tidak perlu bahwa semua partisi sumber memiliki desain agregasi yang identik.

Kumpulan agregasi yang dihasilkan untuk partisi target adalah set agregasi yang sama dengan status sebelum menjalankan perintah penggabungan.

Sampel kode berikut menggabungkan semua partisi dari grup pengukuran tertentu. Partisi digabungkan ke dalam partisi pertama dari grup pengukuran.

static void MergeAllPartitions(MeasureGroup mg)  
{  
    if (mg.Partitions.Count > 1)  
    {  
        Partition[] partArray = new Partition[mg.Partitions.Count - 1];  
        for (int i = 1; i < mg.Partitions.Count; i++)  
            partArray[i - 1] = mg.Partitions[i];  
        mg.Partitions[0].Merge(partArray);  
        //To have last changes in the server reflected in AMO  
        mg.Refresh();  
    }  

Objek agregasi

Untuk merancang agregasi dan menerapkannya ke satu atau beberapa partisi, Anda memprogram Aggregation objek.

Membuat dan menghilangkan agregasi

Agregasi dapat dengan mudah dibuat dan ditetapkan untuk mengukur grup atau ke partisi dengan menggunakan metode DesignAggregations dari AggregationDesign objek . Objek AggregationDesign adalah objek terpisah dari partisi, AggregationDesign objek terkandung dalam MeasureGroup objek . Agregasi dapat dirancang hingga tingkat pengoptimalan yang ditentukan (0 hingga 100) atau hingga tingkat penyimpanan (byte) yang ditentukan. Beberapa partisi dapat menggunakan desain agregasi yang sama.

Sampel kode berikut membuat agregasi untuk semua partisi grup pengukuran yang disediakan. Setiap agregasi yang ada dalam partisi dihilangkan.

static public String DesignAggregationsOnPartitions(MeasureGroup mg, double optimizationWanted, double maxStorageBytes)  
{  
    double optimization = 0;  
    double storage = 0;  
    long aggCount = 0;  
    bool finished = false;  
    AggregationDesign ad = null;  
    String aggDesignName;  
    String AggregationsDesigned = "";  
    aggDesignName = mg.AggregationPrefix + "_" + mg.Name;  
    ad = mg.AggregationDesigns.Add();  
    ad.Name = aggDesignName;  
    ad.InitializeDesign();  
    while ((!finished) && (optimization < optimizationWanted) && (storage < maxStorageBytes))  
    {  
        ad.DesignAggregations(out optimization, out storage, out aggCount, out finished);  
    }  
    ad.FinalizeDesign();  
    foreach (Partition part in mg.Partitions)  
    {  
        part.AggregationDesignID = ad.ID;  
        AggregationsDesigned += aggDesignName + " = " + aggCount.ToString() + " aggregations designed\r\n\tOptimization: " + optimization.ToString() + "/" + optimizationWanted.ToString() + "\n\r\tStorage: " + storage.ToString() + "/" + maxStorageBytes.ToString() + " ]\n\r";  
     }  
     return AggregationsDesigned;  
}