Verileri arşivlemek için tablo bölümleme


13

Senaryo:

  • iki veritabanı: tableA adı verilen çok büyük bir tablo ile DB_A ve DB_Archive.
  • her gün, 60 günden eski kayıtlar DB_A'dan silinir ve tabloA son 2 aydaki kayıtlar için DB_A'da yoğun bir şekilde sorgulandığı için esas olarak "ayrılmış" bir şey bırakmak için DB_Archive'a taşınır.

Bu süreçten kurtulmak istiyorum çünkü yavaş ve çok fazla kaynak tüketiyor. Ben bir tarih sütununda bir bölüm işlevi ile DB_A üzerinde tablo bölümleme uygulamak ve bir bölümde tüm kayıtları <2 ay ve tüm kayıtları> başka bir bölümde 2 ay depolamak düşünüyorum. Sorularım:

  • Bu senaryo 2 farklı veritabanım varsa nasıl davranacak? TableA'mı kayıtlar için sorgularsam> getdate () - 30, arşivleme bölümünü okuyacak mı?
  • Dizinleri de bölümlere ayırmam gerekiyordu, değil mi?
  • Yarın bölüm işlevimin "değişeceği" gerçeğiyle nasıl başa çıkacağım, yani, bugün işlevi oluşturursam (2 Temmuz, aralığı 2 Mayıs olacak, yarın 3 Mayıs olacak). Dinamik bölümleme işlevi oluşturabilir miyim?

Dinamik bir işleve izin verilse bile iyi bir fikir olduğunu düşünmüyorum (sanmıyorum) ... kısaca daha ayrıntılı olarak ele alabiliriz, ancak muhtemelen takvim tarihine göre bölümleme ve hareket etmelisiniz. her seferinde bir bölüm ... Ama burada çeşitli seçenekler var.
JNK

Geçen yıl yapmak istediklerinize bir örnek hazırladım. Hızlı ve pahalı bir dizide x günlük verileri tutmak ve arşiv verilerini daha ucuz depolamaya taşımak istediğimiz özel bir durumdu. Örnek bir senaryoyu temizleyebilirsem, gönderirim, aksi takdirde sadece sürecin bir özeti olacaktır.
Mark Storey-Smith

merhaba mark, evet lütfen ve eğer deneyimlerinizi de paylaşabiliyorsanız. başarılı mıydı?
Diego

İşe yarıyor ama sonuçta gereksizdi (daha basit bir yol izledik). Belki de davanızda 60 günlük sınırın neden mevcut olduğunu genişletebilirsiniz? Herkesin size doğru yönü göstermesine yardımcı olur.
Mark Storey-Smith

Yanıtlar:


6

Bölümleme ile her gün bir bölüm yapmak zorunda kalacaksınız, bu da SQL Server 2012 öncesi Pre-SQL 2012 sınırını sadece 3 yıllık arşive izin verecek şekilde yeni bir perspektife yerleştiriyor. SQL Server 2012 ile günde 1 bölüm için bol olan 15000 bölüm elde edersiniz.

Her gün yeni bir bölüm eklersiniz. 61. günkü bölümü taşımak istiyorsanız, bunu verimli bir şekilde yapabilirsiniz, ancak yine de çevrimdışı bir işlemdir. Bkz. Bölümü Etkin Bir Şekilde Farklı Bir Dosya Grubuna Taşıma .

Tüm dizinlerinizin hizalanması gerekir, bkz . Bölümlenmiş Dizinler için Özel Yönergeler .

Bölümleme içine Alış kolay decission değildir ve çiğnemek için oldukça büyük bir lokma olabilir ... bkz karar için nasıl Kullanmaları Tablo Partisyonlama'ya eğer . Özellikle bölümlendirmeden performans artışı beklememelisiniz. Performans sorunlarına tarih saatine göre kümelenerek en kısa sürede yaklaşmalısınız.


Yeni sınır 2008 SP2 ve 2008 R2 SP1'de geçerlidir. blogs.msdn.com/b/hanspo/archive/2010/11/29/…
Jon

@Jon: 2008 SP2, 2008R2 SP1 uygulaması büyük bir uyarı ile geliyor . As explained in this white paper, there are implications on certain features, including performance.. SQL 2012 desteği uyarı içermez.
Remus Rusanu

Bunu işaret ettiğiniz için teşekkürler; 2008/2008 R2'de kullanmak için bazı uyarılar olduğu doğru, ancak gerekirse mevcut bir seçenek.
Jon Seigel

yorumun için teşekkürler. Maddi yorumu daha sonra okuyacağım
Diego

2

Bölümleme işlevinin dinamik olup olmadığını bilmiyorum ama bundan şüphe ediyorum. Bu rotaya gitmeden sizin için bazı seçenekler:

1 - DATE takvimindeki bölüm ve her gün en eski bölümden çıkma

2 - Tarihe filtre uygulayan bir görünüm oluşturun ve mevcut tüm sorgularınızı oraya yönlendirin (bu, temel tabloyu başka bir şeye yeniden adlandırarak ve mevcut tablonun adının ne olduğunu isimlendirerek kolayca yönetilebilir). Bu, dizin değişiklikleriyle de optimize edilebilir.

Sorgularınızda tarih alanını kullanırsanız yukarıdaki ilk seçeneğin çok daha iyi çalışacağını unutmayın. Bunu yapmazsanız, mevcut işlemden daha hızlı olur, ancak sorgularda büyük bir gelişme olmaz. Bölümleme genel olarak bölümleme alanınıza filtre uygulayabiliyorsanız ve optimize edici hangi bölüme bakacağınızı bilirse en iyi sonucu verir.


Ben "her gün" manuel operasyonları önlemek istiyorum
Diego

2

Sizin için nelerin çalışması gerektiğine bakın: DB_A - son 60 günün her biri için farklı bir bölüm içeren tableA - stagingTable'ı en eski bölümden taşımak için

DB_Archive tableA - 60 günden eski tüm verileri saklar. (bölümlenmemiş)

Süreç: 1. gün sonundan önce: bölüm işlevini değiştir - yeni güne yeni bir bölüm eklemek için bölünmüş aralık. (Not: "bugünün tarihi + 1 gün" için bölümler oluşturmak yerine birkaç adım önde olmak isteyebilirsiniz. Örneğin: "bugünün tarihi + 5 gün"

  1. Her günün sonunda, önce DB_A.tableA içindeki en eski bölümü DB_A.stagingTable olarak değiştirirsiniz; En eski bölümleri birleştirin.

  2. DB_A.stagingTable'dan DB_Archive.tableA'ya veri aktarın. Sonunda DB_A.stagingTable trunacte

Yukarıya Yuvarlanan Pencere denir ve VLDB'ler için oldukça yaygın bir senaryodur. Bölümleme hakkında microsoft'un şu teknik incelemesine bakın: Bölüm tablosu ve dizin stratejileri veya bunu özellikle Sürgülü Pencere senaryosunda deneyin


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.