Tôi đang sử dụng MS SQL và tôi phải chạy một số truy vấn trên cùng một bảng theo các tiêu chí khác nhau. Lúc đầu, tôi chạy từng truy vấn trên bảng gốc mặc dù tất cả chúng đều chia sẻ một số bộ lọc (ví dụ: Ngày, trạng thái). Điều này mất rất nhiều thời gian (khoảng 2 phút).
Có các bản sao trong các hàng dữ liệu và tất cả các chỉ mục đều KHÔNG ĐƯỢC CLUSTERED. Tôi chỉ quan tâm đến 4 cột cho tiêu chí của mình và kết quả sẽ chỉ xuất số đếm cho tất cả các truy vấn.
cột cần thiết: TABLE
, FIELD
, AFTER
, DATE
, và có một chỉ mục trên mỗi DATE
và TABLE
.
Sau khi tạo một bảng tạm thời chỉ với các trường tôi cần, nó đã giảm xuống còn 1:40 phút, điều này vẫn rất tệ.
CREATE TABLE #TEMP
(
TABLE VARCHAR(30) NULL,
FIELD VARCHAR(30) NULL,
AFTER VARCHAR(1000) NULL,
DATE DATETIME,
SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)
INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
SELECT TABLE, FIELD, AFTER, DATE
FROM mytbl WITH (NOLOCK)
WHERE TABLE = 'OTB' AND
FIELD = 'STATUS'
Chạy này -> (216598 hàng bị ảnh hưởng)
Vì không phải tất cả các truy vấn đều dựa vào phạm vi ngày, nên tôi đã không đưa nó vào truy vấn. Vấn đề là chỉ mất hơn 1 phút để chèn . Việc chèn ở trên mất 1:19 phút
Tôi muốn chạy một cái gì đó như thế này cho một số truy vấn:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
Đó là một vấn đề với phần chèn nhiều hơn phần chọn, nhưng temp có ít hàng hơn bảng gốc có thể tốt hơn so với việc đi qua bảng nhiều lần.
Làm thế nào tôi có thể tối ưu hóa điều này?
BIÊN TẬP
Tôi đã xóa ID sắp xếp, tôi nghĩ vấn đề chủ yếu là chọn và không chèn. Đó là một phỏng đoán.
Tôi không thể tạo duy nhất trên bất kỳ chỉ mục nào vì không có trường hoặc hàng duy nhất.
Tôi đang sử dụng SQL Server 2012.
Thông tin bảng : Đó là một đống và có cách sử dụng không gian sau:
name rows reserved data index_size unused
mytbl 24869658 9204568 KB 3017952 KB 5816232 KB 370384 KB
SELECT COUNT(*) AS COUNT FROM original_table WHERE AFTER = 'R' AND DATE >= '2014-01-01' AND DATE < '2015-01-01'
, tại sao bạn không thử tối ưu hóa từng (truy vấn) riêng biệt? Bạn không được phép thêm chỉ mục vào bảng?
TABLE
và FIELD
cột khỏi #temp
bảng (tất cả các hàng đều có TABLE = 'OTB' AND FIELD = 'STATUS'
bảng tạm thời cụ thể.)
CREATE TABLE
tuyên bố). Việc bỏ phiếu là vì câu hỏi không rõ ràng.