Sử dụng ký tự đại diện trong câu lệnh tương tự trên cột VARCHAR (MAX) chưa được lập trình với hơn 1 triệu bản ghi


7

Để khắc phục sự cố, tôi có một câu hỏi một lần là liệu một varchar(max)trường cụ thể có chứa các ký tự ASCII không in (trừ khoảng trắng) không. Sau đây là ý tưởng đơn giản của tôi về cách xác định xem có những ký tự như vậy được lưu trữ trong cơ sở dữ liệu sản xuất của chúng tôi hay không.

SELECT TOP 10 [CaseNoteId]
      ,[CaseId]
      ,[CaseNote]
  FROM [DB].[XY].[ReferralCaseNotes]
  WHERE CaseNote LIKE ('%[' + CHAR(1) + '-' + CHAR(8) + CHAR(11) + CHAR(12) + CHAR(14) + '-' + CHAR(31) + CHAR(127) + ']%')

Sự do dự của tôi khi thực sự chạy điều này xuất phát từ việc sử dụng các ký tự đại diện trong mẫu THÍCH, rằng có hơn một triệu bản ghi trong bảng được đề cập, thiếu chỉ mục toàn văn trên cột này và đây có thể sẽ là một tìm kiếm toàn diện vì chúng tôi không tin rằng bất kỳ nhân vật như vậy tồn tại.

Tôi là một tân sinh viên. Làm cách nào tôi có thể ước tính liệu việc chạy truy vấn này có phải là một tải đáng kể trên hệ thống sản xuất của chúng tôi không? Ngoài ra, có cách nào tốt hơn để có cùng thông tin không?

Những cải tiến có thể có:

  1. Tôi không lo lắng về việc thay đổi dữ liệu trong khi truy vấn của tôi chạy. Tôi có thể thay đổi truy vấn này để xem xét một vài hàng tại một thời điểm có lợi không?
  2. Tôi có thể đặt truy vấn này thành một hoạt động nền nào đó mà không cản trở bất kỳ truy vấn nào khác không?
  3. Tôi có thể chạy nó trong một thời gian giới hạn và xác định tỷ lệ phần trăm của bảng đã được tìm kiếm để tôi có thể ước tính thời gian cần thiết cho một tìm kiếm đầy đủ không?
  4. Sẽ WITH(READPAST)cải thiện hiệu suất của tôi?

Tại sao?

Cơ sở dữ liệu trong câu hỏi liên quan đến dữ liệu nhạy cảm, chính phủ và những người bảo mật đưa ra các quy tắc. Khôi phục một bản sao lưu cho một máy chủ khác có ý nghĩa rất lớn, nhưng sẽ khiến người nộp thuế phải trả nhiều đơn hàng lớn hơn nhiều so với bất kỳ ý nghĩa nào.

Nếu câu trả lời là "Đừng lo lắng, bạn chỉ đang thực hiện CHỌN", thì tôi nói, "Tuyệt vời!"


3
Điều đầu tiên, đừng chạy nó trên hệ thống sản xuất của bạn! Lấy đêm qua sao lưu, khôi phục nó vào môi trường dev của bạn và chạy nó ở đó. Nếu bạn không có những thứ đó, có lẽ bạn xứng đáng gặp rắc rối.
paqogomez

Truy vấn không có khả năng gây ra bất kỳ vấn đề nào vì đây chỉ là một câu lệnh chọn. Nếu bạn thực sự lo lắng, bạn có thể khôi phục bản sao lưu cơ sở dữ liệu trên máy chủ thử nghiệm và chỉ cần chạy truy vấn dựa vào đó?

Sử dụng 'top' không giới hạn bạn chỉ tìm kiếm 10 hàng. Bạn vẫn làm một tìm kiếm toàn bộ bảng. Tôi đề nghị bạn thực hiện loại tìm kiếm này trên máy chủ sao lưu. (Bạn rõ ràng có máy chủ dự phòng, phải không?).
vasin1987

1
Biết rằng có hơn 1 triệu hàng không thực sự có ích. Mỗi giá trị varchar (tối đa) có thể là bất cứ thứ gì lên tới 2 gb, vì vậy tác động có thể là bất cứ thứ gì từ tầm thường đến quét 2 petabyte dữ liệu.
Martin Smith

1
Không có khả năng nhiều dữ liệu có thể có trong bộ nhớ, vì vậy tất cả các lần đọc sẽ vào đĩa. Bây giờ, nếu chỉ là 1 triệu hàng với 2-3 ký tự, thì đó là một lần quét ngắn. Nếu đó là 2 petabyte, như @MartinSmith nói, đó sẽ là một ngày dài :-). Đó là lý do tại sao câu trả lời chỉ có thể được đưa ra khi bạn biết kích thước thực của bảng đó (vì bạn sẽ quét toàn bộ bảng) - sp_spaceuse sẽ cung cấp cho bạn câu trả lời.
Marian

Câu trả lời:


4
  1. Nếu cách ly ảnh chụp nhanh được bật, bạn sẽ không gặp vấn đề chặn nào. Nếu không, có lẽ bạn nên chạy truy vấn dưới READ COMMITTEDhoặc thậm chí READ UNCOMMITTED. Đó là một huyền thoại phổ biến rằng READ COMMITTEDquét quét khóa bảng.
  2. Bạn có thể sử dụng Resource Governor cho việc này. Hoặc sử dụng một MAXDOP 1gợi ý. Kiểm soát tải các hoạt động hàng loạt là rất khó với SQL Server. Tùy thuộc vào tình huống, bạn có thể ổn 100% khi việc này hoạt động cả ngày hoặc bạn có thể gây ra thời gian chờ trong các phần khác của khối lượng công việc. Nó không phải là không hợp lý để chạy truy vấn trong 10 giây và hủy bỏ nó. Sau đó xác định xem khối lượng công việc của ứng dụng có bị ảnh hưởng hay không.
  3. Tôi muốn thực hiện ước tính tiến độ bằng cách chia kích thước bảng (tính bằng MB) cho tốc độ đọc đĩa được quan sát (tính bằng MB / giây). Điều này đưa ra một ước tính cho tổng thời gian quét.

Tìm kiếm Fulltext không thể giúp bạn vì nó hoạt động trên cơ sở mỗi từ. Bạn cần phải cắm vào một trình phát gốc tùy chỉnh biết cách phân tách các ký tự đặc biệt. Không thực tế. Truy vấn của bạn là tốt.


0

Nếu bạn lo lắng về hiệu suất của truy vấn của mình, bạn có thể tận dụng tối đa các công cụ Kế hoạch thực thi truy vấn được tích hợp sẵn của SQL Server để cho bạn biết bao nhiêu nỗ lực mà truy vấn dự kiến ​​sẽ thực hiện và phần nào của nó sẽ là lực cản lớn nhất đối với hiệu suất để bạn có thể tinh chỉnh nó sau.

Bạn có thể thử một số kịch bản về cách bạn nghĩ truy vấn sẽ hoạt động tốt nhất cùng với mã bạn đã đăng ở đây, sau đó thời gian kết quả và xem kế hoạch thực hiện cho từng kế hoạch. Bằng cách này, bạn sẽ biết lợi ích và sự đánh đổi của từng truy vấn và có thể tìm ra mọi thứ tương ứng.

PS: Vì đây sẽ là cơ sở dữ liệu sản xuất, tôi thực sự khuyên bạn nên đưa dữ liệu này vào môi trường thử nghiệm giống với sản xuất nhất có thể vì máy chủ ít mạnh hơn hoặc tài nguyên ít hơn dành cho phiên bản MSSQL của bạn có thể cung cấp cho bạn sai ý tưởng về thời gian thực hiện dự kiến ​​và dẫn đến rất nhiều nỗ lực trong việc tối ưu hóa một cái gì đó vượt quá mức lợi nhuận giảm dần khi nó được sản xuất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.