2010-10-21 36 views
5

Tôi có một bảng có kích thước khá khiêm tốn vào lúc này nhưng sẽ tăng lên vài triệu hàng nên tôi đang tìm cách xây dựng mọi thứ ngay từ đầu.Chỉ mục được lọc của máy chủ SQL

Bảng chứa 15 cột để chứa thông tin về hiệu suất điện thoại của đại lý nhưng điều đó không thực sự có liên quan. Một trong những truy vấn được chạy trên bảng này xem dữ liệu từ 4 cột trong tháng trước bởi agent_ID. Tất nhiên thông thường tôi sẽ chỉ là một chỉ số bao gồm trên Agent_ID và ngày bao gồm cả 4 cột và được thực hiện với nó nhưng tôi đang tìm kiếm để xem nếu tôi có thể thông minh hơn một chút.

Vì tôi đang sử dụng máy chủ SQL 2008R2, tôi nghĩ tôi sẽ xem xét các chỉ mục đã lọc và chỉ có chỉ mục được điền dữ liệu từ tháng hiện tại. Vấn đề là tôi không thể có vẻ để có được nó chấp nhận bất cứ điều gì khác hơn là một giá trị cứng trên bộ lọc.

Tôi có sủa cây sai với cái này, thậm chí bạn có thể làm điều đó trong máy chủ SQL mà không cần phải sử dụng hai bảng hoặc một số loại phân vùng khác không?

EDIT: Nhờ Marcus Tôi biết rằng không thể thực hiện việc này mà không cần một số công việc thủ công.

Cuối cùng tôi đã thực hiện kịch bản này mà tôi sẽ chạy vào lúc bắt đầu của mỗi tháng trong giờ tối để di chuyển cửa sổ chỉ mục trên

USE [Tracker_3] 
GO 
DECLARE @FirstOfMonth datetime 
DECLARE @LastOfMonth datetime 

declare @strSQL as varchar(max) 
set @FirstOfMonth = CONVERT(smalldatetime, CONVERT(varchar(4), DATEPART(yy, GETDATE())) + '-' + CONVERT(varchar(2), DATEPART(mm, GETDATE())) + '-' + '1') 
set @LastOfMonth = DATEADD(dd, -1, DATEADD(mm, +1, @FirstOfMonth)) 


set @strSQL=' 

CREATE NONCLUSTERED INDEX [tblAgent_int_data_Covering_1] ON [dbo].[tblAgent_interval_data] 
(
    [Login_ID] ASC, 
    [Date] ASC 
) 
INCLUDE ([i_acdtime], 
[i_acwtime], 
[holdacdtime], 
[acdcalls]) 
WHERE [date] >= ''' + convert(char(10),convert(date,@firstOfMonth)) + ''' AND [date] <= '''+ convert(char(10),convert(date,@LastOfMonth)) + ''' 
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
    SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, 
    DROP_EXISTING = ON, ONLINE = OFF, 
    ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, 
    FILLFACTOR = 100) ON [T3_Data_2] 

' 

exec (@strSQL) 
+2

Bạn luôn có thể bao gồm 2 tháng và tạo lại hàng tháng –

Trả lời

3

gì bạn cố gắng để hoàn thành là không thể mà không một số loại bảo trì "thủ công" - nó tương tự như problem of indexing "Age".

Tôi muốn nói cách tiếp cận tốt nhất là phân vùng - nhưng bạn sẽ cần phải giảm/tạo phân vùng mới thường xuyên.

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