Thống kê bảo trì chức năng (autostats) trong SQL Server

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch máy của Microsoft chứ không phải do con người dịch. Microsoft cung cấp các bài viết do con người dịch và cả các bài viết do máy dịch để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng ngôn ngữ của bạn. Tuy nhiên, bài viết do máy dịch không phải lúc nào cũng hoàn hảo. Loại bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, giống như một người nước ngoài có thể mắc sai sót khi nói ngôn ngữ của bạn. Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra. Microsoft cũng thường xuyên cập nhật phần mềm dịch máy này.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này:195565
Bài viết này đã được lưu trữ. Bài viết được cung cấp "nguyên trạng" và sẽ không còn được cập nhật nữa.
TÓM TẮT
Các chức năng mới được giới thiệu thống kê bảo trì, AutoStat, có thểtạo ra không mong muốn trên cao trên một hệ thống sản xuất bằng cách thực hiện một trong cáchành động sau đây:
  • Bắt đầu Cập Nhật thống kê trong thời kỳ nặng sản xuất.

    - hay -
  • Bắt đầu một số quá mức cao của các quá trình Cập Nhật thống kê tại một điểm nhất định trong thời gian.
Mục đích của bài viết này là để chi tiết các điều kiện theo đó bạn có thểmong đợi để xem autostats được tạo ra và thống kê Cập Nhật đang được chạy chống lạibảng trong cơ sở dữ liệu.

Thông tin về autostats trong SQL Server 2000, xem "Sử dụng số liệu thống kê bởi trình tối ưu hoá truy vấn trong Microsoft SQL Server 2000" tại MSDN Web site sau:

Chú ý Nếu bạn đang sử dụng Microsoft SQL Server 2005, xem giấy trắng Microsoft sau đây để biết thông tin về làm thế nào thống kê được sử dụng bởi trình tối ưu hoá truy vấn SQL Server 2005:
THÔNG TIN THÊM

Thông tin chung

SQL Server sử dụng của tôi ưu một dựa trên chi phí hoa có thể vô cùngnhạy cảm với thông tin thống kê được cung cấp trên bảng vàchỉ số. Mà không chính xác và up-to-date thông tin thống kê, SQL Servercó thể được thử thách để xác định kế hoạch thực hiện tốt nhất của một cụ thểtruy vấn.

Thống kê duy trì trên mỗi bàn trong SQL Server để hỗ trợ tối ưu hóatrong chi phí dựa trên quyết định thực hiện bao gồm các:
  • Số lượng các hàng trong bảng.
  • Số lượng các trang được sử dụng bởi bảng.
  • Số cải tiến thực hiện để các phím của bàn kể từ cuối Cập nhật các số liệu thống kê.
Thông tin bổ sung được lưu trữ cho chỉ số, bao gồm cả (cho mỗi chỉ số):
  • Một biểu đồ equi-chiều cao trên cột đầu tiên.
  • Mật độ trên tất cả các cột tiền tố.
  • Trung bình chiều dài chính.
Thống kê về chỉ số được tự động tạo ra bất cứ khi nào một chỉ số mớiđược xây dựng. Ngoài ra, nó là bây giờ có thể để tạo ra và duy trì các số liệu thống kê trêncột khác là tốt.

Để duy trì các thông tin thống kê trong một thời trang như up-to-datecó thể, SQL Server giới thiệu AutoStat, trong đó, thông qua máy chủ SQLGiám sát thay đổi trong bảng, có khả năng tự động cập nhật cácthống kê cho một bảng khi một ngưỡng thay đổi nhất định đã đạt tới.Ngoài ra, SQL Server giới thiệu thống auto-tạo-kê, màgây ra máy chủ để tự động tạo ra tất cả các số liệu thống kê cần thiết cho cácchính xác tối ưu hóa của một truy vấn cụ thể.

Việc xác định khi AutoStat thế hệ là sắp xảy ra

Như đã đề cập ở trên, AutoStat sẽ tự động cập nhật các số liệu thống kê chomột bảng cụ thể khi một "ngưỡng thay đổi" đã đạt tới. Cácsysindexes.rowmodctr cột duy trì một chạy tổng của tất cả các sửa đổimột bảng mà, qua thời gian, có thể ảnh hưởng đến bộ vi xử lý truy vấnquyết định làm cho quá trình. Số lượt truy cập này được cập nhật mỗi khi bất kỳ của cácsau sự kiện xảy ra:
  • Chèn một đơn hàng được thực hiện.
  • Xóa đơn hàng được thực hiện.
  • Một Cập Nhật cho một cột được đánh chỉ mục được thực hiện.
LƯU Ý: TRUNCATE bảng không Cập Nhật rowmodctr.

Sau khi bảng số liệu thống kê đã được Cập Nhật, giá trị rowmodctr đặt lại về 0và phiên bản đồ bảng số liệu thống kê được Cập Nhật.

Hơn nữa, trong những tình huống mà trong đó thực hiện một thủ tục được lưu trữ kế hoạch làLấy từ bộ nhớ cache và rằng kế hoạch là nhạy cảm với số liệu thống kê, thống kêPhiên bản đồ sẽ được so sánh với phiên bản hiện tại. Nếu không có mớithống kê có sẵn, kế hoạch cho các thủ tục được lưu trữ sẽ được biên.

Thuật toán cơ bản để tự động Cập Nhật số liệu thống kê là:
  • Nếu cardinality cho một bảng là ít hơn sáu và bảng trong cơ sở dữ liệu tempdb, tự động Cập Nhật với mỗi sửa đổi sáu đến bảng.
  • Nếu cardinality cho một bảng là lớn hơn 6, nhưng ít hơn hoặc bằng với 500, Cập nhật tình trạng sửa đổi 500 mỗi.
  • Nếu cardinality cho một bảng là lớn hơn 500, Cập Nhật thống kê khi (500 + 20 phần trăm của bảng) thay đổi đã xảy ra.
  • Đối với bảng biến, thay đổi cardinality không kích hoạt tự động Cập Nhật số liệu thống kê.
LƯU Ý: Trong ý nghĩa chặt chẽ nhất này, SQL Server đếm cardinality như là số hàng trong bảng.

LƯU Ý: Thêm vào cardinality, chọn lọc predicate cũng ảnh hưởng đến thế hệ AutoStats. Điều này có nghĩa rằng số liệu thống kê có thể không Cập Nhật afer mỗi sửa đổi 500 nếu cardinality đã < 500="" or="" for="" every="" 20%="" of="" changes="" if="" cardinality="" were=""> 500. Quy mô lên yếu tố (giá trị khoảng 1-4, 1 và 4 bao gồm) được tạo ra tùy thuộc vào sự chọn lọc và một sản phẩm của yếu tố này và một số thay đổi như thu được từ các thuật toán sẽ là số cải tiến cần thiết cho thế hệ AutoStats, thực tế.

Các thuật toán ở trên có thể được tóm tắt trong hình thức một bảng:
_________________________________________________________________________________ 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)___________________________________________________________________________TableVariables   | Change in cardinality does not affect AutoStats generation.___________________________________________________________________________
Sau đây là hai ví dụ để giúp chứng minh khái niệm này:

Ví dụ 1

Xem xét tác giả bảng trong cơ sở dữ liệu quán rượu, có chứa các hàng 23 vàcó hai chỉ số. Các chỉ số nhóm độc đáo, UPKCL_auidind, được lập chỉ mục trênmột cột, au_id, và một chỉ số tổng hợp của nonclustered, aunmind, đãthành lập ngày au_lname và au_fname cột. Bởi vì bảng này chứaít hơn 500 hàng, AutoStat sẽ bắt đầu sau khi 500 thay đổi bảngdữ liệu đã xảy ra. Những thay đổi có thể là một trong 500 hay nhiều Chen, xóa,thay đổi đối với một cột được đánh chỉ mục như au_lname, hoặc bất kỳ kết hợp nào đó.

Bạn có thể, do đó, dự đoán khi số liệu thống kê Cập Nhật sẽ được khởi xướng bởiGiám sát giá trị sysindexes.rowmodctr, mà sẽ được incremented khimỗi lần Cập Nhật. Khi nó đạt đến hoặc vượt quá 500, bạn có thể mong đợi Cập NhậtThống kê phải được bắt đầu.

Ví dụ 2

Xem xét một bảng thứ hai, t2, có một cardinality 1000. Bànvới hơn 500 hàng, SQL Server sẽ Cập Nhật thống kê khi (500+ 20 phần trăm) thay đổi đã được thực hiện. Làm như toán học, 20 phần trăm của 1.000là 200, do đó, bạn có thể mong đợi để xem AutoStat bắt đầu sau khi khoảng 700Sửa đổi đã được thực hiện để bàn.

Tự động hoá Autostats quyết tâm

Để tự động xác định khi AutoStat sẽ được chạy, bạn có thể cuộc thăm dòcác sysindexes bảng và xác định khi sửa đổi bảng tiếp cận cácđiểm khởi đầu. Dưới đây là một thuật toán cơ bản để làm như vậy:
   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				

Sau đó, bạn có thể lịch trình một công việc để làm như sau:
  • Chạy Cập Nhật thống kê chống lại tất cả các bảng mà bạn buộc phải vô hiệu hóa chúng trong ngày.

    - và -
  • Kích hoạt lại AutoStat, bởi vì mỗi bảng sửa đổi số lượt truy cập sẽ đã được đặt thành 0 khi Cập Nhật số liệu thống kê được chạy.

Việc kiểm soát liệu thống kê UPDATE đang chạy chống lại một bảng

Giải pháp rõ ràng nhất cho câu hỏi này, khi AutoStat đã chứng minh đượcProblematic, là để vô hiệu hoá tự động thế hệ thống kê, do đó để lại cáccơ sở dữ liệu quản trị viên miễn phí để lịch trình Cập Nhật số liệu thống kê trong thời gian ít hơnlần xâm nhập. Bạn có thể làm điều này hoặc bằng cách sử dụng số liệu thống kê Cập Nhậttuyên bố hoặc các sp_autostats lưu trữ thủ tục. Cú pháp cho Cập NhậtThống kê tuyên bố là:
   UPDATE STATISTICS <table>...with NORECOMPUTE				

Cú pháp cho các thủ tục sp_autostats lưu trữ là:
sp_autostats <table_name>, <stats_flag>, <index_name></index_name></stats_flag></table_name>
nơi <stats_flag> là một trong hai "" hoặc "tắt".</stats_flag>

Bạn cũng có thể sử dụng sp_dboption để vô hiệu hóa sự xuất hiện tự động Cập NhậtThống kê hoặc tạo ra số liệu thống kê trên một mức độ cho mỗi sở dữ liệu:
sp_dboption <dbname>, 'tự động Cập Nhật thống kê', <on |="" off=""> <b00></b00></on></dbname>

- hay -

sp_dboption <dbname>, 'tự động tạo ra thống kê', <on |="" off=""></on></dbname>

Kiểm soát số lượng đồng thời Cập Nhật thống kê quy trình

Hiện nay, ngắn của vô hiệu hóa AutoStat cho các bảng cụ thể, nó không phải làcó thể cấu hình số tự động Cập Nhật số liệu thống kê báo cáomà đang được chạy đồng thời (DCR 51539 đã được đệ trình này). Cáchệ phục vụ, tuy nhiên, hạn chế số lượng đồng thời Cập Nhật thống kêquy trình lên 4 cho mỗi bộ vi xử lý.

Việc xác định khi Autostats đang được điều hành

Bạn có thể sử dụng dấu vết cờ 205 báo khi một phụ thuộc vào số liệu thống kê lưu trữthủ tục đang được biên như là kết quả của AutoStat. Này cờ watersẽ viết thư sau đây để lỗi đăng nhập:
1998-10-15 11:10:51.98 spid9 Recompile phát hành: ProcName: sp_helpindex
LineNo: 75 StmtNo: 29
Khi dấu vết cờ 205 được kích hoạt, thông báo sau cũng sẽ khung cácAutoStat tin nhắn từ 8721 khi số liệu thống kê được Cập Nhật. Việc mởthông điệp của khung có thể được phân biệt bởi giá trị RowModCnt, màsẽ lớn hơn 0. Khung cuối cùng, sau khi các số liệu thống kê UPDATE,sẽ có một giá trị RowModCnt 0:
1998-10-15 11:38:43.68 spid8 Schema thay đổi: Tbl Dbid: 7 Objid:
133575514 RowModCnt: 60500 RowModLimit: 60499
Thư này, "rowmodcnt" là tổng số sửa đổi để cácbảng. "rowmodlimit" là ngưỡng mà, khi vượt quá, kết quả trong mộtThống kê UPDATE tuyên bố thực hiện cho các bảng.

Nó cũng có thể để cho phép dấu vết cờ 8721, mà sẽ bãi chứa thông tinvào lỗi đăng nhập khi AutoStat đã được điều hành. Sau đây là mộtVí dụ về loại tin nhắn mà bạn có thể thấy:
1998-10-14 16:22:13.21 spid13 AUTOSTATS: Cập Nhật Tbl: [tác giả]
Hàng: 23 Mods: 501 Bound: 500 thời gian thực hiện: 47ms UpdCount: 2
Thư này, "Mods" là tổng số sửa đổi để bàn."Ràng buộc" ngưỡng sửa đổi, "Thời gian" là số tiền của thời gianmà tuyên bố thống kê Cập Nhật cần thiết để hoàn thành, và "updcount"là bá tước của thống kê Cập Nhật.

Bạn cũng có thể sử dụng SQL Server Profiler để xác định khi Cập Nhật số liệu thống kêlời tuyên bố đang được chạy. Để thực hiện việc này, thực hiện theo các bước sau:
  1. Trên các Hồ sơ trình đơn, nhấp vào Công cụ, và sau đó nhấp vào Tuỳ chọn.
  2. Trên các Tổng quát tab, đi đến Sự kiện, và chọn Tất cả các lớp học tổ chức sự kiện.
  3. Xác định một dấu vết mới, và dưới Sự kiện, chọn Misc, chọn các Thống kê cập nhật tự động Sub-event.
Lưu Ý: Nếu số liệu thống kê nhiều đang được Cập Nhật bởi AutoStat, một số lượng lớntin nhắn có thể được ghi vào Nhật ký lỗi. Triệt để thử nghiệm với cácwater cờ trước khi dùng nó trên bất kỳ sản xuất hoặc nếu không quan trọnghệ phục vụ.

Giản đồ ổ khóa

SQL Server sử dụng hai loại ổ khóa giản đồ, cả hai đều được thực hiệnkhi nó Cập nhật các số liệu thống kê cho một bảng:
   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.				
Bạn có thể xem các ổ khóa bằng cách chạy sp_lock hoặc bằng cách chọn từ cácsyslockinfo bảng.
prodsql chỉ số không nhóm stat tung ra errorlog SQL Server Profiler

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 195565 - Xem lại Lần cuối: 12/05/2015 09:39:01 - Bản sửa đổi: 2.0

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

  • kbnosurvey kbarchive kbinfo kbmt KB195565 KbMtvi
Phản hồi