2010-08-09 29 views
5

Tôi đang làm việc trong việc tái cấu trúc cơ sở dữ liệu (SQL Server 2008) và thu thập đối số để thay đổi NCHAR(1) cột (giữ Y|N giá trị) thành BIT. Mọi người đều hiểu điều này là cần thiết và không biết tại sao nó lại xảy ra nhưng sự thay đổi này ảnh hưởng đến cơ sở dữ liệu sản xuất, do đó các đối số nặng nề là bắt buộc. Bảng giữ danh mục địa chỉ (tối đa 1m hồ sơ).NCHAR (1) so với BIT

Đối số đầu tiên tôi tìm thấy - mỗi nchar fields mất 2 byte, mỗi 8 bit fields - 1 byte (tiếp theo 8 - thêm 1 byte).

Điều gì tiếp theo? Có lẽ một số chỉ số vấn đề hiệu suất?

+0

Tự hỏi tại sao nhà thiết kế ban đầu quyết định unicode được yêu cầu chỉ lưu trữ 'N' và 'Y'!Tôi nghi ngờ rằng so sánh có thể sẽ nhanh hơn trên các lĩnh vực bit hơn các lĩnh vực 'nchar' nhưng không biết rằng cho một thực tế. –

+6

Rõ ràng, lợi thế của 'NCHAR (1)' là bạn có thể mở rộng nó - [khi được yêu cầu] (http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx) - để giữ * các giá trị boolean khác. ;-) –

+0

@Dean Harding: LOL. Tôi đã từng có một [PHB] (http://en.wikipedia.org/wiki/Pointy-haired_Boss) nhấn mạnh rằng chúng ta có thể đặt một trường 2 bit một chút vì nó chỉ là một chữ số. –

Trả lời

4

Trường bit giúp logic của bạn bằng cách tự động thực thi quy tắc kinh doanh tiềm ẩn hiện tại (tức là cột này chỉ có thể chứa 'Y' hoặc 'N'). Nếu bạn đang thực thi quy tắc đó theo lập trình, bạn có thể lưu bằng cách loại bỏ phí trên đó. Việc lập chỉ mục một cột bit của riêng nó có ít giá trị do cardinality thấp, nhưng nó có thể hữu ích như một phần của chỉ mục tổng hợp.

Xem thêm:

10

Tôi sẽ ngần ngại cung cấp bất kỳ đối số nào cho thay đổi như vậy trừ khi bạn có lý do chính đáng để thực hiện thay đổi đó. tức là bạn phải cân bằng chi phí của một thay đổi đối với những gì bạn cá nhân thực hiện/thích, so với chi phí thực sự thực hiện và lợi ích.

Bạn đã kiểm tra xem việc sử dụng nchar (1) có làm ảnh hưởng đến hiệu suất hay bạn rơi vào bẫy của tối ưu hóa sớm không? Bạn chỉ đang nói về 1 triệu bản ghi ở đây.

Đối với lưu trữ nhỏ/chi phí IO bạn nghĩ bạn đang phát sinh, hãy cân nhắc tổng số giờ làm việc để thay đổi, kiểm tra lại và nâng cấp hệ thống * hàng giờ so với chi phí chỉ mua đĩa nhanh hơn. Tôi nghi ngờ đĩa sẽ rẻ hơn nhiều - cũng như có lợi cho mọi khía cạnh của hệ thống.

+0

+1 - Có để sửa đổi tất cả các procs được lưu trữ và như vậy để tài khoản cho logic mới có lẽ sẽ chi phí một LOT nhiều hơn không gian thêm được sử dụng. – JNK

+1

+1, nó không phải là kết thúc của thế giới và nếu nó không bị hỏng, không sửa chữa nó được nêu ra. Các nhà phát triển ban đầu có thể đã có trong tâm trí tùy chọn terniary, chẳng hạn như M cho có thể. –

+0

Đồng ý. Và, bạn không thể lập chỉ mục một trường BIT trong SQL Server. Chỉ số tổng hợp của bạn có thể không làm bạn tốt vì chỉ có hai giá trị trong trường NCHAR của bạn, nhưng nếu chúng là thế thì bạn đang ở trong một thế giới tổn thương thay đổi nó. – mattmc3

6

Một lý do phổ biến để tìm NCHAR (1) thay vì bit là Oracle không hỗ trợ loại bit. Nếu bạn có một nhà phát triển Oracle hoặc Oracle, hoặc một cơ sở dữ liệu được sử dụng để chạy trên Oracle, bạn sẽ thấy điều này rất nhiều. Trong Sql Server, thực sự không cần thiết cho việc này.

Tuy nhiên, tôi đã thấy rằng hầu hết các địa điểm mà tôi có một trường bit (hoặc NCHAR (1) trong Oracle) cái tôi thực sự là muốn là ngày giờ cho biết giá trị của cờ không nhiều nó trở thành sự thật. Điều này không phải luôn luôn như vậy, nhưng khi tôi nghĩ lại về mã cũ tôi đã viết, tôi đoán rằng 4 trong số 5 lần tôi đã sử dụng một trường bit tôi nên sử dụng một datetime.

+0

Và thực hiện so sánh datetime trong truy vấn của bạn, nơi có thể đã làm so sánh bit? Tôi thích sử dụng cả datetime và bit. datetime để biết khi nào nó trở thành true (hoặc false) và chính trường bit cho các truy vấn. – Jeroen

+2

@Jeroen - Độ chính xác đầu tiên, hiệu suất thứ hai. Nhưng hầu hết thời gian tôi chỉ kiểm tra rằng nó không phải NULL anyway, và đó là chỉ là về nhanh như một kiểm tra bit. –

+0

@ Joel: Điểm thú vị. Cảm ơn – Jeroen

1

Trường này có được sử dụng rộng rãi trong các truy vấn Where fld = 'Y' không?

Nếu vậy tôi sẽ xem xét thực hiện một thử nghiệm để xem có hay không thay đổi nó thành chút tác động đến hiệu suất.

Thay đổi nó ngay bây giờ chỉ vì nó phải là một trường bit vì bạn đang lưu trữ giá trị boolean trên một bảng 1m + hồ sơ không có vẻ như một ý tưởng hay cho tôi và tôi sẽ đi với câu trả lời của @ Andrew.

3

Tạo lĩnh vực chút, thêm một cột tính toán rằng mô phỏng các nchar (1) cho bây giờ.

gì không sử dụng NCHAR:

  • Y vs y vs một số unicode Y
  • Overhead kiểm tra Y hoặc N
  • Không natively "true" o "false" (ví dụ như sẽ không lập bản đồ trực tiếp .net boolean)
  • YN là tiếng Anh. Ja/Nein, Oui/Non etc

Bạn không nên lập chỉ mục này để giảm dung lượng và sử dụng hiệu quả. bit là

  • nhỏ
  • datatype an toàn (ví dụ như không có SÉC cần thiết)
  • bản đồ cho khách hàng có nghĩa là trực tiếp
  • độc lập của khu vực

Nói rằng, chúng tôi sử dụng một smalldatetime "WhenInactive" để thay thế cho trường "IsActive". NULL = hoạt động.

2

Nếu bạn đang sử dụng LINQ2SQL hoặc Entity Framework, cột BIT sẽ chuyển thành bool, nhưng NCHAR(1) sẽ dịch thành một string.

1

Sử dụng Bit:

  • logic đại diện/biểu cảm của ý định - kể từ bang boolean không phải lúc nào expressable liên tục như Yes or No, mà sau đó sẽ có nghĩa là bạn sẽ hoặc phải là mâu thuẫn trong bit mẫu, hoặc không trực quan, ví dụ True/False (T/F), On/Off (?O/F), Open/Closed(O/C) v.v.

  • Toàn vẹn tham chiếu - bit không thể vô hiệu có thể bị giới hạn chỉ 0 or 1. Trừ khi bạn thêm các ràng buộc, *char(1) của bạn có thể là Y, N, X hoặc .

  • Bits can be packed, vì vậy có thể có dung lượng nhỏ hơn.

  • Hiệu suất: Lập chỉ mục các cột bit (hoặc vài trạng thái) thường là một sự lãng phí, trừ khi có độ chọn lọc cao là 0 hoặc 1 trong dữ liệu. Trong trường hợp này, một filtered index trên giá trị chọn lọc sẽ là một ý tưởng hay.

(Chuyển từ deleted answer here)

0

tôi đã có một vài dịp mà chúng tôi muốn có một trường bit nhưng không thể biết chắc chắn rằng sẽ không bao giờ có nhu cầu về một giá trị thứ ba hoặc thứ tư trong lĩnh vực đó. Do đó chúng tôi đã cấu trúc nó như một trường chuỗi chứa Y hoặc N. Tất nhiên, chúng tôi chỉ làm điều này trong những tình huống rất độc đáo.

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