Author: admin

Tôi nghĩ rằng có một xu hướng giữa DBAs và SQL Server wonks là một chút dismissive của toàn văn chỉ mục. Tôi nghĩ rằng trong nhiều trường hợp, mọi người có xu hướng suy nghĩ về nó trong điều khoản của việc thêm chi phí đáng kể.

Trong một thời gian dài tôi thực sự xem nó như là một dạng tìm kiếm mạnh mẽ hơn, nhưng tốn kém hơn nhiều. Sau đó, tôi thực sự đã có cơ hội để làm việc với nó (trong một cuộc sống quá khứ) một thỏa thuận tốt, và thấy rằng nó đã không thực sự thêm rằng nhiều trên cao trong nhiều trường hợp. Trong thực tế, tôi thấy rằng nó đã được thực sự khá mát mẻ công nghệ và cung cấp rất nhiều chức năng mà không có hiệu suất đáng chú ý hits. Mặc dù, tôi thấy rằng các chỉ mục thường xuyên bị rơi rất nhiều và cần một chút ‘tình yêu’ để giữ cho chúng hoạt động đúng. (Đây là tất cả trên SQL Server 2000.)

Nhưng trong một số trường hợp nó có thể mang lại lợi ích về hiệu năng điên
Nhanh đến ngày hôm nay. Tôi hiện đang làm việc với một khách hàng có cơ sở dữ liệu có kích thước phong nha (khoảng 20GB). Hơn 5GB của DB đó được tạo thành từ một bảng ‘Sách’ – có khoảng 8 triệu hàng. Bảng có cả tên tác giả và tên miền, và mỗi tên miền đều khá rộng (nvarchar (300) trở lên). Bảng này cung cấp sự hỗ trợ cho các chức năng chính và người dùng thường xuyên tìm kiếm các tác giả hoặc tiêu đề sử dụng LIKE và các ký tự đại diện. Tất cả chúng ta đều biết điều đó là khó chịu – vì nó buộc phải quét.

Những tìm kiếm này thực sự gây ra một bảng quét, đã được ném ra quá nhiều lần đọc, và tạo ra một lượng lớn sử dụng CPU. Đến mức bạn có thể nhìn thấy rõ ràng từng câu hỏi trong trình quản lý tác vụ – như CPU ​​đã kích hoạt để xử lý việc quét bên dưới. Hình ảnh dưới đây giúp làm nổi bật mức độ nghiêm trọng của vấn đề – với mỗi truy vấn quét được biểu diễn bằng tăng đột ngột, bạn có thể thấy:

 

Tôi đã ném một chỉ mục vào mỗi cột, cho rằng việc tìm kiếm một cái gì đó như ‘% JRR% Tolkien%’ đối với một bảng lớn như vậy có thể sẽ thích sử dụng quét chỉ mục thay vì quét bảng. Cả hai chỉ mục đều cần 533MB đĩa để tạo. Và, chắc chắn, SQL Server đã sử dụng các chỉ mục này ngay khi chúng xuất hiện, nhưng nó chỉ cắt giảm khoảng 1/4 của những gì họ sử dụng, và vẫn giữ CPU sử dụng về nơi mà nó đã có trước đó – có nghĩa là bạn có thể vẫn SEE các truy vấn này đang được thực hiện bởi gai CPU nói của họ.

Nhập Nhập Toàn Văn bản
Tôi đã tìm ra rằng kể từ khi Full Text Indexing thực sự tokenizes dữ liệu chỉ mục, thay vì chỉ lưu trữ nó trong một B-Tree, rằng chúng ta sẽ kết thúc với một cấu trúc chỉ số nhỏ hơn nhiều. Tôi cũng hy vọng, nếu chúng ta có thể có được một chỉ mục nhỏ hơn để làm việc, chúng ta sẽ thấy một sự giảm đáng kể trong số lần đọc / churn đang diễn ra trên máy chủ.

Tạo một Đầy đủ Văn bản Chỉ mục trên 8M + hàng đã một công bằng trong khi. Nhưng tôi rất vui khi thấy nó chỉ có 133MB (so với 533MB của các chỉ số ‘truyền thống’). Điều đó làm tôi hy vọng rằng ít nhất chúng ta sẽ thấy khoảng một phần 4 giảm số lần đọc.

Hóa ra tôi đã nhiều hơn tôi đã lường trước. Kế hoạch thực hiện thực tế cho truy vấn sử dụng LIKE và% đã đến với chi phí khoảng 27 hoặc 28 trên cơ sở phù hợp. Nó cũng mất 5-7 giây cho mỗi truy vấn. (Vâng, điều đó đặt nó gần như vào lĩnh vực làm cho nó trở thành một ‘truy vấn từ địa ngục’ – nhưng chắc chắn là một cái gì đó bạn không muốn mọi người chỉ bắn ra theo kiểu “ad-hoc” giống như họ thực sự CẦN làm với truy vấn này trong câu hỏi.)

Với chỉ mục văn bản đầy đủ, kế hoạch thực hiện thực tế giảm xuống 0,27 – làm cho nó nhanh hơn 100 lần so với đối tác truyền thống. Thời gian thực hiện cũng giảm xuống còn 0 giây (trong Management Studio). Trong các trường hợp trước đây, nơi tôi đã sử dụng Đánh chỉ mục văn bản đầy đủ, tôi chỉ làm việc với một bảng với ít hơn 300K hàng. Chỉ cần nói rằng tôi đã được khá tickled tại tăng hiệu suất điên cung cấp trên một bảng hàng 8M với tên miền bán rộng (tác giả và tiêu đề) được lập chỉ mục.

Vì vậy, giữ cho những hiệu suất điên về những lợi ích trong tâm trí trong thời gian tới bạn đang bị cám dỗ để được một chút dismissive của ‘trên không’ mà toàn văn chỉ mục có thể thêm vào môi trường của bạn.

Đây là một khuôn mẫu mà tôi đã sử dụng trong SQL

máy chủ cho khi tôi phải viết con trỏ. Lưu ý rằng chỉ có một câu lệnh tìm nạp trong đó có nhiều slicker hơn là phương pháp điển hình để thực hiện tìm nạp ban đầu, với một điều kiện trong khi đó (@@ fetch_status <> 0) và sau đó là một lần nạp khác trong vòng lặp while. Điều này rõ ràng là tẻ nhạt và quá nhiều mã cho tôi vì tôi không thể nhớ thay đổi câu lệnh tìm nạp ở cả hai phần. Vì vậy, tôi bắt đầu sử dụng các mẫu dưới đây … thông báo trong khi (1 = 1) và sau đó lấy ra bên trong với một break nếu nó là kết thúc của con trỏ. Khi tôi lần đầu tiên nhìn thấy điều này tôi không thể tin rằng nó đã quá lâu để đi lên với một cái gì đó như thế này. Hãy cho tôi biết nếu bạn có bất kỳ tinh chỉnh hoặc gợi ý.

 declare @myvariable varchar(50) declare mycursor cursor forward_only for Select field1 from mytable open mycursor while (1=1) begin fetch next from mycursor into @myvariable if @@fetch_status <> 0 break; end close mycursor deallocate mycursor

Tôi thiết lập tất cả các thanh công cụ của tôi để bay ra và nó là khá khó chịu làm thế nào chậm là hình ảnh động. Tôi tìm thấy liên kết này và quyết định thử nó ra và nó hoạt động tuyệt vời!

http://blogs.msdn.com/euanga/archive/2007/10/01/ssms-window-animation-speed.aspx

Tôi sẽ quan tâm đến việc biết cài đặt cấu hình khác mà bạn có thể thay đổi trong tập tin đó là tốt. Hãy cho tôi biết nếu bạn biết những người khác.

Tôi đã luôn ghét việc gõ và sử dụng con chuột vì vậy tôi luôn cố gắng tìm các phím tắt và phím nóng cho mọi môi trường phát triển tôi đang nhập. Có nói rằng tôi nghĩ rằng tôi sẽ chia sẻ những gì tôi đã thiết lập tùy chỉnh cho SQL Server Management Studio. Cho đến khi tôi bắt đầu chơi đùa với họ, tôi thực sự không nhận ra tất cả là có thể. Về cơ bản bạn chỉ cần đánh dấu một số văn bản trong bảng phân tích truy vấn và sau đó nhấn phím nóng và nó sẽ chuyển văn bản được đánh dấu vào bất cứ mã nào đang thực hiện phím nóng. Vì vậy, đây là những gì tôi sử dụng hiện nay

ALT + F1 = sp_help – Điều này hữu ích để làm nổi bật một bảng hoặc proc và sau đó nó sẽ trả về tất cả các tham số đầu vào hoặc các cột trên bảng

CTRL + F1 = sp_helptext – Điều này sẽ cho phiên bản biên dịch của một proc hoặc chức năng và dễ dàng hơn nhiều so với việc tìm kiếm nó trong thám hiểm đối tượng. Tôi thường làm một ctrl-t trước khi chạy này để đưa kết quả trong chế độ văn bản.

CTRL + 1 = sp_who2 – Điều này trả về tất cả các spids đang hoạt động

CTRL + 2 = sp_block_info – Điều này sẽ hiển thị tất cả các khối trên cơ sở dữ liệu và rất hữu ích nếu bạn đang gặp phải sự ngăn chặn vì nó cho thấy câu lệnh bị chặn và câu lệnh chặn. Đây là một proc tùy chỉnh lấy từ Microsoft SQL Server Phát triển Nhóm Khách hàng Tư vấn Blog. Đây là mã cho nó. LƯU Ý: điều này chỉ hoạt động trên cơ sở dữ liệu chạy SQL Server 2005 vì nó sử dụng Dynamic Management Views.

CREATE proc sp_block_info như chọn getdate () như là BlockDate, db_name (resource_database_id) như là [cơ sở dữ liệu], t1.resource_associated_entity_id như [blk đối tượng], t1.resource_type như [loại khóa], t1.request_mode như [khóa req], — khóa yêu cầu t1.request_session_id như [waiter sid], — spid của người phục vụ t2.wait_duration_ms như [chờ thời gian], (chọn văn bản từ sys.dm_exec_requests như r — get sql cho waiter cross áp dụng sys.dm_exec_sql_text (r. sql_handle) trong đó r.session_id = t1.request_session_id) như waiter_batch, (chọn substring (qt.text, r.statement_start_offset / 2, (trường hợp khi r.statement_end_offset = -1 sau đó len (chuyển đổi (nvarchar (max), qt.text )) 2) từ sys.dm_exec_requests as r cross áp dụng sys.dm_exec_sql_text (r.sql_handle) như là qt trong đó r.session_id = t1.request_session_id) như waiter_stmt, — tuyên bố bị chặn t2.blocking_session_id như [blocker sid], – spid của blocker (chọn văn bản từ sys.sysprocesses như p — get sql cho blocker c ross áp dụng sys.dm_exec_sql_text (p.sql_handle) trong đó p.spid = t2.blocking_session_id) như blocker_stmt từ sys.dm_tran_locks như t1, sys.dm_os_waiting_tasks như t2 trong đó t1.lock_owner_address = t2.resource_address

CTRL + 3 = sp_findtext – Đây là một proc tùy chỉnh tôi có mà tìm kiếm tất cả các procs, chức năng, quan điểm cho bất cứ điều gì bạn đã làm nổi bật. Điều này là rất tốt cho việc tìm kiếm tất cả các địa điểm một cột được sử dụng hoặc một bảng được tham chiếu. Đây là mã cho nó. Hãy cho tôi biết nếu bạn có bất cứ điều gì khác biệt mà làm việc tốt hơn.

CREATE procedure sp_FindText @in_text varchar (8000) as – exec sqldev..sp_findtext Tập hợp khách hàng @in_text = ‘%’ + @in_text + ‘%’ chọn [Cơ sở dữ liệu], [Tên], [Loại] từ (chọn ‘ mydb ‘as [Cơ sở dữ liệu], o.Name, o.Type từ mydb..syscomments c (nolock) tham gia mydb .. sysobjects o (nolock) trên o.id = c.id nơi c.text như @in_text union chọn’ mydb2 ‘as [Cơ sở dữ liệu], o.Name, o.Type từ mydb2..syscomments c (nolock) tham gia mydb2..sysobjects o (nolock) trên o.id = c.id nơi c.text như @in_text) x trật tự bởi [Cơ sở dữ liệu], tên, Loại

ctrl + 4 = select top 100 * from – Đây là một trong số các mục yêu thích của tôi …. không cần nhập thêm từ mytable để xem dữ liệu trông như thế nào cho một bảng nhất định. Đơn giản chỉ cần đánh dấu các tablename trong cửa sổ truy vấn và nhấn ctrl + 4 và bạn sẽ nhận được 100 hàng đầu tiên. Handy để nói rằng ít nhất !!

Phần còn lại của những cái tôi đã thiết lập làm một lựa chọn từ các bảng cụ thể. Ví dụ: bạn có bảng khách hàng và bạn luôn cần phải tìm kiếm khách hàng theo số khách hàng khi thực hiện các truy vấn quảng cáo đặc biệt trong phân tích truy vấn. Bạn có thể thiết lập một phím nóng cho một cái gì đó như thế này “select * from Customer where CustomerNumber =”. Sau đó, chỉ cần gõ một số khách hàng trong bộ phân tích truy vấn (nói 123456), đánh dấu nó và nhấn phím nóng cho nó. Tôi có 4 hoặc 5 phím nóng thiết lập như thế này và nó thực sự tiết kiệm rất nhiều đánh máy và tăng năng suất khá một chút.

Ngoài ra đây là một liên kết đến tất cả các phím nóng của trình soạn thảo cho SQL Server Management Studio.

http://msdn2.microsoft.com/vi-vn/library/ms174205.aspx

Cuối cùng, nếu ai đó có bất kỳ cài đặt phím nóng khác với những gì tôi có, xin vui lòng gửi một bình luận.

Chia sẻ bài đăng này: gửi email nó! | đánh dấu nó! | digg it! | reddit! | đa No! | sống nó!
Được đăng Thứ sáu, 03 tháng tám, 2007 2:32 CH bởi gstark

 

Thông báo về Nhận xét

Nếu bạn muốn nhận email khi cập nhật bài viết này, vui lòng đăng ký tại đây

Đăng ký nhận xét của bài đăng bằng cách sử dụng RSS

Điều chỉnh chỉ số là cái gì đó mà tôi _ thích thú – chủ yếu bởi vì tôi chỉ thích nhìn thấy những cải tiến về hiệu suất. Nó luôn luôn thú vị để thấy những cải tiến hữu hình trong các hệ thống hiện có.

Gần đây khi nhìn vào một truy vấn đã gây ra rất nhiều lần đọc cho một trong những khách hàng của tôi, tôi xác định rằng mặc dù truy vấn đã sử dụng Index rất tốt nhưng vẫn đang thực hiện một số dấu trang – một số dấu trang đắt tiền chiếm gần 18% của tất cả các lần đọc trên hệ thống của khách hàng. Vì vậy, một chỉ số bao trùm dường như là sự lựa chọn hợp lý. Việc tìm ra những gì cần thiết cho một chỉ mục bao gồm chỉ cần một chút giải mã, nhưng gần đây tôi đã thấy thông báo rằng SQL Server 2005 làm cho nó tấn dễ dàng hơn để tìm ra những gì cột cần phải được tính cho.

Kiểm tra nắp màn hình sau đây của truy vấn mẫu mà tôi đang làm việc từ Kế hoạch Thực hiện Đồ hoạ dự toán của SS 2000:

Nó cho thấy rằng hoạt động bookmark chiếm 50% tổng số nỗ lực của truy vấn. Và đó là về nó.

Bây giờ hãy nhìn vào màn hình này từ kế hoạch thực hiện ước tính đồ họa của SS 2005:

Spiffy eh?

Nghiêm túc, nói về một liên lạc tốt đẹp.

Dan Wahlin vừa gửi một tin nhắn đến một trong những danh sách trên aspadvice về một số hành vi thú vị mà ông nhận thấy trong VS 2005 – thực hiện một sproc (đối với SQL Server 2000) từ bên trong VS 2005 đã không trả lại toàn bộ bộ kết quả mà ông mong đợi. Ông có thể thực hiện sproc trong QA, và nó đã làm việc tốt. Thực hiện trong VS 2005 sẽ chỉ cho anh ta có bao nhiêu hàng nên ở đó (tức là x hàng bị ảnh hưởng), nhưng sẽ không hiển thị các hàng.

Ngạc nhiên, tôi bắn thử nghiệm nhỏ của riêng tôi. Các sproc đầu tiên tôi kiểm tra làm việc hoàn hảo – tất cả mọi thứ trở lại như mong đợi. Sau đó, tôi lấy Sproc của Dan, sửa đổi nó một chút để lấy dữ liệu từ systables địa phương như ‘phụ’ thay vì kéo từ các bảng Dan đã được kéo từ và thử nghiệm nó. Chắc chắn – tôi thấy hành vi mà anh ấy đăng.

Nhanh chóng quét các sự khác biệt ngay lập tức cho thấy rằng tôi làm việc sproc đã làm một Set NOCOUNT ON – ông đã không. Một nhanh chóng tinh chỉnh, và tiếp theo thử nghiệm, và sproc của ông đã làm việc như mong đợi. SET NOCOUNT ON được sử dụng để nói với SQL Server rằng ít nói chuyện hơn – tức là ngừng nói với khách hàng từng bước, và thổi bởi sự thực hiện thổi của mọi dòng mã. Nó cũng có thêm lợi ích cho phép nhiều tập kết quả được trả lại cho các khách hàng có xu hướng Bail ngay khi kết quả được trả về từ máy chủ – chẳng hạn như ADO 2.x và dường như là khách hàng được sử dụng bởi VS 2005.

Là một nhà tư vấn, tôi không cần phải viết lại một truy vấn kém hiệu quả hoặc sproc mà không có sự hiểu biết đầy đủ về các quy tắc cơ bản hoặc ngữ cảnh. Cải thiện hiệu suất là mục tiêu được nêu ra, nhưng độ trung thực dữ liệu được ngụ ý là quan trọng.

Nhập kiểm tra đơn vị – điều mà nhiều người trong chúng ta dựa nhiều vào sự phát triển ‘bình thường’ ở cấp ứng dụng. Với sprocs / truy vấn tôi đã tìm thấy hai phương pháp tiếp cận mà làm việc tốt cho các đơn vị kiểm tra.

1) Tập tin văn bản: CTRL + SHIFT + F là bạn của bạn. Sử dụng nó để ‘ghi’ truy vấn kết quả trong hoặc QA hoặc MS vào một tập tin .txt, thay vì gửi kết quả để Text / Grid. Chỉ cần chắc chắn để đánh giá các tham số trong truy vấn / sproc được nhắm mục tiêu, và ghi một vài tập kết quả vào đĩa như các tập tin .txt. (Hãy chắc chắn để theo dõi những params tương ứng với tập kết quả). Sau đó, tinh chỉnh sproc / truy vấn của bạn nếu cần, sau đó chạy lại cùng một params, và xuất ra các tập tin văn bản tương ứng. Tại thời điểm này, bạn có thể chỉ cần sử dụng một ứng dụng differencing đơn giản (tôi thích sử dụng WinMerge – miễn phí và tuyệt vời) để xác minh rằng những thay đổi của bạn không ảnh hưởng đến logic.

2) Dữ liệu SQL So sánh: Red-Gate là bạn của bạn. (Đây là cách tiếp cận mà tôi thường sử dụng). Thay vì ‘đốt’ kết quả đến tập tin .txt, ‘đốt’ chúng vào ‘temp’ bảng trong DB. (Bởi ‘temp’ Tôi có nghĩa là dbo.unittest__12a hoặc một cái gì đó tương tự – không #temp, như tôi cần các bảng để xuất hiện để sử dụng bởi công cụ Red-Gate.) Chỉ cần đảm bảo rằng mỗi ‘temp’ bảng có một PK, và rằng bạn đã tạo bao nhiêu khi cần thiết để xác thực đầy đủ tất cả các tham số của bạn – sau đó tinh chỉnh các proc / truy vấn nếu cần, và sau đó sử dụng SQL Data So sánh để so sánh tất cả các bảng được sử dụng cho bài kiểm tra đơn vị của bạn. Tôi thích tuyến đường này vì nó cung cấp một cách nhìn rất rõ ràng để nhanh chóng so sánh kết quả.

Chào mọi người,

Tôi chỉ thấy vấn đề này trong SQL 2005.

Thực hiện theo các bước sau và bạn sẽ thấy rằng ORDER BY bị bỏ qua trong truy vấn phụ:

1. Tạo chế độ xem ví dụ: SELECT * FROM [Users] ORDER BY [FirstName] …. Lưu nó thành vwUsers

2. Bây giờ chạy điều này trong Query Analyzer .. SELECT * T FROM [vwUsers]

Bạn sẽ nhận thấy rằng Sắp xếp theo sẽ bị bỏ qua. Bất cứ ai có giải pháp cho điều này?

-Yen

Re: Thứ tự bị bỏ qua trong SubQuery (Views) – PROBLEM

Hmmm. Bạn tạo Chế độ xem này như thế nào?

ORDER BY trong một lần xem là không hợp lệ về mặt kỹ thuật – ngay cả trong SS 2005. Có một cách để vượt qua nó (thông thường) trong SS 2000 bằng cách sử dụng thủ thuật “PER 100 PERCENT”

SELECT TOP 100% PERCENT * FROM [Users] ORDER BY [FirstName]

Nhưng điều đó không làm việc nữa. Về mặt kỹ thuật nó không thực sự được bảo đảm để làm việc – nó chỉ hoạt động mà nó luôn luôn làm trong SS 2005.

Đây là một tuyên bố xác nhận rằng nó chính thức bị phá vỡ:
Trong SQL Server 2005, mệnh đề ORDER BY trong định nghĩa chế độ xem chỉ được sử dụng để xác định các hàng được trả về bởi mệnh đề TOP. Mệnh đề ORDER BY không đảm bảo kết quả ra lệnh khi xem truy vấn, trừ khi ORDER BY cũng được chỉ định trong truy vấn chính nó. [1]

[1]: http://msdn2.microsoft.com/en-us/library/ms143179(SQL.90).aspx (Breaking Changes – di chuyển đến T-SQL ‘breaks’).

Các vấn đề lớn mặc dù … chỉ ORDER tập kết quả cuối cùng của bạn / cuối cùng.

Re: Thứ tự bị bỏ qua trong SubQuery (Views) – PROBLEM

Vấn đề là do trình tối ưu hóa truy vấn SQL 2005, bỏ qua PERCENT TOP 100 (100%) bởi Nhà thiết kế Xem cho bất kỳ điểm nào với một mệnh đề ORDER BY) là thừa. Tuy nhiên, bất kỳ giá trị nào của điều khoản TOP sẽ hoạt động, có hoặc không có PERCENT.

Để đảm bảo nhận được tất cả (hoặc số lượng tối đa có thể) hồ sơ của bạn trở lại, với việc sắp xếp áp dụng, chỉ cần sử dụng TOP MAX (int) hoặc TOP 2147483647 thay vì TOP (100) PERCENT. Nhưng làm điều này chỉ khi bạn hoàn toàn có một cái nhìn được sắp xếp. Chế độ xem Phân loại không hiệu quả và không chuẩn và có thể gây ra sự cố về tính tương thích trên đường. Bạn nên làm các khoản ORDER BY trong truy vấn mà các cuộc gọi các View, nó ở tất cả các có thể.

Lưu ý rằng nhà thiết kế da Vinci sử dụng trong Studio Quản lý SQL Server 2005 (Express hoặc đầy đủ, SP1 hoặc cách khác) và Access 2007 trong Chế độ Dự án (và các công cụ trước đó) sẽ tự động áp dụng TOP (100) PERCENT cho bất kỳ Xem nào có mệnh đề ORDER BY . Bạn cần phải thay đổi bằng tay. Lưu ý rằng nhà thiết kế sẽ hiển thị kết quả được sắp xếp đúng trong bảng kết quả Truy vấn Kiểm tra, nhưng kết quả thực tế sẽ không được phân loại, nếu bạn sử dụng TOP (100) PERCENT.

Đây là những lỗi mà thực sự cần phải được sửa chữa trước khi RTM phát hành, và chắc chắn trong SP1 nếu không phải là trước!

Tôi đã nhận thấy rằng đôi khi tôi sẽ có một thủ tục lưu trữ bắt đầu mất một khoảng thời gian bất thường để hoàn thành. Trong cố gắng để gỡ lỗi này tôi lấy các SQL đang được gọi từ ứng dụng và dán nó vào SQL Server Management Studio chỉ để có nó trở lại trong một giây. Vì vậy, tôi thử lại từ ứng dụng, và phải mất hơn một phút. Sau khi săn bắn và kéo tóc của tôi tại sao điều này sẽ được tôi phát hiện ra rằng kết nối từ ứng dụng có tùy chọn Arithabort tắt và trong SQL Server Management Studio, mặc định tùy chọn Arithabort được bật. Vì vậy, tôi đã đi trước và chạy một Arithabort đặt ra và sau đó chạy thủ tục lưu trữ trong SQL Server Management Studio và chắc chắn nó chạy mãi mãi. Từ những gì tôi có thể nói có tùy chọn này tắt đã gây ra các ưu hoa truy vấn để chọn một số kế hoạch truy vấn khủng khiếp. Tôi biết SQL Server caches kế hoạch truy vấn của các tùy chọn kết nối, nhưng điều này chỉ không có ý nghĩa nhiều với tôi. Sửa chữa tốt nhất tôi đã đưa ra cho điều này là để biên dịch proc với “với biên dịch lại” tùy chọn. Tôi không thực sự thích tùy chọn này vì SQL Server sẽ không bộ nhớ cache kế hoạch truy vấn, nhưng tôi đã không tìm thấy bất kỳ giải pháp khác mà làm việc nhất quán. Bạn có thể làm điều này như vậy.

Tạo thủ tục MyStoredProcedure @MyParameter varchar (10) với Recompile as select 1
Tôi quan tâm đến những gì người khác đã tìm thấy cho một giải pháp cho vấn đề này hoặc bất kỳ cái nhìn sâu sắc khác vào điều này vì nó là khá khó chịu và nếu bạn không chạy vào nó trước khi nó có thể được khá tốn thời gian và gây phiền nhiễu.

Gần đây tôi đã giúp Steve lưu trữ một loạt dữ liệu từ một trong các bảng của ông. Thật không may là ông đã không có một tấn diskspace để sử dụng một số các kỹ thuật tôi bình thường sẽ. Steve gần đây đã đăng một giải pháp bằng cách sử dụng PowerShell để làm điều này. Tôi nói với anh ta về một cách dễ dàng để làm điều này bằng cách sử dụng một con trỏ và một bảng số và ông nói với tôi để viết blog. Đây là một cách tuyệt vời để sử dụng một bảng số nếu bạn không có trong số này trong cơ sở dữ liệu của bạn, bạn nên tạo một bảng.

Đây là một kịch bản để tạo ra một bảng số.

CREATE TABLE dbo.Numbers (Số int IDENTITY (1, 1) PRIMARY KEY) GO khai báo @MaxNumber int set @MaxNumber = 65535 WHILE 1 = 1 BEGIN INSERT INTO dbo.Numbers Giá trị DEFAULT IF range_identity () = @MaxNumber BEGIN BREAK END END ĐI
Vì vậy, về cơ bản Steve muốn xóa tất cả dữ liệu ra khỏi bảng một ngày tại một thời điểm cho một phạm vi ngày và sau đó thu nhỏ đăng nhập để tránh. Cách đơn giản nhất tôi có thể nghĩ đến để làm điều này là tạo ra một con trỏ của tất cả các ngày tháng trong phạm vi ngày đó và sau đó lặp lại chúng. Chú ý tham gia vào bảng số cho tất cả các Số giữa 0 và ngày tháng của ngày bắt đầu và ngày kết thúc. Đây là mã …

khai báo @startdate datetime khai báo @enddate datetime – Khai báo các ngày thiết lập @startdate = ’01 / 01/2007 ‘set @enddate = ’10 / 01/2007’ khai báo @data datetime khai báo con trỏ datecursor forward_only cho Dateadd (d, Number , @ begindate) từ Numbers trong đó Number <= datediff (d, @startdate, @enddate) thứ tự bởi Số datecursor mở trong khi (1 = 1) bắt đầu tìm nạp tiếp theo từ datecursor vào @ thời gian nếu @@ fetch_status <> 0 phá vỡ; DELETE các số liệu thống kê WHERE period = @Period BACKUP LOG stats VỚI NO_LOG DBCC SHRINKFILE (stats_log, 2) kết thúc dateccess dở bỏ datecursor

Recent Posts

Recent Comments

    Archives

    Categories

    Meta