Tôi có cơ sở dữ liệu SQL Server 2012 mà tôi đang sử dụng để lưu dữ liệu từ các tệp được xử lý. Chúng tôi đọc dữ liệu từ một thư mục, xử lý nó với python và lưu kết quả vào cơ sở dữ liệu.
Một trong những điều đầu tiên chúng tôi làm trong quy trình ETL của mình là kiểm tra xem tệp đã được xử lý chưa. Chúng tôi chỉ đơn giản là làm một:
SELECT id FROM table1 WHERE basename = <basename>
Nếu có kết quả, chúng tôi bỏ qua tệp, nếu không có kết quả, chúng tôi sẽ xử lý tệp. Ngay bây giờ truy vấn này mất ~ 250ms với ~ 5m hồ sơ. Chúng tôi đã có một chỉ mục không bao gồm trên basename
cột rồi.
Chúng tôi sẽ thấy khoảng 100-200k hồ sơ được thêm vào mỗi tháng. Chúng tôi nhận được các tập tin theo lô. Vì vậy, chúng tôi có thể thấy các tệp 2k và sau đó 2 giờ các tệp 2k khác. Một số ngày chúng tôi sẽ nhận được các tệp 10k, những ngày khác chúng tôi chỉ có thể nhận được các tệp 4k.
Giữ tất cả các biến khác giống nhau là có một quy tắc để chiếu khi chúng ta có thể gặp phải các vấn đề về hiệu năng (các truy vấn mất nhiều hơn 1 giây) với truy vấn này ngoài việc chèn 15-20 triệu bản ghi vào bảng và xem điều gì xảy ra?
Bảng DDL:
CREATE TABLE [dbo].[raw_records](
[id] [int] IDENTITY(1,1) NOT NULL,
[basename] [varchar](512) NULL,
[filename] [varchar](1024) NULL,
[file_size] [int] NULL,
[machine] [varchar](10) NULL,
[insert_timestamp] [datetime] NULL,
[raw_xml] [xml] NULL,
[process_status] [varchar](2048) NULL,
PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Mục lục:
CREATE NONCLUSTERED INDEX [basename_index] ON [dbo].[raw_records]
(
[basename] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Bảng này được tạo ra từ lâu trước khi tôi bắt đầu làm việc với nó, vì vậy tôi giả sử ai đó chỉ tạo ra filename
chiều dài tối đa 1024 để giữ "đủ". Chắc chắn có thể thay đổi.
Các tệp được tạo ra có dấu thời gian và thông tin duy nhất trong chính tên tệp (ví dụ system1_metadata_timestamp.xml
) một "hệ thống" không thể tạo (hoặc không bao giờ) tạo ra một tệp có cùng dấu thời gian.
select max(len(basename)), max(len(filename)) from dbo.raw_records;
trả về: basename
- 143, filename
- 168. Có lẽ là một điều tốt để thay đổi xuống tối đa 260.
process_status
có lẽ cũng không cần phải dài như vậy, nhưng tôi cảm thấy rằng điều đó là hợp lý để đoán, bởi vì cột ở đó để giữ các thông báo lỗi từ giai đoạn xử lý. Tôi đã chạy một truy vấn trên đó và có tối đa 600 ký tự. Chúng tôi thường không truy vấn trên cột đó mặc dù. Nó chỉ là thông tin nhiều hơn để gỡ lỗi.
Tôi đang trải qua các ứng dụng dọn dẹp những thứ như vậy. Ở một số nơi nhất định tôi không thể tránh khỏi nó nhưng ở những nơi khác không thể làm gì nhiều về điều đó một cách đáng tiếc (ví dụ: thực sự cần phải lấy cột XML để trích xuất dữ liệu từ nó). Câu hỏi này chỉ đơn giản xuất phát từ việc xem hiệu suất của truy vấn đang được đề cập và không muốn nó tránh xa tôi. Đây là điều đầu tiên được thực hiện cho mọi tệp vì vậy nếu nó không hoạt động, thì cũng không có gì khác.