Tôi nhận ra điều này có thể được đánh dấu là trùng lặp, nhưng tôi đặc biệt hỏi về SQL Server 2005
Tôi đã đọc lời khuyên mâu thuẫn trên internet vì vậy tôi đang hỏi ở đây. Cụ thể trong SQL Server 2005, một NULL trong cột varchar có chiếm cùng một không gian như một chuỗi rỗng không?
Tôi đã tạo một bảng 'giữ' trên một ổ đĩa khác và điền dữ liệu từ bảng nguồn và bất cứ nơi nào các trường trống tôi sử dụng nullif([field],'')
để chèn null vào vị trí trống.
Sau đó, tôi đã xây dựng một bảng mới với cấu trúc chính xác giống như bảng giữ, nhưng thay vì thay thế các khoảng trống bằng null, tôi chỉ chèn các khoảng trống và cho đến nay nó dường như chiếm nhiều không gian hơn (tôi vẫn chưa hoàn thành việc điền vào nó và Tôi không thể chắc chắn rằng nó đang chiếm nhiều dữ liệu hơn)
Vì vậy, trước khi tôi điền nó xa hơn và kết thúc với một bảng lớn hơn tôi nghĩ, tôi nên bỏ các khoảng trống hoặc khoảng trống?
Biên tập:
Sau khi di chuyển dữ liệu từ bảng giữ sang bảng mới, bảng mới lớn hơn khoảng 4gb.
Chỉ có hai sự khác biệt nhỏ trong thiết kế bảng - Trường 'serial_number' là char (15) trong bảng giữ nhưng varchar (15) trong bảng đích. (Độ dài tối đa của một số sê-ri là 14 và có nhiều giá trị trống - tôi nghĩ khoảng 30 triệu nếu tôi nhớ lại) và chỉ mục được nhóm cho bảng giữ có thêm một cột - program_name ..
Giữ bàn
USE [Temp_holding_EWS]
GO
/****** Object: Table [dbo].[AmtoteAccountActivity_holding]
Script Date: 02/17/2017 20:41:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[AmtoteAccountActivity_holding](
[_Date] [char](8) NULL,[Community] [varchar](10) NULL,
[AccountNumber] [varchar](50) NULL,
[Branch] [varchar](10) NULL,
[Window] [varchar](3) NULL,
[Time] [char](8) NULL,[Balance_Forward] [varchar](10) NULL,
[Transaction_Type] [varchar](10) NULL,
[Program_Name] [varchar](10) NULL,
[Race] [varchar](10) NULL,[Pool_Type] [varchar](10) NULL,
[Amount] [money] NULL,[Runners] [varchar](60) NULL,
[Total_Bet_Amount] [varchar](10) NULL,
[Debit_Amount] [varchar](10) NULL,
[Credit_Amount] [varchar](10) NULL,
[Tx_Date] [char](8) NULL,
[Check_Clear_Date] [varchar](10) NULL,
[Refund_Amt] [varchar](10) NULL,
[Bet_Pool_Modifier] [varchar](5) NULL,
[RecordID] [int] IDENTITY(1,1) NOT NULL,
[serial_number] [char](15) NULL,
[handle] AS
(CONVERT([money],[total_bet_amount],(0))-CONVERT([money],[refund_amt],(0))),
[txdatetime] AS (CONVERT([datetime],([tx_date]+' ')+[time],(11))),
[dbdate] AS (CONVERT([datetime],[_date],(11))),
[Audit_Trail] [varchar](20) NULL,
CONSTRAINT [PK_AmtoteAccountActivity_holding] PRIMARY KEY NONCLUSTERED
(
[RecordID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
(Chỉ mục cụm)
USE [Temp_holding_EWS]
GO
/****** Object: Index [IX_AmtoteAccountActivity_holding]
Script Date: 02/17/2017 21:08:44 ******/
CREATE CLUSTERED INDEX [IX_AmtoteAccountActivity_holding] ON
[dbo].[AmtoteAccountActivity_holding]
(
[AccountNumber] ASC,
[_Date] ASC,
[Program_Name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
Bảng đích
USE [EWS]
GO
/****** Object: Table [dbo].[AmtoteAccountActivity]
Script Date: 02/17/2017 20:48:16 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[AmtoteAccountActivity](
[_Date] [char](8) NULL, [Community] [varchar](10) NULL,
[AccountNumber] [varchar](50) NULL,
[Branch] [varchar](10) NULL,[Window] [varchar](3) NULL,
[Time] [char](8) NULL, [Balance_Forward] [varchar](10) NULL,
[Transaction_Type] [varchar](10) NULL,
[Program_Name] [varchar](10) NULL,
[Race] [varchar](10) NULL,
[Pool_Type] [varchar](10) NULL,
[Amount] [money] NULL,[Runners] [varchar](60) NULL,
[Total_Bet_Amount] [varchar](10) NULL,
[Debit_Amount] [varchar](10) NULL,
[Credit_Amount] [varchar](10) NULL,
[Tx_Date] [char](8) NULL,
[Check_Clear_Date] [varchar](10) NULL,
[Refund_Amt] [varchar](10) NULL,
[Bet_Pool_Modifier] [varchar](5) NULL,
[RecordID] [int] IDENTITY(1,1) NOT NULL,
[serial_number] [varchar](15) NULL,
[handle] AS
(CONVERT([money],[total_bet_amount],(0))-CONVERT([money],[refund_amt],(0))),
[txdatetime] AS (CONVERT([datetime],([tx_date]+' ')+[time],(11))),
[dbdate] AS (CONVERT([datetime],[_date],(11))),
[Audit_Trail] [varchar](20) NULL,
CONSTRAINT [PK_AmtoteAccountActivity2] PRIMARY KEY NONCLUSTERED
(
[RecordID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
(Chỉ mục cụm)
USE [EWS]
GO
/****** Object: Index [IX_AmtoteAccountActivity2] Script Date: 02/17/2017 21:06:29 ******/
CREATE CLUSTERED INDEX [IX_AmtoteAccountActivity2] ON [dbo].[AmtoteAccountActivity]
(
[AccountNumber] ASC,
[_Date] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
( Lưu ý: Đối với bất kỳ ai thắc mắc tại sao nó rõ ràng có giá trị tài chính và số được lưu trữ trong các trường ký tự: Đó là thiết kế bảng gốc 17 năm trước (không phải bởi tôi) và hiện có hàng trăm truy vấn sql chạy trên cơ sở dữ liệu này, nó ít hơn làm việc để giữ chúng dưới dạng varchar và các truy vấn tiếp tục truyền, hơn là thay đổi chúng thành tiền, int hoặc thập phân và thay đổi hàng trăm truy vấn)
NULL
hay NOT NULL
?