Mô t? c?a SQL Server ch?n gây ra b?i biên d?ch ? khóa

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 263889 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

Trong Microsoft SQL Server, ch? có m?t b?n sao c?a m?t k? ho?ch th? t?c đư?c lưu tr? thư?ng là trong b? nh? cache t?i m?t th?i đi?m. Thi hành đi?u này đ?i h?i ph?i đăng thư?ng k? trên m?t s? ph?n c?a quá tr?nh biên so?n, và đ?ng b? hóa này đư?c th?c hi?n m?t ph?n b?ng cách s? d?ng biên d?ch ? khóa. N?u nhi?u k?t n?i đ?ng th?i đang ch?y cùng m?t lưu tr? th? t?c và m?t khóa biên d?ch ph?i đư?c l?y cho r?ng th? t?c đư?c lưu tr? m?i khi nó là ch?y, h? th?ng quá tr?nh ID (SPID) có th? b?t đ?u đ? ch?n nhau khi h? m?i c? g?ng đ? có đư?c m?t khóa biên d?ch đ?c quy?n trên đ?i tư?ng.

THÔNG TIN THÊM

Th? t?c đư?c lưu tr? đ?a là m?t l?i gi?i thích cho ? khóa biên d?ch trên m?t th? t?c đư?c lưu tr? ho?c kích ho?t. Các gi?i pháp trong trư?ng h?p này là đ? làm gi?m ho?c lo?i b? các recompiles. Cho m?t l?i gi?i thích nh?ng l? do ph? bi?n nh?t mà m?t th? t?c đư?c lưu tr? có th? ph?i đư?c biên và cho m?t s? thông tin h?u ích v? vi?c gi?m t?n s? c?a recompiles, xem bài vi?t cơ s? ki?n th?c Microsoft sau:
243586 X? l? s? c? th? t?c đư?c lưu tr? đ?a
M?t k?ch b?n trong đó biên d?ch ? khóa x?y ra là khi các đi?u ki?n sau là đúng:
  • Ngư?i s? d?ng ngư?i đi?u hành các th? t?c đư?c lưu tr? không ph?i là ch? s? h?u c?a các th? t?c.
  • Th? t?c đư?c lưu tr? tên không ph?i là hoàn toàn đ? đi?u ki?n v?i tên c?a ch? s? h?u đ?i tư?ng.
Ví d?, n?u ngư?i s? d?ng "dbo" s? h?u đ?i tư?ng dbo.mystoredproc và ngư?i dùng khác, "Harry," ch?y th? t?c này đư?c lưu tr? b?ng cách s? d?ng l?nh "exec mystoredproc," vi?c tra c?u ban đ?u b? nh? cache b?ng tên đ?i tư?ng không thành công v? các đ?i tư?ng không đ? đi?u ki?n ch? s? h?u. (Nó không đư?c bi?t cho dù m?t th? t?c đư?c lưu tr? đư?c đ?t tên Harry.mystoredproc t?n t?i. V? v?y, SQL Server không th? ch?c ch?n r?ng k? ho?ch lưu tr? cho dbo.mystoredproc là đi?u đúng đ? th?c hi?n.) SQL Server sau đó l?y đư?c m?t biên d?ch đ?c quy?n khóa v? th? t?c và làm cho chu?n b? đ? biên d?ch các th? t?c. Đi?u này bao g?m vi?c gi?i quy?t tên đ?i tư?ng cho m?t đ?i tư?ng c?a b?n. Trư?c khi máy ch? SQL biên d?ch các k? ho?ch, SQL Server s? d?ng ID đ?i tư?ng này đ? th?c hi?n m?t t?m ki?m chính xác hơn c?a b? nh? cache c?a th? t?c và có th? xác đ?nh v? trí m?t k? ho?ch biên d?ch trư?c đó th?m chí không có ch? s? h?u b?ng c?p.

N?u m?t k? ho?ch hi?n t?i đư?c t?m th?y, SQL Server reuses k? ho?ch lưu tr? và không th?c s? biên d?ch các th? t?c đư?c lưu tr?. Tuy nhiên, vi?c thi?u các ch? s? h?u b?ng c?p l?c lư?ng SQL Server đ? th?c hi?n m?t tra c?u b? nh? cache th? hai và có đư?c m?t biên d?ch đ?c quy?n khóa trư?c khi chương tr?nh xác đ?nh r?ng k? ho?ch th?c hi?n đư?c lưu tr? hi?n có th? đư?c tái s? d?ng. Vi?c thu th?p các khóa và th?c hi?n tra c?u và các công vi?c khác c?n thi?t đ? ti?p c?n v?i th?i đi?m này có th? gi?i thi?u m?t s? ch?m tr? cho các ? khóa biên d?ch d?n đ?n ch?n. Đây là đ?c bi?t đúng n?u nhi?u ngư?i s? d?ng không ph?i là ch? s? h?u các th? t?c đư?c lưu tr? ch?y đ?ng th?i các th? t?c mà không cung c?p tên c?a ch? s? h?u. Lưu ? r?ng ngay c? khi b?n không th?y SPID đang ch? biên d?ch ? khóa, thi?u văn b?ng ch? s? h?u có th? gi?i thi?u s? ch?m tr? trong th?c hi?n th? t?c đư?c lưu tr? và làm cho vi?c s? d?ng CPU cao không c?n thi?t.

Các chu?i s? ki?n sau đây s? đư?c ghi l?i trong m?t d?u v?t SQL Server Profiler khi v?n đ? này x?y ra. (Đ? theo d?i các s? ki?n liên quan đ?n b? nh? cache, b?n ph?i cho phép s? ki?n tiên ti?n. Đ? làm đi?u này, b?mTuỳ chọn trên các Công cụ tr?nh đơn, và sau đó ch?n T?t c? các l?p h?c t? ch?c s? ki?n.)

Thu g?n b?ng nàyBung r?ng b?ng này
S? ki?n classVăn b?n
RPC: b?t đ?umystoredproc
SP:CacheMissmystoredproc
SP:ExecContextHitmystoredproc
SP: b?t đ?umystoredproc
......

SP:CacheMissx?y ra khi vi?c tra c?u b? nh? cache theo tên không. Sau đây SP:ExecContextHit ch? ra r?ng m?t k? ho?ch lưu tr? k?t h?p cu?i cùng đ? đư?c t?m th?y trong b? nh? cache sau khi đ?i tư?ng không r? tên đ? đư?c gi?i quy?t cho m?t đ?i tư?ng c?a b?n. Tùy thu?c vào hoàn c?nh, SP:CacheHitcó th? xu?t hi?n thay v?SP:ExecContextHit.

Các gi?i pháp cho v?n đ? này biên d?ch khóa là đ? đ?m b?o r?ng tham chi?u đ?n th? t?c đư?c lưu tr? đư?c đ? đi?u ki?n ch? s? h?u. (Thay v? c?a exec mystoredproc, s? d?ng exec dbo.mystoredproc.) Trong khi ch? s? h?u b?ng c?p là quan tr?ng v? l? do hi?u su?t, b?n không ph?i vư?t qua v?ng lo?i proc đ? lưu v?i tên cơ s? d? li?u đ? ngăn ch?n vi?c tra c?u b? sung b? nh? cache.

Ngăn ch?n đó gây ra b?i biên d?ch ? khóa có th? phát hi?n b?ng cách s? d?ng t?p l?nh ch?n ch?ng h?n như nh?ng ngư?i đư?c xác đ?nh trong bài vi?t cơ s? ki?n th?c Microsoft sau:
251004 INF: Làm th? nào đ? giám sát SQL Server 7.0 ch?n
271509 INF: Làm th? nào đ? giám sát SQL Server 2000 ch?n
Sau đây là m?t s? đ?c đi?m đi?n h?nh c?a biên d?ch ch?n mà có th? đư?c quan sát th?y trong đ?u ra t?p l?nh ch?n:
  • lastwaittype Đ?i v?i b? ch?n và (thư?ng) ch?n SPID là LCK_M_X (đ?c quy?n) và waitresource là d?ng "TAB: dbid:object_id Biên [[d?ch]],"nơi"object_id"là đ?i tư?ng c?a các th? t?c đư?c lưu tr? ID.
  • Ch?c năng ch?n có waittype 0x0000, t?nh tr?ng runnable. Blockees có waittype 0x000e (đ?c quy?n khóa), tr?ng thái ng?.
  • M?c dù th?i gian c?a các s? c? ch?n có th? dài, không có không có d?ch v? SPID duy nh?t là ch?n SPID khác trong m?t th?i gian dài. Ngư?i ta lăn ch?n. Ngay sau khi m?t tr?nh biên d?ch đư?c hoàn t?t, m?t d?ch v? SPID m?t hơn vai tr? c?a b? ch?n đ?ng đ?u trong m?t vài giây ho?c ít hơn, và như v?y.
Các thông tin sau đây là t? m?t b?n ch?p sysprocesses trong lo?i c?a ch?n:
   spid  blocked  waittype  waittime  lastwaittype  waitresource
   ----  -------  --------  --------  ------------  -------------------------
   
   221    29      0x000e    2141      LCK_M_X       TAB: 6:834102 [[COMPILE]]
   228    29      0x000e    2235      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    29   214      0x000e    3937      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    13   214      0x000e    1094      LCK_M_X       TAB: 6:834102 [[COMPILE]]
    68   214      0x000e    1968      LCK_M_X       TAB: 6:834102 [[COMPILE]]
   214     0      0x0000       0      LCK_M_X       TAB: 6:834102 [[COMPILE]]
Trong các waitresourcec?t ("6:834102"), 6 là cơ s? d? li?u ID và 834102 là đ?i tư?ng c?a b?n. Lưu ? r?ng ID đ?i tư?ng này thu?c v? m?t th? t?c đư?c lưu tr?, không đ? m?t b?ng (m?c dù lo?i khóa "TAB").

Chú ý
  • N?u b?n đang s? d?ng SQL Server 2005, nhi?u ngư?i trong s? các h? th?ng b?ng t? SQL Server 2000 bây gi? đư?c th?c hi?n như m?t t?p h?p các lư?t xem. Nh?ng quan đi?m đư?c g?i là lư?t xem kh? năng tương thích, và h? có ? ngh?a cho tương thích ngư?c ch?. S? l?n xem kh? năng tương thích v?ch tr?n cùng m?t siêu d? li?u đ? có s?n trong SQL Server 2000. Đ? bi?t thêm chi ti?t v? ánh x? gi?a các b?ng SQL Server 2000 h? th?ng và quan đi?m h? th?ng SQL Server 2005, xem ch? đ? "L?p b?n đ? SQL Server 2000 h? th?ng b?ng đ? SQL Server 2005 h? th?ng xem" trong SQL Server 2005 sách tr?c tuy?n.
  • N?u tên c?a b?n đư?c lưu tr? th? t?c b?t đ?u v?i ti?n t? "sp_" và không ph?i là trong cơ s? d? li?u t?ng th?, b?n nh?n th?ySP:CacheMissvư?t qua v?ng trư?c khi b? nh? đ?m hit cho m?i th?c hi?n ngay c? khi b?n ch? s? h?u-lo?i th? t?c đư?c lưu tr?. Đi?u này là do ti?n t? sp_ nói v?i SQL Server các th? t?c đư?c lưu tr? là m?t h? th?ng lưu tr? th? t?c, và h? th?ng lưu tr? th? t?c có đ? phân gi?i khác nhau tên quy t?c. (V? trí "ưa thích" là trong cơ s? d? li?u t?ng th?.) Tên c?a ngư?i dùng t?o ra các th? t?c đư?c lưu tr? nên không b?t đ?u v?i "sp_".
  • N?u m?t th? t?c ch? s? h?u đ? đi?u ki?n đư?c th?c hi?n v?i m?t trư?ng h?p khác nhau hơn th? t?c ch? s? h?u đ? đi?u ki?n đư?c l?p làm, các th? t?c đ? đi?u ki?n ch? s? h?u có th? có đư?c m?tCacheMiss ho?c yêu c?u m?t biên d?ch khóa nhưng cu?i cùng s? d?ng lưu tr? k? ho?ch. Do đó, đi?u này s? không th?c s? biên d?ch các th? t?c và không nên làm cho nhi?u c?a m?t trên cao. Nhưng trong m?t s? t?nh hu?ng, yêu c?u m?t khóa biên d?ch có th? gây ra m?t t?nh hu?ng "ch?n chu?i" n?u có r?t nhi?u SPID c? g?ng đ? th?c hi?n th? t?c tương t? v?i m?t trư?ng h?p khác nhau hơn so v?i các th? t?c đư?c l?p làm. Đi?u này đúng b?t k? s? th? t? s?p x?p ho?c collation mà đang đư?c s? d?ng trên máy ch? ho?c trên cơ s? d? li?u. L? do cho hành vi này là r?ng các thu?t toán mà đang đư?c s? d?ng đ? t?m các th? t?c trong b? nh? cache d?a trên giá tr? băm (v? l? do hi?u su?t), mà có th? thay đ?i n?u các trư?ng h?p là khác nhau.

    Các workaround là th? và t?o ra các th? t?c v?i trư?ng h?p tương t? như các th? t?c đư?c thi hành b?i các ?ng d?ng. B?n c?ng có th? ch?c ch?n r?ng các th? t?c đư?c th?c thi t? t?t c? các ?ng d?ng s? d?ng trư?ng h?p tương t?.
  • N?u b?n c? g?ng th?c hi?n m?t th? t?c đư?c lưu tr? như là m?t s? ki?n ngôn ng? thay v? theo m?t RPC, SQL Server ph?i phân tích và biên d?ch truy v?n s? ki?n ngôn ng? thăm, xác đ?nh các truy v?n c? g?ng đ? th?c hi?n th? t?c c? th?, và sau đó c? g?ng t?m ra m?t k? ho?ch trong b? nh? cache cho r?ng th? t?c. Đ? tránh t?nh tr?ng này trong đó SQL Server ph?i phân tích và biên d?ch các s? ki?n ngôn ng?, đ?m b?o r?ng các truy v?n đư?c g?i đ?n SQL như m?t RPC.

    Đ? bi?t thêm chi ti?t, xem ph?n "H? th?ng lưu tr? th? t?c" trong sách Online bài vi?t "T?o m?t th? t?c Stored."


Các vấn đề đã xác định

Dư?i đây là m?t s? v?n đ? đ? bi?t r?ng có th? ngăn ch?n b? nh? đ?m k? ho?ch:
  • B?n s? d?ng các bi?n BLOB như m?t tham s? th? t?c lưu tr?. Đ? bi?t thêm thông tin, h?y b?m vào s? bài vi?t sau đ? xem bài vi?t trong Cơ s? Ki?n th?c Microsoft:
    2380435 Kh?c ph?c: K? ho?ch truy v?n cho m?t th? t?c đư?c lưu tr? là không cache n?u s? d?ng các th? t?c đư?c lưu tr? m?t BLOB bi?n và bi?n đư?c dùng trong m?t chu?i ch?c năng trong Microsoft SQL Server 2008
  • B?n s? d?ng khóa đ?i X?NG m? trong m?t lưu tr? th? t?c/truy v?n lô. Đ? bi?t thêm chi ti?t, xem m?c blog MSDN sau đây:
    http://blogs.MSDN.com/b/sqlserverfaq/Archive/2010/09/08/Open-symmetric-key-command-Prevents-query-plan-caching.aspx

Thu?c tính

ID c?a bài: 263889 - L?n xem xét sau cùng: 21 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Express Edition
  • Microsoft SQL Server 2005 Workgroup Edition
T? khóa: 
kbinfo kbmt KB263889 KbMtvi
Máy d?ch
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:263889

Cung cấp Phản hồi

 

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