Tôi có một số cơ sở dữ liệu được tạo bằng Entity Framework Code First; các ứng dụng đang hoạt động và nói chung tôi khá hài lòng với những gì Code First cho phép tôi làm. Tôi là một lập trình viên đầu tiên, và một DBA thứ hai, bởi sự cần thiết. Tôi đang đọc về DataAttribution để mô tả thêm trong C # những gì tôi muốn cơ sở dữ liệu thực hiện; và câu hỏi của tôi là: tôi sẽ bị phạt khi ăn những nvarchar(max)
chuỗi này trong bảng của mình (xem ví dụ dưới đây)?
Có một số cột trong bảng đặc biệt này; trong C # chúng được định nghĩa như vậy:
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Name { get; set; }
public string Message { get; set; }
public string Source { get; set; }
public DateTime Generated { get; set; }
public DateTime Written { get; set; }
Tôi hy vọng sẽ truy vấn và / hoặc sắp xếp dựa trên Tên, Nguồn, Đã tạo và Viết. Tôi hy vọng Tên và Nguồn có độ dài 0-50 ký tự, đôi khi lên tới 150. Tôi hy vọng bảng này sẽ bắt đầu khá nhỏ (<100k hàng), nhưng tăng đáng kể theo thời gian (> 1m hàng). Rõ ràng tin nhắn có thể nhỏ hoặc lớn, và có lẽ sẽ không được truy vấn.
Những gì tôi muốn biết, có một điểm nhấn hiệu suất cho các cột Tên và Nguồn của tôi được xác định là nvarchar(max)
khi tôi không bao giờ mong đợi chúng lớn hơn 150 ký tự không?
varchar(max)
ở mọi nơi làm tổn hại đến hiệu suất của bạn - đừng làm điều đó! Sử dụng các kiểu dữ liệu phù hợp - varchar(max)
CHỈ sử dụng nếu bạn THỰC SỰ cần hơn 8000 ký tự! (Tôi chưa bao giờ thấy tên hoặc e-mail của một người dài đến thế!) - Xem Điểm sử dụng VARCHAR (n) Anymore là gì? để biết thêm thông tin
[MaxLength]
hoặc[StringLength]
thuộc tính. Một số yếu tố tiêu cực có thể có của các cột quá rộng được đề cập trong câu trả lời của @ PaulWhite tại đây