2009-09-01 37 views
9

Tôi có nhiều cơ sở dữ liệu trên một phiên bản SQL Server 2005. Tôi đã tạo một từ đồng nghĩa trên một cơ sở dữ liệu để truy nhập bảng trên cơ sở dữ liệu khác và khi viết truy vấn của tôi, tôi muốn sử dụng một chỉ số cụ thể, tuy nhiên, khi đánh giá kế hoạch thực hiện, nó dường như không sử dụng nó. Nếu tôi viết truy vấn để truy cập cơ sở dữ liệu một cách rõ ràng, nó hoạt động, nhưng tôi dường như không thể làm cho nó hoạt động bằng cách sử dụng một từ đồng nghĩa. Ví dụ:Bảng SQL Server Đồng nghĩa với các chỉ mục

select * 
from testdb..testtable with (index(testindex)) 

|--Nested Loops(Inner Join, OUTER REFERENCES:([testdb].[dbo].[testtable].[id])) 
    |--Index Scan(OBJECT:([testdb].[dbo].[testtable].[testindex])) 
    |--Clustered Index Seek(OBJECT:([testdb].[dbo].[testtable].[PK_testtable]), SEEK:([testdb].[dbo].[testtable].[id]=[testdb].[dbo].[testtable].[id]) LOOKUP ORDERED FORWARD) 

không mang lại kế hoạch thực hiện tương tự như

select * 
from testdb_synonym with (index(testindex)) 

|--Clustered Index Scan(OBJECT:([testdb].[dbo].[testtable].[PK_testtable])) 

Đây có phải là một giới hạn với Từ đồng nghĩa hoặc là có một cái gì đó cụ thể tôi cần phải làm gì để có được điều này để làm việc?

+1

Bạn có thể đăng các kế hoạch cơ bản cho cả hai truy vấn không? Chỉ cần chạy 'SET SHOWPLAN_TEXT ON GO SELECT…' – Quassnoi

+0

Tôi đã cập nhật mô tả để bao gồm kế hoạch thực hiện ... –

Trả lời

1

Tôi đã thử nghiệm cùng một điều và có vẻ như trình tối ưu hóa truy vấn bỏ qua gợi ý đó khi thực hiện thông qua một từ đồng nghĩa. Các chi tiết là tôi đã làm một lựa chọn * đối với một bảng tùy ý với một gợi ý chỉ mục để sử dụng một chỉ số không nhóm. Nếu không có từ đồng nghĩa, nó sẽ tra cứu bookmark/tham gia vòng lặp lồng nhau. Với nó, nó quét một bảng. Vì không có tùy chọn nào trên cú pháp tạo từ đồng nghĩa, tôi chỉ có thể giả định rằng gợi ý chỉ mục bị bỏ qua. Không có chi tiết trong BOL là tại sao. Tôi sẽ viết nó như một "tính năng".

+0

Tôi đã hy vọng rằng sẽ không phải như vậy ... Nó được chào hàng như một tính năng bí danh với một phần của lợi ích của nó để đơn giản hóa ký hiệu chấm.Tôi có thể hiểu nếu nó đã đi ngược lại một máy chủ từ xa, nhưng nếu nó là một máy chủ địa phương, tôi đã hy vọng rằng nó sẽ là đủ thông minh để tận dụng lợi thế của những lợi ích vốn có. –

0

Bạn có cần gợi ý trong trường hợp của mình không? Các khuyến nghị của MS là tránh các gợi ý chỉ mục nếu có thể do thực tế là có thể làm mất hiệu lực kế hoạch tối ưu hơn. Ngay cả khi nó được tối ưu hóa ngày hôm nay nó có thể không hiệu quả vào ngày mai do tải dữ liệu vv.

Tôi đã cố gắng sử dụng một từ đồng nghĩa không có gợi ý trong SQL Server 2008 và có cùng một kế hoạch thực hiện với từ đồng nghĩa với tên đầy đủ (database.schema.table).

Tôi thậm chí đã cố gắng sử dụng từ đồng nghĩa với gợi ý chỉ mục và bắt buộc thành công chỉ mục không nhóm (và tra cứu khóa để lấy phần còn lại của dữ liệu), và tôi nhận được cùng một kế hoạch thực hiện với tên đầy đủ.

Thống kê của bạn có được cập nhật không? Bạn có một chỉ mục chọn lọc hay máy chủ SQL nghĩ rằng nó hiệu quả hơn để sử dụng quét bảng.

1

WITH INDEX gợi ý dường như bị bỏ qua cho các từ đồng nghĩa.

CREATE SYNONYM syn_master FOR master 

SELECT * 
FROM syn_master WITH (INDEX (wow_i_can_write_everything_here)) 

biên dịch và chạy hoàn toàn mặc dù thực tế tôi không có chỉ mục có tên wow_i_can_write_everything_here trong lược đồ của tôi.

+0

Không còn đúng cho SQL Server 2008 R2. BTW: bạn đang tạo một từ đồng nghĩa với DB chủ, tôi không nghĩ rằng nó sẽ làm việc (chọn * từ master ??). –

5

Đây là một lỗi mà Microsoft đã cố định: xem MS KB 963684

Trong Microsoft SQL Server 2005, bạn tạo ra một từ đồng nghĩa với một bảng. Bạn chạy truy vấn đối với từ đồng nghĩa. Truy vấn sử dụng gợi ý trình tối ưu hóa INDEX để buộc chỉ mục. Nếu bạn kiểm tra việc thực hiện kế hoạch được tạo cho truy vấn, bạn có thể tìm thấy kế hoạch thực hiện không sử dụng chỉ mục bắt buộc.

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