2010-02-22 26 views
16

Tôi có cơ sở dữ liệu trong sản xuất với một bảng đã phát triển rất lớn (nhiều dữ liệu tích lũy).Cách tốt nhất để triển khai chỉ mục mới vào bảng rất lớn trong SQL Server 2008

Để cải thiện hiệu suất truy vấn, tôi đã sử dụng trình tối ưu hóa máy chủ sql đã đề xuất một chỉ mục mới.

Vì vậy, tôi đã sao chép cơ sở dữ liệu sản xuất để kiểm tra và cải thiện hiệu suất, tuy nhiên vấn đề của tôi là mất khoảng 24 giờ để tạo chỉ mục và trong khi chỉ mục đang được tạo thì ứng dụng không thể sử dụng được.

Đối với ứng dụng cụ thể này, giảm một vài giờ không phải là vấn đề nhưng thời gian ngừng hoạt động là 24 giờ và tôi đang tìm cách tạo chỉ mục này mà không phải thực hiện điều đó.

Tôi chỉ có một vài ý tưởng vào lúc này.

Một ý tưởng là sao chép bản sao lưu sang máy chủ khác. Áp dụng chỉ mục mới và bất kỳ thay đổi nào khác. Sao chép bản sao lưu trở lại máy chủ sản xuất. Đưa ứng dụng xuống và hợp nhất trên bất kỳ dữ liệu mới nào kể từ khi tôi thực hiện sao lưu.

Tất nhiên điều này có bộ vấn đề riêng của mình như phải hợp nhất dữ liệu lại với nhau vì vậy tôi không thích ý tưởng này vì lý do đó.

Đây là tiêu chuẩn chuẩn SQL Server 2008 Ed.

Tôi thường triển khai các thay đổi cơ sở dữ liệu theo tập lệnh.

CẬP NHẬT: Một ý tưởng khác là di chuyển dữ liệu lưu trữ ra khỏi bảng chính trong vài ngày theo khối. Sau đó tạo chỉ mục khi bảng đủ nhỏ. Sau đó, từ từ di chuyển dữ liệu trở lại.

+0

Không quan tâm, cài đặt maxdop nào là máy chủ và ghi đè lên maxdop (nếu có) bạn đã chỉ định khi tạo chỉ mục? – Andrew

+0

MDOP được đặt thành 0 và tôi không chỉ định bất kỳ điều gì khác trong lệnh tạo chỉ mục. Máy chủ này đang chạy như một cá thể VMWare và được cấu hình với 1 bộ xử lý. Tôi biết đó không phải là tối ưu nhưng nó là những gì nó được. Nếu tôi có thể nói chắc chắn rằng nó sẽ hoàn thành chỉ số trong X khoảng thời gian sớm hơn tôi có thể tạm thời có số lượng CPU tăng lên. – Zack

+0

1 proc, do đó, 1 chủ đề, giải thích một số tiền nhất định của vấn đề, và phần còn lại sẽ không nghi ngờ gì là thông lượng I/O rất kém. – Andrew

Trả lời

3

Do thiếu sức mạnh xử lý có sẵn trên máy ảo, kết hợp với những gì là không có nghi ngờ IO thông khá nghèo, tôi sẽ thực sự xem xét việc tính toán thời gian để sao lưu, khôi phục lại một một nửa máy chủ phong nha, chỉ mục và sau đó sao lưu/khôi phục lại cho máy ảo.

Để tránh sao lưu ban đầu mất một thời gian dài, bạn có thể sao lưu một ngày và di chuyển nó trong ngày, sau đó khi cửa sổ bảo trì bắt đầu, hãy sao lưu nhật ký giao dịch và di chuyển nó - trên cơ sở sẽ là một động thái nhỏ hơn. (Điều này giả định chế độ đăng nhập hàng loạt/đầy đủ)

+0

Điều này nghe có vẻ như là một ý tưởng thú vị, mặc dù tôi chưa từng xử lý các nhật ký giao dịch giữa các máy chủ trước đây. Chế độ đăng nhập hiện được đặt thành Đơn giản nhưng không có gì ngăn tôi thay đổi nó (?). Bạn có thể cho tôi biết thêm thông tin về các bước không? Ý tưởng sẽ là áp dụng nhật ký giao dịch từ sản xuất cho bản sao mới được vá mà chúng tôi đã cập nhật trên một máy chủ khác. Bạn sẽ áp dụng nhật ký giao dịch đó như thế nào? Liệu nhật ký có được chấp nhận với cơ sở dữ liệu có chỉ mục mà cơ sở dữ liệu đến từ đó không? Cảm ơn! – Zack

+0

Để ứng dụng hoạt động, yêu cầu cơ sở dữ liệu ở chế độ hàng loạt hoặc đầy đủ và sau đó là bản sao lưu đầy đủ được thực hiện để khởi động đúng chế độ. Cơ sở dữ liệu sau đó được khôi phục trên máy chủ phụ nhưng không được lấy ra khỏi chế độ khôi phục và bản sao lưu nhật ký giao dịch có thể được áp dụng thêm. Bước này thay vì sao lưu/phục hồi thẳng là tránh sao lưu/truyền tải sao lưu lenghty. Vấn đề là nếu bạn chưa bao giờ làm điều này trước đây, có rất nhiều phạm vi để làm cho nó sai. – Andrew

3

Nếu bạn đang sử dụng Enterprise, bạn có thể sử dụng tùy chọn ONLINE của CREATE INDEX để tạo chỉ mục mà không giữ khóa dài hạn trên bàn. Có những cảnh báo xung quanh việc sử dụng nó; xem bài viết được liên kết để biết chi tiết và bạn có thể thấy tác động hiệu suất là quá lớn. Nhưng đó là học tập như bạn đã nói bạn đang sử dụng tiêu chuẩn (xin lỗi vì thiếu rằng lúc đầu).

Thực tế đó là một máy ảo ngay lập tức làm cho người ta nghĩ về việc tạm thời "bơm" máy ảo hoặc thậm chí tạm thời chuyển đến một máy ảo không tối đa. Để xây dựng lại một chỉ số trên một bảng rất lớn, tôi nghĩ rằng RAM và tốc độ I/O sẽ là những yếu tố lớn nhất; sao máy ảo sử dụng ổ đĩa trực tiếp hoặc ổ đĩa ảo? Bạn có thể tạm thời di chuyển dữ liệu vào một ổ đĩa vật lý không? Đó là loại điều.

FWIW, ý tưởng cất giấu nó là chính xác những gì tôi làm trên cơ sở dữ liệu MySQL (không bao giờ phải trên cơ sở dữ liệu SQL Server): Lấy DB chính xuống, lấy một ảnh chụp nhanh , xóa các binlog/bật binlogging và kích hoạt lại. Lập chỉ mục trên một máy riêng biệt. Khi đã sẵn sàng, hãy xuống DB, tạo bản sao lưu của DB được cập nhật (chỉ trong trường hợp), đặt lại ảnh chụp nhanh, áp dụng các binlog và mang DB trở lại. Nó thực sự là dễ dàng; Tôi hy vọng bạn có thể làm điều đó với SQL Server là tốt. Tất nhiên, nó giả định rằng bạn có thể áp dụng 24 giờ binlog trên bảng (mới được tối ưu hóa) trong một cửa sổ thời gian chấp nhận được!

+0

Tôi nghĩ rằng tùy chọn trực tuyến chỉ khả dụng trên doanh nghiệp ed. Ngoài ra tôi nghĩ rằng nó chỉ cho phép truy cập đọc trong khi nó đang tạo chỉ mục để chúng tôi không thể ghi lại giao dịch trong hơn 24 giờ. Đúng vậy, nếu tôi sai. – Zack

+0

Tùy chọn TRỰC TUYẾN là một đề xuất tốt - rất tiếc, tùy chọn này không có sẵn trong Standard Edition. Đây là một trong những tính năng mà tôi luôn mong muốn ở tiêu chuẩn! – AdaTheDev

+0

@Zack: Ah, xin lỗi, không nhận ra đó là doanh nghiệp duy nhất (er, bất chấp ghi chú lớn trong bài viết được đánh dấu bằng màu vàng!). Bạn đang nhầm lẫn về chỉ truy vấn, mặc dù; bài viết được liên kết rõ ràng cho biết nó cho phép cập nhật. –

1

Một cách tiếp cận khác có thể không thực hiện các chỉ mục trên tất cả các bảng được trình tối ưu hóa máy chủ sql đề xuất, thay vào đó thực hiện đầu tiên trên một bảng hoặc một nhóm bảng. Như bạn đã đề cập rằng một vài giờ thời gian chết là OK, vì vậy sử dụng vài giờ này lập kế hoạch ra các bảng khác nhau mà trên đó việc lập chỉ mục cần được thực hiện. Bây giờ hàng ngày chọn những bảng có chỉ mục có thể được xây dựng trong thời gian ngừng hoạt động nhất định. Làm việc thông minh có thể dễ dàng giải quyết vấn đề này.

Kịch bản tương tự cũng chỉ xảy ra với chúng tôi khi chúng tôi chỉ có 1 giờ ngừng hoạt động hàng ngày và chúng tôi thực hiện cùng một phương pháp và trong vòng 9 ngày các chỉ mục mới được thực hiện và thời gian ngừng hoạt động cũng được sử dụng hiệu quả.

Hope this helps ...

+2

Có điều này có thể là một cách tiếp cận và thực tế hơn. – HotTester

+0

Đó là một ý tưởng hay, nhưng trong trường hợp của tôi, tôi chỉ tạo một chỉ mục mới trên một bảng. – Zack

+0

Đó là một ý tưởng hay, nhưng tôi đã đọc câu hỏi là "chỉ mục" - ví dụ: chỉ một. –

1

Tại sao không phân vùng bảng của bạn và lập chỉ mục từng phân vùng. Bằng cách này, bạn chỉ lập chỉ mục trong các phần nhỏ và sau đó bạn có thể kết hợp các phân vùng sau này.

Các vấn đề liên quan