2009-09-22 34 views
21

Tôi có một bảng kho với 16 tấn dữ liệu trong đó. Tôi có một vài cột Integer trong đó. Chúng tôi phải đưa chúng vào BIGINT cho mỗi truy vấn mà chúng tôi viết, vì SUM quá lớn để phù hợp với INT.Thay đổi INT thành BigInt

Hiện tại, chúng tôi có một datamart mới đang được phát triển. Vì vậy, chúng tôi nghĩ, tại sao không thay đổi tất cả các cột này thành BIGINT và chúng tôi ít lo lắng cho tập hợp các truy vấn mới hơn.

Vì dữ liệu đã được tải, tôi đã tìm tôi sẽ sử dụng Management Studio và thay đổi kiểu dữ liệu. Nhưng trước tiên tôi nhận được một cảnh báo:

Saving Definition Changes to tables with large amounts of data could take a considerable amount of time. While changes are being saved, table data will not be accessible.

Sau đó, tôi nhận được một lỗi:

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

Làm thế nào để làm được việc này?

+45

16 tấn dữ liệu - đó là rất nhiều! – RedFilter

+0

Bạn đã xem xét một bảng tạm thời, cấu trúc mới, chèn và thay thế? –

+2

@astander - đó là cơ bản những gì thay đổi lược đồ trong SSMS đang làm theo mui xe. – tvanfosson

Trả lời

43

Nếu một hoặc nhiều các cột không có trở ngại đối với họ (như một chìa khóa nước ngoài, chỉ số, mặc định, quy tắc, vv), bạn sẽ có thể thay đổi mỗi người một cách nhanh chóng bằng cách làm

ALTER TABLE monster ALTER COLUMN MyIntCol1 bigint

Thay đổi của Management Studio SQL hiếm khi hiệu quả nhất và có xu hướng ưu tiên các bảng tạm thời cho bất kỳ điều gì thay đổi cột hiện có.

+1

Thú vị, không biết Management Studio là không hiệu quả trong vấn đề đó. – RedFilter

24

Không chắc chắn nếu điều này sẽ giúp đỡ, nhưng cố gắng này:

1 - create a new bigint column in the table 
2 - update that new column with the values from the int column 
3 - delete the int column 
4 - rename the bigint column 
+3

+1, điều tương tự tôi đã cố gắng nhập! –

+0

Tương tự ở đây tôi đã gõ cùng một điều. (1) Tôi sẽ thêm rằng điều này hoạt động theo nhân rộng quá. –

+1

Một điều cần lưu ý với kỹ thuật này, là nó sẽ thay đổi thứ tự của các cột. Trong khi điều này * nên * được OK, có thể là một nơi nào đó ra khỏi đó, ai đó đang dựa vào thứ tự này để được ổn định, ví dụ khi họ chọn * và chèn vào một bảng tạm thời. –

2

để mở rộng trên OrbMan's câu trả lời:

  • thêm các cột mới ở dưới cùng của danh sách cột (điều này sẽ tăng tốc độ nó lên rất nhiều)
  • bạn có thể thực hiện các cập nhật theo lô 10.000 hàng hoặc hơn nếu cần
  • đảm bảo bạn đang ở chế độ người dùng đơn lẻ hoặc ứng dụng nếu "TẮT" do đó không ai khác thay đổi dữ liệu trong bảng đó

Ngoài ra, để xem tất cả công việc mà studio quản lý thực hiện khi bạn thay đổi bảng, hãy nhấp vào biểu tượng thanh công cụ giống như cuộn trên đĩa. Điều này sẽ hiển thị các lệnh SQL thực tế được sử dụng để thay đổi bảng của bạn.

7

Tôi nghĩ rằng lỗi chính bạn có thể gặp phải là GUI là thời gian chờ. Khi bạn áp dụng một thay đổi lớn bằng cách sử dụng Modify selection from SSMS, nó sẽ hết thời gian chờ. Nếu bạn thực hiện cùng một lệnh bằng cách tạo tập lệnh thay đổi trong SSMS và sau đó chạy như một truy vấn SQL thẳng, nó sẽ chạy cho đến khi hoàn thành.

2

Nếu dữ liệu nguồn không bao giờ vượt quá giới hạn INT, chỉ cần tạo VIEW sẽ phát sóng cột đó tới BIGINT và truy vấn ngược lại.

7

Kỹ thuật này hoạt động rất tốt đối với tôi.

tôi thực hiện:

use [Mytable] 
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL 

Điều này dẫn đến lỗi này vì đã có một hạn chế trên phím:

Msg 5074, Level 16, State 1, Line 2 
The object 'PK_USER_USER_ID' is dependent on column 'USER_ID'. 
Msg 4922, Level 16, State 9, Line 2 
ALTER TABLE ALTER COLUMN USER_ID failed because one or more objects access this column. 

Không được nản chí, trong SQL Server Management Studio Tôi phải nhấp về hạn chế PK_USER_USER_ID, sau đó chọn "Khóa tập lệnh dưới dạng >> Thả và Tạo thành >> Cửa sổ trình chỉnh sửa truy vấn mới":

enter image description here

này tạo ra kịch bản này:

USE [Database] 
GO 
/****** Object: Index [PK_USER_USER_ID] Script Date: 18/03/2014 13:05:38 ******/ 
ALTER TABLE [dbo].[USER] DROP CONSTRAINT [PK_USER_USER_ID] 
GO 

/****** Object: Index [PK_USER_USER_ID] Script Date: 18/03/2014 13:05:38 ******/ 
ALTER TABLE [dbo].[USER] ADD CONSTRAINT [PK_USER_USER_ID] PRIMARY KEY CLUSTERED 
(
[USER_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF,  ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 

sau đó tôi thực hiện các nửa đầu của kịch bản này, để thả các chế:

ALTER TABLE [dbo].[USER] DROP CONSTRAINT [PK_USER_USER_ID] 
GO 

Bây giờ hạn chế đã biến mất , thay đổi ban đầu hoạt động độc đáo:

use [Mytable] 
ALTER TABLE [dbo].[USER] ALTER COLUMN USER_ID bigint NOT NULL 

sau đó tôi thực hiện vào nửa cuối của kịch bản, để thêm khó khăn trở lại trong:

ALTER TABLE [dbo].[USER] ADD CONSTRAINT [PK_USER_USER_ID] PRIMARY KEY CLUSTERED 
(
[USER_ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF,  ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
GO 
Các vấn đề liên quan