Khi giao dịch với các chỉ mục, bạn phải xác định xem bảng của bạn sẽ được sử dụng cho mục đích gì. Nếu bạn chủ yếu chèn 1000 hàng một giây và không thực hiện bất kỳ truy vấn nào, thì chỉ mục được nhóm lại là một lần truy cập đến hiệu suất. Nếu bạn đang thực hiện 1000 truy vấn một giây thì không có chỉ mục sẽ dẫn đến hiệu suất rất kém. Điều tốt nhất cần làm khi cố gắng điều chỉnh truy vấn/chỉ mục là sử dụng Trình phân tích kế hoạch truy vấn và SQL Profiler trong SQL Server. Điều này sẽ cho bạn thấy nơi bạn đang chạy vào quét bảng tốn kém hoặc chặn hiệu suất khác.
Đối với đối số GUID vs ID, bạn có thể tìm thấy mọi người trực tuyến mà cả hai đều thề. Tôi đã luôn luôn được dạy để sử dụng GUIDs trừ khi tôi có một lý do thực sự tốt không. Jeff có một bài đăng tốt nói về các lý do sử dụng GUIDs: http://www.codinghorror.com/blog/archives/000817.html.
Giống như hầu hết mọi thứ liên quan đến phát triển, nếu bạn đang tìm cách cải thiện hiệu suất thì không có một câu trả lời đúng nào. Nó thực sự phụ thuộc vào những gì bạn đang cố gắng hoàn thành và cách bạn đang thực hiện giải pháp. Câu trả lời thực sự duy nhất là kiểm tra, kiểm tra và thử nghiệm lại các chỉ số hiệu suất để đảm bảo rằng bạn đang đáp ứng các mục tiêu của mình.
[Chỉnh sửa] @Matt, sau khi thực hiện một số nghiên cứu thêm về cuộc tranh luận GUID/ID tôi đã xem qua bài đăng này. Như tôi đã đề cập trước đây, không có câu trả lời đúng hay sai. Nó phụ thuộc vào nhu cầu thực hiện cụ thể của bạn. Nhưng đây là một số lý do khá hợp lệ để sử dụng GUID làm khóa chính:
Ví dụ: một số trang dữ liệu nhất định trong bảng dưới tranh chấp tương đối cao. Về cơ bản, những gì xảy ra là hầu hết lưu lượng truy cập trên một bảng (và do đó khóa cấp trang) xảy ra trên một khu vực nhỏ của bảng, về phía cuối. Bản ghi mới sẽ luôn đi tới điểm phát sóng này, vì IDENTITY là trình tạo số liên tiếp. Những chèn này là phiền hà vì chúng yêu cầu khóa trang Exlusive trên trang mà chúng được thêm vào (điểm phát sóng). Điều này có hiệu quả serializes tất cả các chèn vào một bảng nhờ cơ chế khóa trang. Mặt khác, NewID() không bị các điểm nóng. Các giá trị được tạo ra bằng cách sử dụng hàm NewID() chỉ là tuần tự cho các cụm chèn ngắn (trong đó hàm được gọi rất nhanh, chẳng hạn như trong chèn nhiều hàng), điều này làm cho các hàng được chèn ngẫu nhiên trên các trang dữ liệu của bảng của tất cả ở cuối - do đó loại bỏ một điểm nóng từ chèn.
Ngoài ra, do chèn được phân phối ngẫu nhiên, cơ hội chia tách trang được giảm đáng kể.Trong khi một trang chia nhỏ ở đây và không có quá xấu, các hiệu ứng sẽ tăng lên nhanh chóng. Với IDENTITY, trang Fill Factor là khá vô dụng như một cơ chế điều chỉnh và cũng có thể được đặt thành 100% - các hàng sẽ không bao giờ được chèn vào bất kỳ trang nào nhưng trang cuối cùng. Với NewID(), bạn thực sự có thể sử dụng Fill Factor làm công cụ cho phép hiệu suất. Bạn có thể thiết lập Fill Factor thành một mức xấp xỉ sự tăng trưởng khối lượng ước tính giữa các chỉ số xây dựng lại, và sau đó lên kế hoạch xây dựng lại trong giờ cao điểm bằng cách sử dụng dbcc reindex. Điều này có hiệu quả làm chậm các lần truy cập hiệu suất của việc chia tách trang cho đến thời gian cao điểm.
Nếu bạn thậm chí nghĩ bạn có thể cần phải kích hoạt sao chép cho bảng được đề cập - sau đó bạn cũng có thể làm cho PK là bộ định danh duy nhất và gắn cờ trường guid là ROWGUIDCOL. Việc nhân rộng sẽ yêu cầu một trường guid có giá trị duy nhất với thuộc tính này và nó sẽ thêm một trường nếu không tồn tại. Nếu một trường phù hợp tồn tại, sau đó nó sẽ chỉ sử dụng một trong đó thats.
Tuy nhiên, một lợi ích rất lớn cho việc sử dụng GUID cho PKS là một thực tế rằng giá trị thực sự là đảm bảo độc đáo - không chỉ trong số tất cả các giá trị được tạo ra bởi máy chủ này, nhưng tất cả các giá trị được tạo ra bởi tất cả máy tính - cho dù đó là của bạn máy chủ db, máy chủ web, máy chủ ứng dụng hoặc máy khách. Khá nhiều ngôn ngữ hiện đại có khả năng tạo ra một guid hợp lệ ngay bây giờ - trong .NET bạn có thể sử dụng System.Guid.NewGuid. Điều này rất tiện dụng khi xử lý các bộ dữ liệu tổng thể chi tiết được lưu trong bộ nhớ cache nói riêng. Bạn không phải sử dụng các kế hoạch khóa tạm thời điên chỉ để liên kết các hồ sơ của bạn với nhau trước khi chúng được cam kết. Bạn chỉ cần tìm một Guid hoàn toàn hợp lệ mới từ hệ điều hành cho mỗi giá trị khóa vĩnh viễn của mỗi bản ghi mới tại thời điểm bản ghi được tạo ra.
http://forums.asp.net/t/264350.aspx
Vì bạn đang thực hiện sao chép, danh tính của bạn chính xác là điều cần lưu ý rõ ràng. Tôi sẽ làm cho GUID của bạn một khóa chính nhưng nonclustered vì bạn không thể sử dụng newsequentialid. Điều đó làm tôi ngạc nhiên là khóa học tốt nhất của bạn. Nếu bạn không biến nó thành PK nhưng đặt một chỉ mục duy nhất vào nó, sớm hay muộn có thể khiến những người duy trì hệ thống không hiểu các mối quan hệ FK đúng cách đưa ra các lỗi. – HLGEM