Statistik pemeliharaan fungsi (autostats) di SQL Server

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 195565 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Fungsionalitas baru diperkenalkan statistik pemeliharaan, AutoStat, mungkin menghasilkan overhead yang tidak diinginkan pada sistem produksi dengan melakukan salah satu tindakan berikut:
  • Memulai statistik update selama periode produksi berat.

    -atau-
  • Memulai sejumlah proses UPDATE statistik pada titik tertentu terlalu tinggi dalam waktu.
Tujuan artikel ini adalah untuk detail kondisi di mana Anda dapat mengharapkan untuk melihat autostats dihasilkan dan UPDATE statistik yang dijalankan terhadap tabel dalam database.

Untuk informasi tentang autostats di SQL Server 2000, lihat "Statistik digunakan oleh Query Optimizer di Microsoft SQL Server 2000" di situs Website MSDN berikut:
.aspx http://msdn2.Microsoft.com/en-us/library/aa902688 (SQL.80)


Catatan Jika Anda menggunakan Microsoft SQL Server 2005, melihat kertas putih Microsoft berikut untuk informasi tentang bagaimana statistik yang digunakan oleh Pengoptimal query di SQL Server 2005:
http://technet.Microsoft.com/en-us/library/cc966419.aspx

INFORMASI LEBIH LANJUT

Informasi umum

SQL Server menggunakan Pengoptimal berbasis biaya yang dapat sangat sensitif terhadap informasi statistik yang disediakan pada tabel dan indeks. Tanpa benar dan up-to-date informasi statistik, SQL Server dapat ditantang untuk menentukan rencana pelaksanaan terbaik untuk tertentu permintaan.

Statistik dipelihara di setiap meja di SQL Server untuk membantu Pengoptimal dalam berbasis biaya keputusan meliputi:
  • Jumlah baris dalam tabel.
  • Jumlah halaman yang digunakan oleh tabel.
  • Jumlah modifikasi yang dibuat pada tombol meja sejak update terakhir statistik.
Informasi tambahan disimpan untuk indeks, termasuk (untuk setiap indeks):
  • Histogram equi-tinggi pada kolom pertama.
  • Kepadatan pada semua kolom awalan.
  • Rata-rata panjang kunci.
Statistik pada indeks secara otomatis dibuat setiap kali indeks baru dibangun. Selain itu, sekarang ini mungkin untuk menciptakan dan memelihara statistik pada kolom lain juga.

Untuk menjaga informasi statistik dalam mode sebagai up-to-date sebagai mungkin, SQL Server memperkenalkan AutoStat, yang, melalui SQL Server pemantauan meja modifikasi, mampu secara otomatis memperbarui Statistik untuk tabel ketika ambang perubahan tertentu telah tercapai. Selain itu, SQL Server memperkenalkan auto-membuat-statistik, yang menyebabkan server untuk secara otomatis menghasilkan semua statistik yang diperlukan untuk akurat optimasi pencarian tertentu.

Menentukan ketika AutoStat generasi dekat

Seperti disebutkan di atas, AutoStat akan secara otomatis memperbarui statistik untuk meja tertentu ketika "perubahan ambang batas" telah tercapai. The sysindexes.rowmodctr kolom mempertahankan berjalan total dari semua modifikasi tabel itu, dari waktu ke waktu, dapat mempengaruhi permintaan prosesor proses pengambilan keputusan. Counter ini diperbarui setiap kali salah Setelah peristiwa terjadi:
  • Satu baris insert dibuat.
  • Hapus baris tunggal dibuat.
  • Update ke kolom diindeks dibuat.
CATATAN: TRUNCATE tabel tidak memperbarui rowmodctr.

Setelah tabel statistik telah diperbarui, nilai rowmodctr diatur ke 0 dan tabel statistik skema versi diperbarui.

Lebih lanjut, dalam situasi di mana rencana pelaksanaan prosedur yang disimpan adalah diambil dari cache dan rencana yang sensitif terhadap statistik, statistik skema versi akan dibandingkan dengan versi sekarang. Jika ada yang baru Statistik yang tersedia, rencana untuk prosedur yang tersimpan akan recompiled.

Algoritma dasar untuk auto update statistik adalah:
  • Jika cardinality untuk tabel kurang dari enam dan tabel dalam database Code, auto update dengan modifikasi setiap enam ke meja.
  • Jika cardinality untuk tabel lebih besar dari 6, tapi kurang dari atau sama dengan 500, memperbarui status modifikasi setiap 500.
  • Jika cardinality untuk meja lebih besar dari 500, memperbarui statistik ketika (500 + 20 persen dari tabel) perubahan telah terjadi.
  • Untuk tabel variabel, cardinality perubahan tidak memicu auto update statistik.
CATATAN: Dalam pengertian ini ketat, SQL Server menghitung cardinality sebagai jumlah baris dalam tabel.

CATATAN: Selain untuk cardinality, selektivitas predikat juga mempengaruhi AutoStats generasi. Ini berarti bahwa statistik tidak mungkin diperbarui afer modifikasi setiap 500 jika cardinality < 500="" or="" for="" every="" 20%="" of="" changes="" if="" cardinality="" were=""> 500. Skala atas faktor (nilai berkisar dari 1 sampai 4, 1 dan 4 inklusif) yang dihasilkan tergantung pada selektivitas dan produk dari faktor ini dan beberapa perubahan seperti yang Diperoleh dari algoritma akan jumlah sebenarnya modifikasi yang diperlukan untuk AutoStats generasi.

Algoritma di atas dapat diringkas dalam bentuk tabel:
_________________________________________________________________________________
 Table Type | Empty Condition | Threshold When Empty |Threshold When Not Empty 
_________________________________________________________________________________
 Permanent  | < 500 rows      | # of Changes >= 500  | # of Changes >= 500 + (20% of Cardinality)
___________________________________________________________________________
 Temporary  | < 6 rows        | # of Changes >= 6    | # of Changes >= 500 + (20% of Cardinality)
___________________________________________________________________________
Table
Variables   | Change in cardinality does not affect AutoStats generation.
___________________________________________________________________________
Berikut adalah dua contoh untuk membantu menunjukkan konsep ini:

Contoh 1

Mempertimbangkan penulis tabel dalam database Pub, yang berisi baris 23 dan memiliki dua indeks. Indeks berkerumun unik, UPKCL_auidind, diindeks di satu kolom, au_id, dan nonclustered composite index, aunmind, telah dibuat pada au_lname dan au_fname kolom. Karena tabel ini berisi kurang dari 500 baris, AutoStat akan mulai setelah 500 perubahan ke meja data telah terjadi. Perubahan dapat menjadi salah satu 500 atau lebih memasukkan, menghapus, perubahan ke kolom diindeks seperti au_lname, atau kombinasi daripadanya.

Anda dapat, oleh karena itu, memprediksi ketika UPDATE statistik akan diprakarsai oleh pemantauan nilai sysindexes.rowmodctr, yang akan bertambah setelah setiap update. Ketika itu mencapai atau melebihi 500, Anda dapat mengharapkan UPDATE Statistik untuk dimulai.

Contoh 2

Mempertimbangkan tabel kedua, t2, yang telah cardinality 1.000. Untuk tabel dengan lebih dari 500 baris, SQL Server akan UPDATE statistik ketika (500 + 20 persen) perubahan yang telah dibuat. Melakukan matematika, 20 persen dari 1.000 adalah 200, sehingga Anda dapat mengharapkan untuk melihat AutoStat mulai setelah sekitar 700 modifikasi telah dibuat ke meja.

Mengotomatisasi penentuan Autostats

Untuk mengotomatisasi penentuan ketika AutoStat akan berjalan, Anda dapat jajak pendapat sysindexes meja dan mengidentifikasi ketika meja modifikasi mencapai titik awal. Berikut ini adalah algoritma dasar untuk melakukannya:
   if (sysindexes.rows > 500)
      if (sysindexes.rows * 0.20 >= sysindexes.rowmodctr && production
      hours) //500 change leeway
         begin
            disable autostats
            log autostats disable
         end
      else
         begin
            stats ok
         end
   else
      if (sysindexes.rowmodctr >= 425) //75 change leeway
         begin
            disable autostats
            log autostats disable
         end
				

Anda kemudian dapat menjadwal pekerjaan melakukan hal berikut:
  • Menjalankan UPDATE statistik terhadap semua tabel yang Anda dipaksa untuk menonaktifkan mereka selama hari.

    -dan-
  • Mengaktifkan kembali AutoStat, karena setiap meja modifikasi counter akan memiliki telah di-reset ke 0 ketika UPDATE statistik dijalankan.

Mengontrol apakah UPDATE statistik menjalankan tabel

Solusi yang paling jelas untuk pertanyaan ini, ketika AutoStat telah terbukti Problematic, adalah untuk menonaktifkan auto statistik generasi, sehingga meninggalkan database administrator gratis untuk menjadwal pembaruan statistik selama kurang kali mengganggu. Anda dapat melakukan hal ini baik dengan menggunakan statistik UPDATE pernyataan atau sp_autostats disimpan prosedur. Sintaks untuk UPDATE Statistik pernyataan adalah:
   UPDATE STATISTICS <table>...with NORECOMPUTE
				

Sintaks untuk sp_autostats disimpan prosedur adalah:
sp_autostats <table_name>, <stats_flag>, <index_name> </index_name> </stats_flag> </table_name>
dimana <stats_flag>adalah baik "pada" atau "mati". </stats_flag>

Anda juga dapat menggunakan sp_dboption untuk menonaktifkan terjadinya otomatis UPDATE Statistik atau membuat statistik pada tingkat per-database:
sp_dboption <dbname>, 'auto update statistik', <on |="" off=""><b00></b00> </on> </dbname>

-atau-

sp_dboption <dbname>, 'auto buat statistik', <on |="" off=""> </on> </dbname>

Mengendalikan jumlah bersamaan proses UPDATE statistik

Saat ini, pendek menonaktifkan AutoStat untuk tabel, tidaklah mungkin untuk mengkonfigurasi jumlah otomatis UPDATE statistik pernyataan yang sedang dijalankan secara bersamaan (DCR 51539 telah diajukan untuk ini). The server, namun, membatasi jumlah bersamaan UPDATE statistik proses untuk empat per prosesor.

Menentukan ketika Autostats menjalankan

Anda dapat menggunakan jejak bendera 205 melaporkan ketika bergantung statistik disimpan prosedur recompiled sebagai akibat dari AutoStat. Bendera jejak akan menulis pesan berikut untuk log kesalahan:
1998-10-15 11:10:51.98 spid9 mengkompilasi ulang dikeluarkan: ProcName: sp_helpindex
LineNo: 75 StmtNo: 29
Ketika jejak bendera 205 diaktifkan, pesan berikut akan juga braket AutoStat pesan dari 8721 ketika statistik diperbarui. Pembukaan pesan dari braket dapat dibedakan oleh nilai RowModCnt, yang akan lebih besar daripada 0. Penutupan braket, setelah UPDATE statistik, akan memiliki nilai RowModCnt 0:
1998-10-15 11:38:43.68 skema spid8 mengubah: Tbl Dbid: 7 Objid:
133575514 RowModCnt: 60500 RowModLimit: 60499
Untuk pesan ini, "RowModCnt" adalah jumlah modifikasi tabel. "RowModLimit" adalah ambang batas yang, ketika melebihi, mengakibatkan UPDATE statistik pernyataan eksekusi untuk meja.

Juga dimungkinkan untuk mengaktifkan jejak bendera 8721, yang akan membuang informasi ke error log yang ketika AutoStat telah dijalankan. Berikut adalah contoh dari jenis pesan yang dapat Anda harapkan untuk melihat:
1998-10-14 16:22:13.21 spid13 AUTOSTATS: DIPERBARUI Tbl: [penulis]
Baris: 23 modifikasi: 501 terikat: 500 durasi: 47ms UpdCount: 2
Untuk pesan ini, "Modifikasi" adalah jumlah modifikasi ke meja. "Terikat" ambang batas modifikasi, "Durasi" adalah jumlah waktu yang UPDATE statistik pernyataan yang diperlukan untuk menyelesaikan, dan "UpdCount" adalah menghitung statistik diperbarui.

Anda juga dapat menggunakan SQL Server Profiler untuk mengidentifikasi kapan UPDATE statistik pernyataan yang dijalankan. Untuk melakukannya, lakukan langkah-langkah berikut:
  1. Pada Profiler menu, klik Alat, lalu klik Opsi.
  2. Pada General tab, pergi ke Peristiwa, kemudian pilih Semua peristiwa kelas.
  3. Mendefinisikan jejak baru, dan di bawah Peristiwa, pilih Misc, pilih Auto-Update statistik sub-Event.
Catatan: Jika banyak statistik diperbarui oleh AutoStat, sejumlah besar pesan dapat ditulis ke log kesalahan. Benar-benar melakukan percobaan dengan ini jejak bendera sebelum menggunakan mereka pada setiap produksi atau sebaliknya kritis server.

Skema kunci

SQL Server mempekerjakan dua jenis skema kunci, yang diambil ketika memperbarui statistik untuk tabel:
   Sch-S: Schema Stability Lock
   ----------------------------
   This lock ensures that a schema element, such as a table or index, will
   not be dropped while any session holds a schema stability lock on the
   schema element.

   Sch-M-UPD-STATS: Schema Modification Lock
   -----------------------------------------
   This is a non-blocking lock that is used by the system to ensure that
   only one automatic UPDATE STATISTICS process is run against a table at
   any given point in time. The sp_lock stored procedure will report this
   lock has having a type = TAB, resouce = UPD-STATS and mode = SCH-M.
				
Anda dapat melihat kunci ini dengan menjalankan sp_lock atau dengan memilih dari syslockinfo tabel.

Properti

ID Artikel: 195565 - Kajian Terakhir: 19 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Workgroup Edition
Kata kunci: 
kbinfo kbmt KB195565 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:195565

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com