X? l? s? c? th? t?c đư?c lưu tr? đ?a

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 243586 - 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

Bài vi?t này đ? v?i m?t lo?i h?nh c? th? c?a hi?u su?t v?n đ? mà các ?ng d?ng có th? g?p v?i Microsoft SQL Server: th?i gian ch?y đ?a c?a th? t?c đư?c lưu tr?. N?u b?n đang g? r?i m?t hi?u su?t v?n đ?, nhưng b?n đ? không xác đ?nh đư?c r?ng đi?u này là ngu?n g?c chính xác c?a b?n v?n đ?, h?y tham kh?o bài vi?t sau trong cơ s? ki?n th?c Microsoft trư?c khi ti?p t?c:

224587 Làm th? nào đ?: G? r?i ?ng d?ng hi?u su?t v?i SQL Server
Bài vi?t này gi? đ?nh r?ng b?n đ? s? d?ng mà bài vi?t đ? thu h?p ph?m vi c?a v?n đ?, và r?ng b?n đ? n?m b?t m?t SQL Server Profiler water v?i các c? th? các s? ki?n và d? li?u c?t chi ti?t bên trong nó.

THÔNG TIN THÊM

Khi m?t ngư?i dùng th?c hi?n m?t th? t?c đư?c lưu tr?, n?u nó không ph?i là đ? có s?n trong b? nh? cache, SQL Server t?i các th? t?c và biên d?ch m?t truy v?n k? ho?ch. K? ho?ch biên d?ch đư?c lưu trong b? nh? cache và tái s? d?ng b?i ngư?i g?i ti?p theo các th? t?c đư?c lưu gi? cho đ?n khi m?t s? hành đ?ng x?y ra đ? làm k? ho?ch và ép bu?c m?t đ?a. Các hành đ?ng sau đây có th? gây ra đ?a c?a m?t th? t?c đư?c lưu tr? k? ho?ch:
  • S? d?ng m?t m?nh đ? v?i biên d?ch trong th? t?c t?o ho?c EXECUTE tuyên b?.
  • Gi?n đ? thay đ?i v?i b?t k? đ?i tư?ng tham chi?u, bao g?m c? thêm ho?c b? nh?ng h?n ch?, m?c đ?nh, ho?c các quy đ?nh.
  • Ch?y sp_recompile Đ?i v?i m?t b?ng tham chi?u c?a các th? t?c.
  • Khôi ph?c l?i cơ s? d? li?u có ch?a các th? t?c ho?c b?t k? đ?i tư?ng tham kh?o th? t?c (n?u b?n đang th?c hi?n qua cơ s? d? li?u ho?t đ?ng kinh doanh).
  • Đ?y đ? máy ch? ho?t đ?ng gây ra k? ho?ch đ? đư?c ? tu?i c?a b? nh? cache.
T?t c? nh?ng l? do cho vi?c m?t th? t?c đư?c lưu tr? đ? t?n t?i trong các phiên b?n trư?c đó, và gây ra k? ho?ch đ? biên d?ch trư?c khi b?t đ?u th?c hi?n các th? t?c. Trong SQL Server 7.0, m?t hành vi m?i đư?c gi?i thi?u mà có th? gây ra m?t th? t?c đư?c lưu tr? đ? biên d?ch trong th?i gian th?c hi?n. Đi?u này m?i hành vi, đ?m b?o r?ng t?i ưu hóa luôn luôn có k? ho?ch t?t nh?t có th? cho m?i c? th? tuyên b? trong m?t th? t?c. Các s? ki?n sau đây có th? gây ra m?t th?i gian ch?y đ?a c?a m?t th? t?c đư?c lưu tr?:
  • M?t t? l? ph?n trăm đ? d? li?u thay đ?i trong m?t b?ng mà là tham chi?u c?a các th? t?c đư?c lưu tr?.
  • Các th? t?c interleaves d? li?u đ?nh ngh?a ngôn ng? (Optical Mouse) và các ho?t đ?ng d? li?u Manipulation Language (DML).
  • Th? t?c th?c hi?n m?t s? ho?t đ?ng t? ngày t?m th?i b?ng.
M?i ngư?i trong s? nh?ng nguyên nhân th?o lu?n thêm chi ti?t ? đây bài vi?t.

Trong m?t s? trư?ng h?p, chi phí c?a vi?c các th? t?c đư?c lưu tr? nhi?u hơn l?i ích xu?t phát t? cách làm như v?y, đ?c bi?t là đ?i v?i l?n th? t?c. Nó là r?t quan tr?ng đ? lưu ? r?ng khi m?t đ?a là đư?c kích ho?t, các toàn b? lô ho?c th? t?c biên. Đi?u này có ngh?a r?ng hi?u su?t suy thoái là tr?c ti?p t? l? thu?n v?i kích thư?c c?a các th? t?c ho?c lô. Cho thông tin thêm v? ch? đ? này, xem ch? đ? "Transact-SQL M?o" trong SQL Máy ch? sách tr?c tuy?n.


Các thông tin sau trong bài vi?t này t?p trung vào xác đ?nh nguyên nhân gây ra th?i gian ch?y lưu tr? th? t?c recompilations và th?o lu?n v? phương pháp b?n có th? s? d?ng đ? ngăn ch?n chúng.

Th?c hành t?t nh?t

Nó là t?t nh?t cho ch? s? h?u vư?t qua v?ng lo?i th? t?c đư?c lưu tr? tên khi b?n th?c hi?n m?t th? t?c. Đi?u này cho phép r? ràng t?t hơn và tái s? d?ng d? dàng hơn các hi?n có k? ho?ch th?c hi?n b?i ngư?i dùng hi?n th?i. Ví d?, n?u m?t ngư?i không dùng ch? s? h?u cơ s? d? li?u (dbo) th?c hi?n th? m?t dbo s? h?u đư?c lưu tr? t?c (đư?c g?i là myProc trong ví d? này) trong các quán rư?u cơ s? d? li?u, s? d?ng các tuyên b? sau:
exec dbo.myProc
				
Thay v? v? đi?u này:
exec myProc
				
K? thu?t này giúp lo?i b? s? nh?m l?n v? các phiên b?n có th? khác c?a các th? t?c b?i ch? s? h?u khác nhau t? m?t quan đi?m m? hóa và b?o tr?, và c?ng cho phép SQL Server đ? truy c?p vào k? ho?ch th?c hi?n cho các th? t?c c? th? thêm tr?c ti?p.

B?i không đ? đi?u ki?n tên ch? s? h?u, SQL Server vào m? biên d?ch và mua l?i m?t biên d?ch khóa v? th? t?c. Tuy nhiên, cu?i cùng nó s? xác đ?nh r?ng m?t k? ho?ch m?i là không c?n thi?t (gi? s? có khác l? do áp d?ng), do đó, nó không biên d?ch k? ho?ch t?i th?i đi?m này v? thi?u văn b?ng. Tuy nhiên, bư?c b? sung nh?n đư?c biên d?ch m?t khóa trên các th? t?c có th? gây ra ganh đua ch?n trong trư?ng h?p nghiêm tr?ng. Đ? c?p đ?n Q263889 INF: SQL ch?n do [[biên d?ch]] ? khóa cho bi?t thêm chi ti?t v? t?nh h?nh này.

N?u b?n có ch? s? h?u công nh?n các cu?c g?i th? t?c v?i owner.procedure, b?n làm không c?n ph?i có đư?c biên d?ch khóa, do đó, các ganh đua là gi?m.

Vi?c xác đ?nh và gi?i quy?t các v?n đ?

N?u b?n không làm như v?y, đ? c?p đ?n bài vi?t sau đây trong Microsoft Knowledge Base v? thu gi? Profiler d? li?u đ? giúp phân tích hi?u su?t c?a h? th?ng c?a b?n:
224587 Làm th? nào đ?: G? r?i ?ng d?ng hi?u su?t v?i SQL Server

Xem d? li?u h? sơ

SQL Server Profiler bao g?m m?t SP:Recompile s? ki?n mà b?n có th? s? d?ng đ? theo d?i s? lư?ng recompiles x?y ra. Các SP:Recompile s? ki?n x?y ra b?t c? khi nào m?t th? t?c đư?c lưu tr? recompiles trong th?c hi?n.
  • Nhóm v?t Profiler b?i s? ki?n Class

    1. Trên các Tệp tr?nh đơn, nh?p vào Thu?c tính.
    2. Trên các D? li?u c?t tab, s? d?ng nút lên đ? di chuy?n các S? ki?n ClassVăn b?n theo các Các nhóm nhóm này, v?i S? ki?n Class đ?u tiên. S? d?ng nút xu?ng đ? lo?i b? t?t c? các c?t khác theo các Các nhóm nhóm.
    3. Nh?p vào Ok.
    Ki?m tra s? lư?ng các SP:Recompile các s? ki?n.

    B?n có th? m? r?ng nhóm SP:Recompile đ? xem các chi ti?t c?a các l?n xu?t hi?n cá nhân. Các Văn b?n c?t c?a s? ki?n này ch? ra tên c?a các th? t?c đư?c lưu tr? mà biên. N?u nhi?u th? t?c đang gây ra recompiles, h? đư?c s?p x?p b?i s? l?n xu?t hi?n. N?u b?n có m?t s? lư?ng l?n SP:Recompile các s? ki?n và b?n đang tr?i qua vi?c s? d?ng CPU cao, t?p trung vào gi?i quy?t các th? t?c có s? lư?ng cao nh?t c?a recompiles. Lưu ? các h? th?ng quá tr?nh ID (d?ch v? SPID) và b?t đ?u th?i gian c?a các SP:Recompile s? ki?n cho m?t ví d? c?a procedure(s) đư?c lưu tr? đ?c bi?t và làm theo các bư?c dư?i đây.

    N?u b?n không th?y b?t k? SP:Recompile các s? ki?n, nhưng b?n v?n c?n đang g?p m?t v?n đ? hi?u su?t, xem bài vi?t sau trong cơ s? ki?n th?c Microsoft:
    224587 Làm th? nào đ?: G? r?i ?ng d?ng hi?u su?t v?i SQL Server
  • Xác đ?nh các tuyên b? đ? làm hi?n th? các s? ki?n Recompile

    1. Trên các Tệp tr?nh đơn, nh?p vào Thu?c tính.
    2. Trên các D? li?u c?t tab, s? d?ng nút xu?ng đ? lo?i b? t?t c? các c?t khác theo các Các nhóm nhóm.
    3. Trên các S? ki?n tab, lo?i b? t?t c? s? ki?n ngo?i tr? SP: b?t đ?u, SP:StmtStarting, SP:Recompile, và SP: hoàn thành. N?u b?n đ? không n?m b?t các SP:StmtStarting s? ki?n, b?n có th? thay th? SP:StmtCompleted, nhưng không bao g?m c? hai b?i v? làm như v?y tăng g?p đôi s? lư?ng thông tin b?n c?n đ? xem xét thông qua.
    4. N?u b?n đ? xác đ?nh m?t trư?ng h?p c? th? c?a m?t lưu tr? th? t?c đ?a đ? ki?m tra, b?n có th? gi?i h?n d? li?u mà b?n xem đ? các d?ch v? SPID c? th? và khung th?i gian c?a s? xu?t hi?n b?ng cách s? d?ng các Các b? l?c tab.
    5. Nh?p vào Ok.

    Các SP:Recompile s? ki?n s? đư?c nâng lên tr?c ti?p theo sau các SP:StmtStarted s? ki?n các th? t?c đư?c lưu tr? tuyên b? gây ra các đ?a. Sau khi s? ki?n này recompile k?t thúc, b?n s? th?y m?t l?p l?i c?a các SP:StmtStarted s? ki?n, cho th?y r?ng các báo cáo th?c hi?n v?i các m?i t?o ra k? ho?ch.

    H?y xem xét ví d? sau:
    use pubs
    go
    drop procedure RecompProc 
    go
    create procedure RecompProc as
    create table #t (a int)
    select * from #t
    go
    exec RecompProc
    						
    N?u b?n th?c hi?n m? này trong truy v?n phân tích và xem các s? ki?n trên đây trong m?t d?u v?t Profiler, b?n s? th?y tr?nh t? sau:

    Thu g?n b?ng nàyBung r?ng b?ng này
    S? ki?n ClassVăn b?n
    SP: b?t đ?uRecompProc
    SP:StmtStartingt?o b?ng # t (m?t int)
    SP:StmtStartingch?n * t? # t
    SP:RecompileRecompProc
    SP:StmtStartingch?n * t? # t
    SP: hoàn thànhRecompProc


    B?n có th? nói ngay l?p t?c mà tuyên b? r?ng gây ra là đ?a là:
    select * from #t
    						
    B?i v? nó s? xu?t hi?n c? trư?c và sau khi các SP:Recompile s? ki?n.

    N?u b?n đ? chi?m đư?c ch? các SP:StmtCompleted s? ki?n, nhưng không ph?i các SP:StmtStarting s? ki?n, các SP:Recompile s? hi?n th? tr?c ti?p trư?c khi tuyên b? đ? gây ra nó như là dư?i đây:

    Thu g?n b?ng nàyBung r?ng b?ng này
    S? ki?n ClassVăn b?n
    SP: b?t đ?uRecompProc
    SP:RecompileRecompProc
    SP:StmtCompletedch?n * t? # t
    SP: hoàn thànhRecompProc


    B?n có th? th?y r?ng các SP:Recompile s? ki?n đư?c đưa lên trư?c khi các SP:StmtCompleted s? ki?n cho các "ch?n * t? # t" tuyên b?, mà gây ra các đ?a. Đi?u này làm cho tinh th?n, như các tuyên b? có th? không th? hoàn t?t cho đ?n khi sau khi k? ho?ch truy v?n m?i đư?c t?o ra cho recompile. T?t c? các ph?n c?n l?i c?a các Ví d? ? đây bài vi?t s? d?ng các SP:StmtStarting s? ki?n. N?u b?n đ? chi?m đư?c ch? các SP:StmtCompleted s? ki?n, ch? c?n nh? đ? xem các tuyên b? sau các SP:Recompile, như đ? gi?i thích ? trên.

    Lưu ? r?ng n?u b?n th?c hi?n đi?u này đ?c bi?t lưu tr? th? t?c nhi?u l?n, SQL Server s? tái s? d?ng hi?n t?i k? ho?ch cho th? t?c này. B?n s? ch? th?y s? ki?n recompile ngày đ?u tiên th?c hi?n các th? t?c, ho?c n?u b?n th? và tái t?o cu?c gi?i ph?u m?i th?i gian b?n th?c hi?n các t?p l?nh. L? do là đ?a vào này c? th? trư?ng h?p th?o lu?n trong các "Recompilations do Interleaving d? li?u Definition Ngôn ng? (Q) và d? li?u Manipulation Language (DML) các ho?t đ?ng"ph?n này bài vi?t; Đây là ch? đơn gi?n là m?t ví d? đ? minh h?a làm th? nào đ? d? dàng xác đ?nh tuyên b? gây ra là đ?a.

Recompilations nh? s?a đ?i hàng

N?u m?t t? l? ph?n trăm đ? d? li?u đ? thay đ?i trong m?t b?ng tham chi?u b?i m?t th? t?c đư?c lưu tr? k? t? th?i gian k? ho?ch truy v?n ban đ?u đư?c t?o ra, SQL Server s? biên d?ch các th? t?c đư?c lưu tr? đ? đ?m b?o r?ng nó có m?t k? ho?ch d?a trên d? li?u th?ng kê m?i nh?t. Ví d?, xem xét th? t?c đư?c lưu tr? sau đây:
drop procedure RowModifications 
go
create procedure RowModifications as
-- assume SomeTable exists with the same definition as #t, 
-- and has over 1000 rows
create table #t (a int, b char(10))
select * from #t
insert #t select * from SomeTable
select count(*) from #t  where a = 37
go
exec RowModifications
exec RowModifications
				
Đ? th?c hi?n th? hai c?a các RowModifications th? t?c, b?n s? th?y các s? ki?n sau đây trong H? sơ:

Thu g?n b?ng nàyBung r?ng b?ng này
S? ki?n ClassVăn b?n
SP: b?t đ?uRowModifications
SP:StmtStartingt?o b?ng # t (m?t int, b Char(10))
SP:StmtStartingch?n * t? # t
SP:StmtStartingchèn # t ch?n * t? SomeTable
SP:StmtStartingch?n count(*) t? # t trong trư?ng h?p a = 37
SP:RecompileRowModifications
Auto-UpdateStatsm?t
SP:StmtStartingch?n count(*) t? # t trong trư?ng h?p a = 37
SP: hoàn thànhRowModifications

CHÚ Ý: Th?c hi?n đ?u tiên c?ng s? hi?n th? m?t SP:Recompile s? ki?n cho các "ch?n * t? # t" tuyên b?. L? do cho các đ?a trong trư?ng h?p c? th? này th?o lu?n trong "Recompilations h?n đ?n Interleaving Data Definition Language (Q) và d? li?u Manipulation Language Ho?t đ?ng (DML)"ph?n c?a bài vi?t này. Ví d? này, t?p trung vào các SP:Recompile hi?n th? ? trên, v? nó x?y ra m?i khi th? t?c là th?c thi.

Trong ví d? này, "ch?n count(*) t? # t nơi m?t = 37" nguyên nhân đ?a th? t?c do s? thay đ?i trong s? hàng k? t? khi b?ng đ? đư?c t?o ra. S? hi?n di?n c?a các Auto-UpdateStats s? ki?n xác nh?n r?ng đ?a là do hàng S?a đ?i. Các Văn b?n c?t c?t mà các s? li?u th?ng kê đ? ch? ra S?a đ?i l?n.

Khi # t b?ng đư?c t?o ra, s? hàng là zero. K? ho?ch cho b?n g?c "ch?n * t? # t" đư?c phát tri?n v?i đó đ?m hàng, c?ng như các k? ho?ch cho "ch?n truy c?p (*)" truy v?n. Tuy nhiên, trư?c khi các "ch?n count(*)" đư?c th?c thi, 1.000 m?i hàng đư?c chèn vào # t b?ng. B?i v? m?t s? ti?n đ? d? li?u đ? đư?c thay đ?i, tôi ưu hoa recompiles các th? t?c đ? đ?m b?o r?ng nó ch?n k? ho?ch hi?u qu? nh?t cho các tuyên b?. Đ?a này s? x?y ra trên m?i th?c hi?n c?a các lưu tr? th? t?c b?i v? vi?c thêm 1.000 hàng s? luôn luôn đư?c xem như đáng k?, đ? đ? b?o đ?m đ?a.

Thu?t toán SQL Server s? d?ng đ? xác đ?nh li?u m?t k? ho?ch nên đư?c biên là cùng m?t thu?t toán đư?c s? d?ng đ? t? đ?ng C?p Nh?t s? li?u th?ng kê như mô t? trong bài vi?t sau đây trong các Cơ s? ki?n th?c Microsoft:
195565 INF: SQL Server 7.0 và SQL Server 2000 Autostats nào
Trong ví d? trên, các th? t?c đư?c lưu tr? nh? đ? r?ng là đ?a s? không có m?t hi?u ?ng đáng chú ? hi?u su?t. Tuy nhiên, n?u b?n có m?t th? t?c đư?c lưu tr? l?n mà th?c hi?n tương t? như ho?t đ?ng d?n đ?n nhi?u recompilations, b?n có th? nh?n th?y m?t s? xu?ng c?p hi?u su?t.

Các phương pháp sau đây t?n t?i đ? ch?ng l?i recompilations nh? s?a đ?i d?ng:
  • Th?c hi?n các tuyên b? b?ng cách s? d?ng sp_executesql.
    Đây là phương pháp ưa thích. Phát bi?u th?c hi?n b?ng cách s? d?ng cácsp_executesql th? t?c đư?c lưu tr? không đư?c biên d?ch như là m?t ph?n c?a các th? t?c đư?c lưu tr? k? ho?ch. Do đó, khi th?c hi?n các tuyên b?, SQL Server s? đư?c mi?n phí đ? ho?c s? d?ng m?t k? ho?ch hi?n t?i trong b? nh? cache cho tuyên b? ho?c t?o m?t cái m?i t?i th?i gian ch?y. Trong c? hai trư?ng h?p, k? ho?ch cho các th? t?c đư?c lưu tr? g?i là không b? ?nh hư?ng và không ph?i đư?c biên.

    Nh?ng tuyên b? thi công s? có tác d?ng tương t?; Tuy nhiên, không nên. B?ng cách s? d?ng các thi công tuyên b? không ph?i là như là hi?u qu? như b?ng cách s? d?ng sp_executesql b?i v? nó không cho phép parameterization c?a các truy v?n.

    Các RowModifications th? t?c đư?c đưa ra ? trên có th? đư?c ghi vào s? d?ng sp_executesql như sau:

    drop procedure RowModifications2 
    go
    create procedure RowModifications2 as
    set nocount on
    -- assume SomeTable exists with the same definition as #t, 
    -- and has over 1000 rows
    create table #t (a int, b char(10))
    select * from #t
    insert #t select * from SomeTable
    exec sp_executesql N'select count(*) from #t where a = @a', 
                       N'@a int', @a =  37
    go
    exec RowModifications2
    exec RowModifications2
    						

    Đ? th?c hi?n th? hai c?a các RowModifications2 th? t?c, b?n s? th?y các s? ki?n sau đây trong H? sơ:

    Thu g?n b?ng nàyBung r?ng b?ng này
    S? ki?n ClassVăn b?n
    SP: b?t đ?uRowModifications2
    SP:StmtStartingt?o b?ng # t (m?t int, b Char(10))
    SP:StmtStartingch?n * t? # t
    SP:StmtStartingchèn # t ch?n * t? SomeTable
    SP:StmtStartingexec sp_executesql N'select Count(*) t? # t nơi m?t = @ m?t ', N'@a int', @ m?t = 37
    SP: b?t đ?u
    SP:StmtStartingch?n count(*) t? # t trong trư?ng h?p a = @ m?t
    Auto-UpdateStatsm?t
    SP:StmtStartingch?n count(*) t? # t trong trư?ng h?p a = @ m?t
    SP: hoàn thành
    SP: hoàn thànhRowModifications2


    Thông báo r?ng có không có SP:Recompile các s? ki?n cho các RowModifications2 th? t?c. Có r?t đ?y đ? SP: b?t đ?u đ? SP: hoàn thành các s? ki?n cho các sp_executesql g?i b?i c?nh, và m?t Auto-UpdateStats s? ki?n cho c?t m?t. Tuy nhiên, b?i v? đi?u này g?i là ra kh?i b?i c?nh c?a các lưu tr? th? t?c, các RowModifications2 th? t?c không c?n ph?i đư?c biên trong trư?ng h?p này.

    Cho bi?t thêm thông tin v? cách s? d?ng các sp_executesql lưu tr? th? t?c, xem "sp_executesql (T-SQL)" và "s? d?ng các ch? đ? sp_executesql"trong SQL Server sách tr?c tuy?n.
  • S? d?ng sub-procedures đ? th?c hi?n nh?ng đi?u kho?n gây ra các recompilations.
    Trong trư?ng h?p này, các báo cáo có th? v?n c?n làm cho m?t đ?a, nhưng thay v? vi?c th? t?c đư?c lưu tr? g?i đi?n tho?i l?n, nó s? ch? biên d?ch sub-procedure nh?.
  • S? d?ng tùy ch?n gi? k? ho?ch.
    T?m th?i b?ng có lu?t l? đ?c bi?t v? recompilations trong đó, trong m?t s? trư?ng h?p, có th? nhi?u hơn nghiêm ng?t hơn so v?i các thu?t toán đ?a m?c đ?nh. B?n có th? s? d?ng các gi? k? ho?ch tùy ch?n đ? thư gi?n t?m th?i b?ng quay l?i các thu?t toán m?c đ?nh ngư?ng. Đ? bi?t thêm chi ti?t, xem các "tránh đ?a by Using the gi? PLAN Tùy ch?n"ph?n c?a bài vi?t này.
CHÚ Ý: Các RowModifications th? t?c là m?t ví d? r?t đơn gi?n c?a m?t th? t?c mà là biên nh? s?a đ?i hàng. H?y xem l?i sau h?y c?n th?n liên quan đ?n ví d? này:

  • M?c dù ví d? s? d?ng m?t b?ng t?m th?i, t?nh h?nh này áp d?ng các th? t?c đư?c lưu tr? tài li?u tham kh?o c? đ?nh b?ng là t?t. N?u m?t s? ti?n đ? c?a d? li?u trong m?t b?ng tham chi?u đ? đư?c thay đ?i t? các k? ho?ch truy v?n đư?c t?o ra, các th? t?c đư?c lưu tr? s? đư?c biên. Các s? khác bi?t trong cách t?m th?i b?ng đư?c coi là đ?a đích này đư?c mô t? trong các "tránh đ?a b?i Using the gi? k? ho?ch Option" ph?n c?a bài vi?t này.
  • X? t? đ?u tiên c?a hai th? t?c ? trên c?ng gây ra m?t đ?a trên l?a ch?n đ?u tiên t? b?ng t?m th?i # t. Nh?ng l? do cho đ?a này s? đư?c th?o lu?n trong các "Recompilations do Interleaving D? li?u đ?nh ngh?a Language (Q) và d? li?u Manipulation Language (DML) ho?t đ?ng" ph?n c?a bài vi?t này.
  • M?t tuyên b? "ch?n count(*) t? # t" đ? đư?c s? d?ng ? đây Ví d?, ch? không ph?i là m?t đơn gi?n "ch?n * t? # t" tuyên b?. Đ? tránh quá nhi?u recompilations, SQL Server không xem xét vi?c "k? ho?ch t?m thư?ng" (như v?y như là m?t l?a ch?n * t? m?t b?ng) do đ? s?a đ?i hàng.

Recompilations nh? Interleaving d? li?u đ?nh ngh?a Language (Q) và thao tác d? li?u ho?t đ?ng ngôn ng? (DML)

N?u Optical Mouse ho?t đ?ng đư?c th?c hi?n trong m?t th? t?c ho?c th?c thi, các th? t?c ho?c lô biên khi nó g?p ti?p theo DML đ?u tiên thao tác ?nh hư?ng đ?n b?ng tham gia vào DLC.

Xem xét các Ví d? sau đây lưu tr? th? t?c:
drop procedure Interleave 
go
create procedure Interleave as
-- DDL
create table t1 (a int)
-- DML
select * from t1
-- DDL
create index idx_t1 on t1(a)
-- DML
select * from t1
-- DDL
create table t2 (a int)
-- DML
select * from t2
go
exec Interleave
				
N?u b?n th?c hi?n m? này trong truy v?n phân tích và xem các s? ki?n trên đây trong m?t d?u v?t Profiler, b?n s? th?y tr?nh t? sau:

Thu g?n b?ng nàyBung r?ng b?ng này
S? ki?n ClassVăn b?n
SP: b?t đ?uInterleave
SP:StmtStartingt?o b?ng t1 (m?t int)
SP:StmtStartingch?n * t? t1
SP:RecompileInterleave
SP:StmtStartingch?n * t? t1
SP:StmtStartingt?o ch? m?c idx_t1 trên t1(a)
SP:StmtStartingch?n * t? t1
SP:RecompileInterleave
SP:StmtStartingch?n * t? t1
SP:StmtStartingt?o b?ng t2 (m?t int)
SP:StmtStartingch?n * t? t2
SP:RecompileInterleave
SP:StmtStartingch?n * t? t2
SP: hoàn thànhInterleave


Trong trư?ng h?p này, các th? t?c đư?c lưu tr? biên ba l?n trong th?i gian th?c hi?n. Đ? hi?u t?i sao đi?u này x?y ra, h?y xem xét làm th? nào các t?i ưu hóa phát tri?n m?t k? ho?ch cho th? t?c đư?c lưu tr? này:
  1. Trong th?i gian tr?nh biên d?ch ban đ?u c?a các th? t?c, b?ng t1 và t2 không t?n t?i. Do đó, không có k? ho?ch cho các truy v?n tham kh?o này b?ng có th? đư?c t?o ra. H? ph?i đư?c t?o ra ? th?i gian th?c hi?n.
  2. Khi th? t?c th?c hi?n l?n đ?u tiên, là ngư?i đ?u tiên bư?c là đ? t?o ra b?ng t1. Bư?c ti?p theo là m?t l?a ch?n t? b?ng t1--mà không có không có k? ho?ch cho. Do đó, các th? t?c biên vào th?i đi?m này đ? phát tri?n m?t k? ho?ch cho nh?ng tuyên b? ch?n. M?t k? ho?ch đư?c t?o ra cho hi?n t?i ch?n t? t1, c?ng như nh?ng l?a ch?n t? t1 sau khi thành l?p ch? m?c. Không có k? ho?ch có th? đư?c t?o ra cho nh?ng l?a ch?n t? t2 v? t2 v?n không t?n t?i đư?c nêu ra.
  3. Bư?c ti?p theo là t?o ra m?t ch? s? trên t1. Sau đó, m?t l?a ch?n đư?c th?c hi?n trên t1, mà bây gi? có m?t k? ho?ch t? đ?u tiên biên d?ch. Tuy nhiên, v? gi?n đ? t1 đ? thay đ?i k? t? đó k? ho?ch t?o ra, các th? t?c ph?i đư?c biên m?t l?n n?a đ? t?o ra m?t k? ho?ch m?i Đ?i v?i nh?ng l?a ch?n t? t1. Và b?i v? t2 v?n không t?n t?i, không có k? ho?ch có th? đư?c t?o ra cho nh?ng l?a ch?n t? t.
  4. Sau đó, b?ng t2 đư?c t?o ra và ch?n t? t2 là th?c thi. B?i v? không có k? ho?ch t?n t?i cho tuyên b?, th? t?c biên m?t th?i gian cu?i cùng.
Các recompilations x?y ra trên m?i th?c hi?n c?a các lưu tr? th? t?c. Đ? gi?m b?t các recompilations, s?a đ?i các th? t?c đ? làm t?t c? các Laser Mouse ho?t đ?ng l?n đ?u tiên, theo DML ho?t đ?ng, như đư?c hi?n th? ? đây:
drop procedure NoInterleave 
go
create procedure NoInterleave as
-- All DDL first
create table t1 (a int)
create index idx_t1 on t1(a)
create table t2 (a int)
-- Then DML 
select * from t1
select * from t1
select * from t2
go
exec NoInterleave 
exec NoInterleave
				
Th?c hi?n đ?u tiên c?a các NoInterleave th? t?c này s? hi?n th? các s? ki?n sau đây trong Profiler:

Thu g?n b?ng nàyBung r?ng b?ng này
S? ki?n ClassVăn b?n
SP: b?t đ?uNoInterleave
SP:StmtStartingt?o b?ng t1 (m?t int)
SP:StmtStartingt?o ch? m?c idx_t1 trên t1(a)
SP:StmtStartingt?o b?ng t2 (m?t int)
SP:StmtStartingch?n * t? t1
SP:RecompileNoInterleave
SP:StmtStartingch?n * t? t1
SP:StmtStartingch?n * t? t1
SP:StmtStartingch?n * t? t2
SP: hoàn thànhNoInterleave


Trong trư?ng h?p này t?t c? nh?ng đi?u kho?n Optical Mouse đư?c th?c hi?n lên m?t tr?n. T?i ưu hóa vi?c biên d?ch th? t?c này như sau:
  1. Trong th?i gian tr?nh biên d?ch ban đ?u c?a các th? t?c, b?ng t1 và t2 không t?n t?i. Do đó, không có k? ho?ch cho các truy v?n tham kh?o này b?ng có th? đư?c t?o ra. H? ph?i đư?c t?o ra ? th?i gian th?c hi?n.
  2. Nh?ng bư?c đ?u tiên th?c hi?n các th? t?c là Laser Mouse các ho?t đ?ng, t?o b?ng t1 và t2, c?ng như ch? s? trên t1.
  3. Bư?c ti?p theo là l?a ch?n đ?u tiên t? t1. B?i v? có không có k? ho?ch có s?n cho tuyên b? ch?n này, các th? t?c biên. B?i v? t?t c? các đ?i tư?ng t?n t?i, k? ho?ch đư?c t?o ra cho t?t c? nh?ng l?a ch?n phát bi?u trong th? t?c t?i th?i đi?m này.
  4. Ph?n c?n l?i c?a các th? t?c th?c hi?n b?ng cách s? d?ng các k? ho?ch đư?c t?o ra. B?i v? không có không có thay đ?i đ? các đ?i tư?ng tham chi?u, có không có c?n ph?i biên d?ch các th? t?c hơn n?a.
CHÚ Ý: Các v? x? t? th? hai và sau đó làm cho vi?c s? d?ng hi?n t?i truy v?n b? nh? cache và k? ho?ch, và không t?o ra b?t k? recompilations ? t?t c?. Th? t?c mà t?o, thay đ?i ho?c th? b?ng nên đư?c s?a đ?i đ? đ?m b?o r?ng t?t c? các Laser Mouse câu đư?c đ?t ? đ?u các th? t?c.

Recompilations nh? m?t s? ho?t đ?ng t? b?ng t?m th?i

S? d?ng các b?ng t?m th?i trong m?t th? t?c đư?c lưu tr? có th? gây ra các th? t?c đư?c lưu tr? đ? đư?c biên m?i khi th? t?c là th?c thi.

Đ? tránh đi?u này, h?y thay đ?i các th? t?c đư?c lưu tr? đ? cho nó đáp ?ng các yêu c?u sau đây:
  • T?t c? các báo cáo có ch?a tên c?a m?t b?ng t?m th?i H?y tham kh?o m?t b?ng t?m th?i t?o ra trong cùng m?t th? t?c đư?c lưu tr?, và không ph?i trong m?t g?i đi?n tho?i ho?c g?i là th? t?c đư?c lưu tr?, ho?c trong m?t chu?i th?c thi b?ng cách s? d?ng thi công tuyên b? ho?c sp_executesql th? t?c đư?c lưu tr?.
  • T?t c? các báo cáo có ch?a tên c?a m?t b?ng t?m th?i xu?t hi?n cú pháp sau khi b?ng t?m th?i trong các th? t?c đư?c lưu tr? ho?c Kích ho?t.
  • Không có không có báo cáo khai báo con tr? chu?t mà ch?n phát bi?u tham kh?o m?t b?ng t?m th?i.
  • T?t c? các báo cáo có ch?a tên c?a b?t k? b?ng t?m th?i đ?ng trư?c b?t k? tuyên b? DROP TABLE tài li?u tham kh?o m?t b?ng t?m th?i.

    TH? b?ng báo cáo không c?n thi?t cho b?ng t?m th?i t?o trong m?t lưu tr? th? t?c. Các b?ng s? t? đ?ng b? rơi khi th? t?c đ? hoàn thành.
  • Không có báo cáo vi?c t?o ra m?t b?ng t?m th?i (ví d? như t?o B?NG ho?c ch?n... VÀO) xu?t hi?n trong m?t tuyên b? ki?m soát d?ng ch?y như n?u... KHÁC ho?c trong khi.

Tránh đ?a b?ng cách s? d?ng tùy ch?n k? ho?ch gi?

S? d?ng b?ng t?m th?i trong th? t?c đư?c lưu tr? gi?i thi?u m?t s? ph?c t?p cho t?i ưu hóa truy v?n. Bá tư?c hàng và thông tin th?ng kê có các b?ng th? khác nhau đáng k? trong su?t đ?i c?a các lưu tr? th? t?c th?c hi?n. Đ? đ?m b?o r?ng t?i ưu hóa vi?c s? d?ng k? ho?ch t?t nh?t trong t?t c? các trư?ng h?p liên quan đ?n b?ng t?m th?i, m?t thu?t toán đ?c bi?t đ? đư?c phát tri?n đ? nhi?u hơn tích c?c v?i recompilations. Các thu?t toán ti?u bang r?ng n?u m?t b?ng t?m th?i t?o ra v?i m?t th? t?c đư?c lưu tr? đ? thay đ?i nhi?u hơn sáu l?n, các th? t?c s? đư?c biên khi các báo cáo k? ti?p tham chi?u đ?n b?ng t?m th?i.

H?y xem xét ví d? sau:
drop procedure useKeepPlan 
go
create procedure useKeepPlan as
create table #t (a int, b char(3))
select * from #t
-- Make greater than 6 changes to #t
insert #t values (1, 'abc')
insert #t values (2, 'abc')
insert #t values (3, 'abc')
insert #t values (4, 'abc')
insert #t values (5, 'abc')
insert #t values (6, 'abc')
insert #t values (7, 'abc')
-- Now reference #t
select count(*) from #t 
--option (KEEP PLAN)
go
exec useKeepPlan
exec useKeepPlan
				
Trong trư?ng h?p này, b?n s? th?y các s? ki?n sau đây trong h? sơ cho các Th? hai th?c hi?n:

Thu g?n b?ng nàyBung r?ng b?ng này
S? ki?n ClassVăn b?n
SP: b?t đ?uuseKeepPlan
SP:StmtStartingt?o b?ng # t (m?t int)
SP:StmtStarting -B?y chèn phát bi?u-
SP:StmtStartingch?n count(*) t? # t1
SP:RecompileuseKeepPlan
SP:StmtStartingch?n count(*) t? # t1
SP: hoàn thànhuseKeepPlan

Th? t?c biên ngày ch?n x?y ra sau khi thay đ?i b?y đ? t?m th?i b?ng # t.

Này tích c?c đ?a là h?u ích trong trư?ng h?p mà nh?ng thay đ?i đ? phân ph?i d? li?u B?ng t?m th?i có th? đáng k? ?nh hư?ng đ?n k? ho?ch truy v?n t?i ưu cho các tuyên b? tham kh?o nó. Tuy nhiên, trong trư?ng h?p c?a th? t?c l?n mà s?a đ?i t?m th?i các b?ng thư?ng xuyên, nhưng không ph?i trong m?t cách đáng k?, các recompilations có th? làm ch?m hi?u su?t t?ng th?. Tùy ch?n gi? k? ho?ch tuyên b? ch?n đ? đư?c gi?i thi?u cho t?nh tr?ng này.

GI? K? HO?CH lo?i b? các th? t?c đư?c lưu tr? recompilations gây ra b?i nh?ng thay đ?i nhi?u hơn sáu đ?n t?m th?i các b?ng bên trong các th? t?c và reverts quay l?i các tiêu chu?n thu?t toán cho đ?a nh? s?a đ?i hàng th?o lu?n ? trên trong các "Recompilations do s?a đ?i d?ng" ph?n c?a bài vi?t này. GI? K? HO?CH không ngăn ch?n recompilations hoàn toàn, nó ch? đơn gi?n là ngăn c?n nh?ng ngư?i gây ra b?i hơn sáu đ? thay đ?i t?m th?i b?ng tham chi?u trong th? t?c. Trong các Ví d? trên, n?u b?n lo?i b? nh?ng b?nh lu?n t? d?ng "tùy ch?n (k? ho?ch gi?)" trong các th? t?c đư?c lưu tr?, các SP:Recompile s? ki?n s? không đư?c t?o ra.

N?u b?n lo?i b? các b?nh lu?n t? "tùy ch?n (lưu k? ho?ch)" d?ng trong m? ? trên và th?c hi?n nó, b?n s? Xem s? ki?n sau đây trong h? sơ:

Thu g?n b?ng nàyBung r?ng b?ng này
S? ki?n ClassVăn b?n
SP: b?t đ?uuseKeepPlan
SP:StmtStartingt?o b?ng # t (m?t int)
SP:StmtStarting -B?y chèn phát bi?u-
SP:StmtStartingch?n count(*) t? # t1 tùy ch?n (lưu K? HO?CH)
SP: hoàn thànhuseKeepPlan


Lưu ? có không có SP:Recompile s? ki?n.

Recompilations nh? m?t s? phát bi?u thi?t th?c hi?n trong th? t?c đư?c lưu tr?

Các năm sau đ?t tùy ch?n đư?c thi?t l?p đ? ON theo m?c đ?nh:
  • ANSI_DEFAULTS
  • ANSI_NULLS
  • ANSI_PADDING
  • ANSI_WARNINGS
  • CONCAT_NULL_YIELDS_NULL
N?u b?n th?c hi?n các tuyên b? đ?t đ? đ?t b?t k? c?a các tùy ch?n này đ? RA, các th? t?c đư?c lưu tr? s? đư?c biên m?i khi nó ch?y. L? do cho Đi?u này là r?ng vi?c thay đ?i các tùy ch?n này có th? ?nh hư?ng đ?n k?t qu? truy v?n đư?c kích ho?t đ?a.

Xem xét m?u m? sau đây:
Use pubs
drop procedure test_recompile
go

create procedure test_recompile as
Set ANSI_DEFAULTS OFF
Select au_lname, au_fname, au_id from authors
where au_lname like 'L%'
--Option (Keep Plan)
Go
				
Trong trư?ng h?p này, b?n s? th?y các s? ki?n sau trong SQL Profiler cho m?i th?c hi?n các th? t?c đư?c lưu tr?:
+---------------------------------------------------+
| Event Class     | Text                            | 
+---------------------------------------------------+
| SP:Starting     | test_recompile                  | 
+---------------------------------------------------+
| SP:StmtStarting | Set ANSI_DEFAULTS OFF           | 
+---------------------------------------------------+
| SP:StmtStarting | select au_lname, au_fname, au_id| 
+---------------------------------------------------+
| SP:Recompile    | test_recompile                  | 
+---------------------------------------------------+
| SP:StmtStarting | select au_lname, au_fname, au_id| 
+---------------------------------------------------+
| SP:Completed    | test_recompile                  | 
+---------------------------------------------------+
				
Thay th? các tùy ch?n đ?t v?i b?t k? m?t trong nh?ng l?a ch?n năm li?t kê ? trên s? cho k?t qu? tương t?. Ngoài ra, s? d?ng tùy ch?n gi? k? ho?ch ? đây s? không giúp đ? đ? tránh là đ?a v? nguyên nhân c?a là đ?a là t? các tuyên b? đ?t.

Đư?c gi?i thi?u cách đ? tránh các đ?a là không s? d?ng b?t k? c?a tuyên b? đ?t năm trong m?t lưu tr? th? t?c. Đ? bi?t thêm chi ti?t, xem các bài vi?t sau đây trong các Cơ s? ki?n th?c Microsoft:
294942 PRB: Đ?t CONCAT_NULL_YIELDS_NULL có th? gây ra lưu tr? th? t?c đ? Recompile
Tuy nhiên, như là không đư?c đ? ngh?, ch?y b? tuyên b? đ? thi?t l?p l?i tùy ch?n k?t n?i v?i giá tr? tương t? như các lưu tr? th? t?c, nó c?ng có th? tránh recompile, làm vi?c đó như:
Set ANSI_DEFAULTS OFF

exec test_recompile
				
SQL Profiler v?t s? hi?n th? không có nhi?u s? ki?n SP:Recompile.

B?ng sau li?t kê m?t s? báo cáo đ?t chung và cho dù hay không thay đ?i các tuyên b? đ?t trong m?t th? t?c đư?c lưu tr? gây ra m?t recompile:
Thu g?n b?ng nàyBung r?ng b?ng này
Đ?t StatementBiên d?ch
Thi?t l?p quoted_identifierKhông
Thi?t l?p arithabortCó
Thi?t l?p ansi_null_dflt_onCó
Thi?t l?p ansi_defaultsCó
Thi?t l?p ansi_warningsCó
Thi?t l?p ansi_paddingCó
Thi?t l?p concat_null_yields_nullCó
Thi?t l?p numeric_roundabortKhông
Thi?t l?p nocountKhông
Thi?t l?p rowcountKhông
Thi?t l?p xact_abortKhông
Thi?t l?p implicit_transactionsKhông
Thi?t l?p arithignoreKhông
Thi?t l?p lock_timeoutKhông
Thi?t l?p fmtonlyKhông

Tham khảo

308737 INF: Làm th? nào đ? xác đ?nh nguyên nhân đ?a vào m?t s? ki?n SP:Recompile

Đ? bi?t thông tin v? vi?c s? d?ng máy ch? SQL H? sơ, xem SQL Server sách tr?c tuy?n.

Thu?c tính

ID c?a bài: 243586 - 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 Personal Edition
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2000 Standard Edition
T? khóa: 
kbinfo kbmt KB243586 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:243586

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