2014-07-23 13 views
11

Chúng ta có thể tạo chỉ mục trên một cột trong bảng được định nghĩa hàm bảng trong SQL Server 2008 không?Chúng ta có thể tạo chỉ mục trong bảng chức năng có giá trị

Chức năng của tôi đang nhận được kết quả chậm. Khi tôi nhìn vào kế hoạch thực hiện, nó đã được quét theo bảng, do đó tôi cần tạo chỉ mục trên cột bảng chức năng để đặt mệnh đề where vào đó.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn trước

+2

Thông thường, hàm có giá trị bảng chỉ trả về các hàng cần thiết (do đó sử dụng hàm *). Có lẽ có nhiều cách tốt hơn để tối ưu hóa mã của bạn. –

+0

Chức năng là GETTING kết quả chậm để quét bảng có thể được trên bảng nguồn của hàm, không phải trong đầu ra bảng trả về. Vì vậy, cố gắng mang lại ràng buộc toàn vẹn và chỉ mục trên bảng vật lý – Recursive

+0

Chức năng bảng có giá trị của bạn có nhiều hơn 1 câu lệnh hay không ? Nếu vậy, nó là một hàm bảng đa trị có giá trị. Chúng có thể và sẽ tồi tệ hơn nhiều so với chức năng vô hướng. Các hàm bảng có giá trị cần nội tuyến, có nghĩa là một câu lệnh chọn duy nhất. Đăng mã cho hàm của bạn và chúng tôi có thể xem xét. –

Trả lời

12

Nếu chức năng bảng có giá trị thuộc loại nội tuyến, bạn sẽ tạo chỉ mục trên cột bảng bên dưới.

Nếu đó là câu lệnh đa TVF trong SQL Server 2008 (như được gắn thẻ), bạn chỉ có thể tạo các chỉ mục liên kết với khóa chính hoặc các ràng buộc duy nhất.

In SQL Server 2014+ it is possible to declare inline indexes not associated with any constraint.

Ví dụ

CREATE FUNCTION F() 
RETURNS @X TABLE 
(
A INT PRIMARY KEY /*<-- Implicit clustered index*/ 
) 
AS 
BEGIN 
INSERT INTO @X 
    VALUES(1),(2) 
RETURN; 
END 

GO 

SELECT * 
FROM F() 
WHERE A = 12 

enter image description here

Trên đây materializes toàn bộ resultset lên phía trước vào một biến bảng đầu tiên, và tạo ra một chỉ số tiềm ẩn trên đó.

Nói chung, các TVF nội tuyến được ưu tiên cho các câu lệnh đa tuyên bố.

+1

Cảm ơn. Điều này đã giúp tôi giảm thời gian thực hiện truy vấn từ 13 giây xuống còn 1 giây mặc dù tôi đã phải thay đổi chức năng nội tuyến của mình thành một câu lệnh đa. – Gullbyrd

+0

Trong trường hợp của tôi, việc thêm chỉ số nhóm vào TVF của tôi chỉ tăng thời gian truy vấn lên 1 giây. –

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