SQL Server phân cụm chỉ mục, cân bằng chỉ mục và chèn hiệu suất bằng NewID


7

Tôi có một bảng theo dõi lớn (6db). Nó có một khóa cụm (DateTime) được tạo thông qua GETDATE ().

Nhóm kết nối cho các kết nối đến cơ sở dữ liệu / bảng này tăng trung bình lên tới 50 trên một cụm 10 máy tính, vì vậy trung bình chúng tôi có ~ 500 kết nối đồng thời cố gắng chèn.

Cơ sở dữ liệu phù hợp với bộ nhớ và hầu như không thấy IO nào cả.

Tôi đang cố gắng tìm hiểu xem liệu INSERT có được duy trì hay không, chỉ số được nhóm sẽ đạt đến điểm cân bằng lại cây và liệu điều này có gây ra sự chậm lại về số lượng chèn mà hệ thống có thể duy trì hay không.

Có một số câu hỏi trong đầu tôi là liệu việc tái cân bằng một chỉ mục có phải là thứ mà SQL Server thực hiện trên một chỉ mục được phân cụm (và thậm chí trên một chỉ mục không được phân cụm).

Câu hỏi-

  1. Có bất kỳ lý do cho hiệu suất chèn chậm định kỳ / chu kỳ của hiệu suất chèn không?
  2. Các hoạt động tái cân bằng có tự động kích hoạt trên các chỉ mục cụm?
  3. Các hoạt động tái cân bằng có tự động kích hoạt trên các chỉ mục không phân cụm không?

Thông tin khác

  • Máy chủ SQL 2008
  • Máy chủ thực sự LỚN - 256Gb, 40 lõi, LAN 40mbit ...

Bạn có một nền tảng Oracle?
usr

2
"(6db)" là gì? 6GB?
ypercubeᵀᴹ

1
Tiêu đề của câu hỏi đề cập đến NEWID()nhưng điều đó không được đề cập trong phần chính của câu hỏi. Có NEWID()liên quan đến câu hỏi này?
Solomon Rutzky

Tôi có nền tảng của Oracle và Postgres và SQL Server, nhưng tôi không phải là một DBA về vai trò (Kiến trúc sư phần mềm - tập trung vào hiệu suất và khả năng mở rộng).
Ravenor

NEWID () - có - xin lỗi. Tôi đã được cung cấp thông tin không chính xác lúc đầu.
Ravenor

Câu trả lời:


8

Có bất kỳ lý do cho hiệu suất chèn chậm định kỳ / chu kỳ của hiệu suất chèn không?

Đúng. kiểm tra các sự kiện điểm. Với khối lượng công việc lớn, máy chủ RAM lớn, như bạn mô tả, một số lượng lớn các trang 'bẩn' tích lũy trong bộ nhớ. Tại khoảng thời gian điểm kiểm tra định trước, tất cả các trang bẩn này được ghi vào đĩa, gây ra sự tăng đột biến của các yêu cầu IO. Điều này đến lượt nó làm chậm ghi nhật ký cam kết, biểu hiện là sự gia tăng thời gian phản hồi INSERT mà bạn quan sát định kỳ. QED. Tất nhiên, đây chỉ là một phỏng đoán, thiếu một cuộc điều tra thích hợp. Để có phản hồi chắc chắn hơn, tôi khuyên bạn nên đọc Cách phân tích hiệu suất của SQL Server và áp dụng các kỹ thuật được mô tả ở đó để xác định sự cố.

Nếu sự cố thực sự gây ra bởi điểm kiểm tra, thì SQL Server 2012 đi kèm với Điểm kiểm tra gián tiếp :

Các điểm kiểm tra gián tiếp, mới trong SQL Server 2012, cung cấp một mức thay thế mức cơ sở dữ liệu có thể định cấu hình cho các điểm kiểm tra tự động. ... Các điểm kiểm tra gián tiếp làm giảm tốc độ I / O liên quan đến điểm kiểm tra bằng cách liên tục ghi các trang bẩn vào đĩa trong nền .

Để thảo luận chi tiết hơn về tác động của chekcpoint đối với hiệu suất, hãy đọc SQL Q & A: Tinh chỉnh cho hiệu suất tối ưu :

Trong Tìm kiếm
gai: Tôi đang khắc phục sự cố trong đó chúng tôi thấy các đột biến I / O định kỳ từ một trong các Máy chủ SQL của chúng tôi. Tôi đã thu hẹp nó xuống các trạm kiểm soát bằng PerfMon, nhưng tôi không thể biết cơ sở dữ liệu nào là thủ phạm chính. Làm thế nào tôi có thể khoan thêm?

Pre-SQL Server 2012 bạn có tùy chọn để giảm giá trị khoảng thời gian phục hồi . Điều này sẽ tăng tần suất của các điểm kiểm tra, nhưng sẽ làm giảm số lượng trang bẩn mà mỗi điểm kiểm tra phải viết. Truyền bá dữ liệu IO giúp (mua thêm trục chính). Việc tách nhật ký IO thành đường dẫn riêng của nó (trục chính của chính nó) không giúp ích cho điểm kiểm tra, nhưng cách ly các bản ghi nhật ký khỏi các hiệu ứng và do đó giữ cho INSERT phản hồi. SSD hoạt động thần kỳ.

Tôi sẽ tư vấn chống lại bất kỳ thay đổi cấu trúc. Theo tôi bạn đã có chỉ số phân cụm tốt nhất cho chuỗi thời gian. Bất kỳ thay đổi cấu trúc nào cũng sẽ phải được hỗ trợ bởi phân tích hiệu suất gốc-nguyên nhân chỉ ra cấu trúc hiện tại là một vấn đề.


+1 điểm tốt về CHECKPOINT.
Solomon Rutzky

Điểm tuyệt vời. Tôi đã không xem xét IO / trạm kiểm soát trong một thời gian dài - kết quả của một phụ trợ EMC quá khổ với băng thông đủ để áp đảo 'Ma trận'. Tôi sẽ kiểm tra về điều này.
Ravenor

Rõ ràng là một khối lượng công việc không liên quan đến SQL không hoàn hảo tăng vọt ở phía sau cũng có thể gây ra điều này, bất kể quản trị viên lưu trữ thân thiện của bạn yêu cầu gì;)
Remus Rusanu

8

SQL Server không "cân bằng lại cây" như một sự kiện định kỳ. Tôi đã nghe lần cuối thuật ngữ này trong bối cảnh của Oracle. Tất cả SQL Server đó làm tăng chiều cao cây khi cần thiết. Đây là một sự kiện chỉ xảy ra một vài lần trong toàn bộ sự tồn tại của cây B.

Trong một khối lượng công việc nặng DML, có thể có nhiều điều chỉnh cây nhỏ được gọi là chia trang. Đây thực sự là bất lợi cho việc sử dụng CPU và IO và chúng có thể gây ra sự phân mảnh. Nếu bạn đang chèn theo thứ tự ngày tăng dần thì vấn đề này không xảy ra vì cây "nối thêm" là trường hợp đặc biệt mà SQL Server tối ưu hóa. Trong mọi trường hợp, việc chia trang chỉ ảnh hưởng đến một số ít trang.

Không có hoạt động cây định kỳ xảy ra.

Các chỉ mục được nhóm có (gần như) cấu trúc giống như các chỉ mục không được phân cụm.

Tất cả lời khuyên về chỉ mục cây B của SQL Server thông thường đều được áp dụng: Chọn khóa một cách khôn ngoan (có vẻ như bạn có một giá trị tốt dựa trên các giá trị thời gian tăng dần) và có chiến lược phân mảnh và lấy lại không gian trong trường hợp xóa.


Xin lỗi, bạn nói đúng - Tôi đã đọc sai điều đó .....
marc_s

Cảm ơn bạn - đầu vào tuyệt vời. Thật đáng tiếc tôi không thể đánh dấu nhiều hơn một câu trả lời - đã cho bạn một upvote.
Ravenor

3

Có một tình huống trong thiết lập hiện tại của bạn mà sẽ / có thể gây ra một số suy giảm liên quan đến một chìa khóa tự động incrementing ( IDENTITY, GETDATE(), NEWSEQUENTIALID()): dưới hoạt động INSERT-đồng thời cao, có thể có tranh chấp liên quan đến việc đặt hàng trên cùng một trang. Đây được gọi là "điểm nóng" và là một trong số ít những hạn chế đối với các giá trị gia tăng tự động vì về bản chất, chúng sẽ nằm ngay cạnh nhau.

Tôi thấy thông tin mâu thuẫn về việc liệu vấn đề "điểm nóng" có còn liên quan hay không:

Có một số điều thú vị cần lưu ý liên quan đến ba liên kết sau:

  1. Một số câu trả lời trong câu hỏi DBA.SE đó đề cập đến hai liên kết khác ở trên. @Gbn đã chỉ ra rằng bài báo cho thấy vấn đề hotspot vẫn tồn tại "sử dụng một chỉ mục cụm không duy nhất trên TranTime. Điều này đòi hỏi phải thêm một công cụ duy nhất. Điều đó có nghĩa là chỉ mục không tăng đơn điệu (và quá rộng) . "
  2. Về mặt kỹ thuật, giá trị duy nhất (và do đó không gian được chiếm bởi trường ẩn đó) chỉ tồn tại trên các hàng không phải là duy nhất. Do đó, có thể thêm từng hàng, từng hàng một, theo cách đơn luồng và nó sẽ là các giá trị duy nhất sẽ tăng lên và sẽ không có giá trị uniqifier.
  3. Tuy nhiên, thử nghiệm đó đã mô phỏng 400 kết nối đồng thời chạy thử nghiệm 200 lần (mỗi lần kết nối, tôi giả sử), do đó rất có thể một vài trong số các hoạt động INSERT đó đã xảy ra ở cùng một mili giây và nhận được cùng một giá trị từ đó GETDATE().
  4. Ergo, trong khi có thể thích hợp để loại trừ thử nghiệm cụ thể đó là không hợp lệ đối với "Các điểm nóng có xảy ra khi sử dụng một giá trị duy nhất, ngày càng tăng như chỉ số được nhóm không?", Thử nghiệm đó có thể rất phù hợp ở đây. Mô tả về chỉ mục trong câu hỏi này là nó có "một khóa cụm (DateTime) được tạo thông qua GETDATE ()". Có vẻ an toàn khi giả định rằng chỉ mục trong câu hỏi này không phải là duy nhất (đặc biệt nếu đó chỉ là một trường DATETIME). Và ông đã kiểm tra 400 kết nối đồng thời trong khi câu hỏi này nói rằng có khoảng 500 kết nối đồng thời? Nghe có vẻ như một thiết lập rất giống nhau. Vì vậy, thật hợp lý khi chạy cùng một tập lệnh "SQL Server Perf Stats" để xem bạn có đang thấy sự tranh chấp LATCH tương tự hay không.

Một điều khác cần xem xét là trong khi bảo trì chỉ mục (REBUILD / REORGANIZE) không được thực hiện tự động, thì việc cập nhật số liệu thống kê được thực hiện tự động (với tỷ lệ trượt của% hàng thay đổi). Đây là cài đặt mặc định cho cơ sở dữ liệu, trừ khi bạn đặt "Thống kê cập nhật tự động" thành "sai". Có một tùy chọn liên quan là "sai" theo mặc định và đó là "Tự động cập nhật thống kê không đồng bộ" sẽ không gây ra bất kỳ chặn nào trong hoạt động cập nhật tự động đó. Việc chặn gây ra bởi hoạt động thống kê tự động cập nhật xảy ra trong quá trình tạo kế hoạch cho bất kỳ gói nào đang cần thông tin về thống kê cụ thể đang được cập nhật tại thời điểm đó. Tùy chọn "Tự động cập nhật thống kê không đồng bộ" cho phép Trình tối ưu hóa truy vấn sử dụng các thống kê được biết là cũ và đang được cập nhật; một khi các số liệu thống kê được cập nhật, chúng sẽ được sử dụng.

Một điều khác có thể gây ra sự chậm lại định kỳ của INSERT (cũng như một số CẬP NHẬT) là các hoạt động tăng trưởng tự động của dữ liệu và tệp nhật ký. Rõ ràng là bản ghi tran sẽ phát triển ngay cả với các hoạt động XÓA. Nhưng các hoạt động INSERT và các hoạt động CẬP NHẬT trong đó hàng mới lớn hơn phiên bản trước của hàng đó, có khả năng sẽ cần các trang mới được phân bổ nếu không còn chỗ trống trên trang thích hợp. Nếu không còn chỗ trống để phân bổ trang, SQL Server sẽ cố gắng phát triển tệp dữ liệu (trừ khi điều này đã bị vô hiệu hóa). Trong khi tệp dữ liệu (hoặc nhật ký) đang được phát triển, các thao tác đối với tệp đó sẽ bị chặn. Đây là lý do tại sao điều quan trọng là phải kích thước đúng các tệp dữ liệu để có chỗ cho các bảng trong đó phát triển mà không cần tự động phát triển, hoặc ít nhất là không thường xuyên.

Và để hoàn thiện, có CHECKPOINThành vi được @Remus chỉ ra trong một câu trả lời khác cho câu hỏi này.


Cần lưu ý rằng Chia tách trang không phải là một chức năng của các hoạt động DML nói chung hoặc dưới tải nặng; chúng là một chức năng của:

  1. (thứ tự chèn dữ liệu, HOẶC
  2. tăng kích thước hàng cho dữ liệu được cập nhật), VÀ
  3. có hay không có chỗ trên trang thích hợp cho một trong những sự kiện đó

Các hoạt động INSERT một luồng của khóa tăng tự động sẽ không bao giờ gây ra sự phân tách trang. Hoạt động INSERT đa luồng của một chìa khóa tự động incrementing thể (Tôi tin) được thực hiện out-of-trật tự (và do đó có khả năng gây ra một sự chia rẽ page) trong một số lượng lớn, kịch bản INSERT đồng thời tùy thuộc vào nếu các Scheduler (hệ điều hành SQL đa luồng) sẽ làm một cái gì đó như gán giá trị từ GETDATE()nhưng sau đó đặt luồng đó ở chế độ chờ trong khi một luồng khác được chèn, chỉ quay lại cái này để chèn thực tế. Tôi nhấn mạnh "nếu" vì tôi chưa chứng minh rằng điều này xảy ra. Và các hoạt động CẬP NHẬT, ở bất kỳ khối lượng nào, không nên gây ra sự chia tách trang nếu kích thước hàng không tăng.


1
Cảm ơn bạn - bình luận tuyệt vời và xem xét cho chốt et al. Tôi rất tiếc rằng tôi chỉ có thể đánh dấu một câu hỏi là chính xác - đã cho bạn một phiếu bầu xứng đáng.
Ravenor
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.