SQL SERVER - Máy chủ được liên kết và hiệu năng truy vấn


7

Tôi có một vấn đề về hiệu suất liên quan đến SQL Server / máy chủ / lượt xem được liên kết. Tôi hy vọng bạn có thể giúp tôi hiểu đâu là cách tốt nhất để làm những gì tôi muốn =).

  • Tôi có một cơ sở dữ liệu K với 3 máy chủ được liên kết L1, L2, L3 đến 3 cơ sở dữ liệu X, Y, Z.
  • Trong X, Y, Z i lần lượt có 3 khung nhìn gọi là V1, V2, V3.
  • Tôi muốn truy vấn sự kết hợp của V1, V2, V3 bằng cơ sở dữ liệu K với máy chủ được liên kết L1, L2, L3.

Sau một số thử nghiệm, đây là tình huống:

  1. Trong SSMS, nếu tôi chạy truy vấn giả này SELECT * FROM (L1.V1 u L2.V2 u L3.V3) WHERE some filters, hiệu suất thực sự tuyệt vời
  2. Nếu tôi tạo VK dạng xem trong cơ sở dữ liệu K, chứa liên kết của ba khung nhìn và sau đó tôi chạy truy vấn SELECT * FROM VK WHERE some filtersthì hiệu suất sẽ kém hơn trường hợp 1

Câu hỏi

  • Tại sao hiệu suất rất khác nhau?
  • Làm thế nào tôi có thể cải thiện hiệu suất trong trường hợp 2?

Tôi quan tâm đến việc cải thiện hiệu suất trong trường hợp 2 vì tôi cần một chế độ xem để ánh xạ với nHbinernate trong phần mềm của chúng tôi ...

Cảm ơn trước, liên quan

CẬP NHẬT SAU BÀI VIẾT CỦA JOHN ALAN

Ok, tôi cố gắng nhưng không có kết quả. Tôi không phải là một DBA và kỹ năng của tôi về cấu hình DB thực sự hạn chế. Chúng ta có thể tiến hành từng bước không?

  1. Trên máy chủ từ xa ( called Y) tôi đã tạo một tài khoản mới ( called linkedserver) bằng cách bảo mật-> đăng nhập-> đăng nhập mới. Tôi chọn tên đăng nhập sau đó xác thực sql và tôi chọn một mật khẩu. cho cơ sở dữ liệu điếc tôi chọn master. Trong server rolestab tôi chọn public. trong User mappingtab tôi chọn các cơ sở dữ liệu liên quan đến các truy vấn từ xa và, đối với mỗi trong số chúng, tôi chọn db_ddladminpublicvai trò. Sau đó, đối với mỗi cơ sở dữ liệu liên quan đến truy vấn từ xa, tôi đã kiểm tra quyền hiệu quả cho người dùng máy chủ được liên kết và có rất nhiều ALTERvà rất nhiều CREATEquyền nhưng không hiển thị KẾ HOẠCH (sau đó tôi cũng chọn cái này).

  2. Trên máy chủ cơ sở dữ liệu ( called X) nơi máy chủ được liên kết đến Y tồn tại, tôi đã tạo một máy chủ được liên kết ( called L1). Trong TAB bảo mật, tôi đã chọn local user saremote user linkedservervới mật khẩu của nó.

Khi tôi chạy truy vấn trên L1 mà không có XEM, tôi có kết quả tốt, Nếu tôi đặt truy vấn ở hiệu suất thấp XEM, không có gì thay đổi ...

Tôi nghĩ rằng tôi đã làm một số bước sai, nhưng tôi không biết nơi ...

ĐỐI VỚI CÂU HỎI TỐT HƠN

Đây là truy vấn tôi chạy mà không có chế độ xem bằng máy chủ được liên kết:

select * from
(
    select * from dolph.agendasdn.dbo.vistaaccettazionegrp
    union
    select * from dolph.acampanet.dbo.vistaaccettazionegrp
    union
    select * from municipio.dbnet.dbo.vistaaccettazionegrp
) a 
where cognome = 'test' and nome = 'test'

vào chế độ xem tôi chỉ đặt mã này

    select * from dolph.agendasdn.dbo.vistaaccettazionegrp
    union
    select * from dolph.acampanet.dbo.vistaaccettazionegrp
    union
    select * from municipio.dbnet.dbo.vistaaccettazionegrp

sau đó tôi gọi select * from VIEW where cognome = 'test' and nome = 'test'

Vì thế..

  • Trường hợp thứ 1 0-1 giây.
  • Trường hợp thứ 2> 15 giây ...

Tôi nghĩ điều này là vô lý!

KẾ HOẠCH THỰC HIỆN

Kế hoạch thực hiện với truy vấn đơn giản, không sử dụng chế độ xem: nhập mô tả hình ảnh ở đây

kế hoạch thực hiện bằng cách sử dụng khung nhìn: kế hoạch thực hiện với tầm nhìn


Vui lòng gửi kế hoạch thực hiện của bạn cho từng trường hợp
Roi Gavish

Câu trả lời:


5

Vấn đề của bạn bắt đầu và kết thúc với số liệu thống kê và ước tính. Tôi đã tái tạo tình huống của bạn trên các máy chủ của tôi và tìm thấy một số gợi ý thú vị và một giải pháp khắc phục.

Trước tiên, hãy xem kế hoạch thực hiện của bạn:
Khi một cái nhìn được sử dụng chúng ta có thể thấy rằng một bộ lọc được áp dụng sau khi các truy vấn từ xa được thực hiện, trong khi không có quan điểm không có bộ lọc áp dụng ở tất cả. Sự thật là các bộ lọc đã được áp dụng trong các từ xa Query , tại máy chủ từ xa, trước khi lấy dữ liệu qua mạng.
Chà, rõ ràng áp dụng bộ lọc ở máy chủ từ xa và do đó lấy ít dữ liệu hơn là một lựa chọn tốt hơn và rõ ràng điều đó chỉ xảy ra khi không sử dụng chế độ xem.

Vậy ... cái gì đang xen vào ...?

Đáng ngạc nhiên, khi tôi thay đổi bộ lọc từ cognome = 'test'thành cognome = N'test'(biểu diễn unicode của chuỗi), khung nhìn đã sử dụng cùng một kế hoạch thực hiện như truy vấn đầu tiên đã làm.
Tôi đoán lý do là bằng cách nào đó khi sử dụng chế độ xem SQL Server đã ước tính rằng sẽ có một số lượng nhỏ hàng trả về từ truy vấn (từ xa) và bộ lọc cục bộ sẽ rẻ hơn, nhưng khi SQL Server phải ẩn chuyển đổi NVARCHARthành VARCHAR, số liệu thống kê không còn có thể được sử dụng và quyết định lọc cục bộ đã không được thực hiện.
Tôi đã tìm kiếm các số liệu thống kê cục bộ, nhưng chế độ xem không có số liệu thống kê, vì vậy tôi đoán là chế độ xem sử dụng số liệu thống kê từ xa theo cách mà truy vấn đặc biệt không có, và hơn là đưa ra quyết định sai.

OK, vậy điều gì giải quyết vấn đề?

Tôi đã nói trước đó rằng có một cách giải quyết (ít nhất là cho đến khi ai đó đưa ra giải pháp tốt hơn), và không, tôi không có ý sử dụng unicode cho chuỗi của bạn.
Tôi muốn đưa ra câu trả lời trước, tôi vẫn phải tìm lý do tại sao, nhưng khi sử dụng Inline FunctionSQL Server hoạt động giống hệt với truy vấn (không có chế độ xem), do đó, việc thay thế chế độ xem bằng hàm sẽ cho kết quả tương tự, trong một cách đơn giản truy vấn, và với hiệu quả tốt (ít nhất là trong môi trường của tôi).

Mã đề nghị của tôi cho bạn là:

CREATE FUNCTION fn_anagrafiche2()
RETURNS table
AS
RETURN 
(
    SELECT * 
    FROM dolph2.agendasdn.dbo.vistaanagraficagrp
    UNION
    SELECT * 
    FROM dolph2.acampanet.dbo.vistaanagraficagrp
    UNION
    SELECT * 
    FROM municipio2.dbnet.dbo.vistaanagraficagrp
)
GO

Truy vấn sau đó sẽ là:

SELECT * 
FROM fn_anagrafiche2()
WHERE cognome = 'prova'

Điều này hoạt động trên máy chủ của tôi, nhưng tất nhiên kiểm tra nó đầu tiên.
Lưu ý: Tôi hoàn toàn không khuyên bạn nên sử dụng SELECT *, vì nó dễ bị lỗi trong tương lai, tôi chỉ đơn giản sử dụng nó vì nó nằm trong câu hỏi của bạn và tôi không cần phải thay đổi điều đó khi tôi có thể thêm nhận xét này thay thế :)


Trước hết, cảm ơn! Tôi thử với N'ometext 'trong bộ lọc trên VIEW truy vấn và hoạt động như bạn nói và thật tuyệt vời! Tuy nhiên, như tôi đã nói trong câu hỏi, tôi không thể sử dụng trực tiếp chức năng vì tôi phải sử dụng khung ORM (hibernate) theo lập trình chỉ có thể ánh xạ trực tiếp Bảng và Chế độ xem từ cơ sở dữ liệu ... Vì vậy, làm cách nào tôi có thể đặt cái này thông tin hữu ích (ý tôi là chuỗi unicode) trong một khung nhìn? Tôi phải chuyển đổi tất cả các cột chuỗi trong chế độ xem trên máy chủ từ xa (vistaangraficagrp là chế độ xem trên máy chủ từ xa).
nhượng

@ced Điều này đang trở nên khó xử, nhưng nếu bạn tạo hàm và sau đó tạo chế độ xem cục bộ SELECT * FROM fn_anagrafiche2()thì sao? Liệu một lựa chọn từ quan điểm đó thực hiện tốt hơn?
Roi Gavish

Và người ta có thể muốn đọc điều này là tốt.
Roi Gavish

nếu tôi tạo chế độ xem cục bộ với lựa chọn * từ fn_anagrafiche2 () (có chứa liên kết) thì hiệu suất sẽ giống như trường hợp liên kết trực tiếp vào chế độ xem ... vì vậy không có hiệu suất tốt hơn trong trường hợp này ... = (
nhượng

@ced Quên về chức năng sau đó, chỉ cần thêm AND 1 = 1vào bộ lọc của bạn. Ứng dụng của bạn có thể làm điều đó?
Roi Gavish

2

Có một hạn chế cơ bản khi nói đến các máy chủ và thống kê được liên kết: bạn chỉ có thể nhìn thấy chúng nếu bạn có một trong các quyền sau trên vị trí từ xa :

  • một thành viên của sysadminvai trò máy chủ
  • một thành viên của db_ownerhoặc db_ddladminvai trò cơ sở dữ liệu
  • chủ sở hữu đối tượng

Thông thường bạn chỉ là người đọc dữ liệu, người không thể nhìn thấy số liệu thống kê (thậm chí không có biểu đồ). Kế hoạch thực hiện sau đó có xu hướng bị ảnh hưởng.

Điều này đã được sửa trong SQL Server 2012 SP1, nhưng không thoải mái với mã kế thừa chạy trên các phiên bản cũ hơn.

Thủ thuật tôi làm như sau:

  1. Cấp linked_serverquyền tài khoản như db_ddladmintrên máy chủ từ xa (để có thể xem số liệu thống kê).

  2. Từ chối tài khoản mọi thứdb_ddladminthực sự cấp:

    CREATE TABLE

    CREATE VIEW

    CREATE PROCEDURE

    CREATE FUNCTION

    CREATE RULE

Vân vân.

Nó hoạt động như một sự quyến rũ mà không ảnh hưởng đến an ninh!


Danh sách đầy đủ các quyền được cấp cho vai trò db_ddladmin được liệt kê TẠI ĐÂY
Roi Gavish

Tôi không hiểu lắm. Chỉ xem xét một máy chủ từ xa và chỉ một máy chủ được liên kết. Trên máy chủ từ xa, tôi cần một tài khoản với vai trò người dùng db_ddladmin được kích hoạt ánh xạ tới cơ sở dữ liệu? Trong cơ sở dữ liệu với máy chủ được liên kết tôi cần chỉ định người dùng được tạo trên máy chủ từ xa trong tab quyền của máy chủ được liên kết?
nhượng

Có - tài khoản được sử dụng để đọc trên máy chủ từ xa cũng cần phải có ddl_admin trên máy chủ từ xa. Nếu không, nó sẽ không thấy số liệu thống kê (dbcc show_statistic chạy phía sau hậu trường, bạn có thể thấy nó trên profiler)
John Alan

câu hỏi được cập nhật với một số thử nghiệm tôi đã thực hiện, withous bất kỳ kết quả ...
ced

@JohnAlan Nếu anh ấy không thể xem số liệu thống kê, tại sao sẽ có sự khác biệt về hiệu suất giữa hai trường hợp (có và không có chế độ xem)?
Roi Gavish
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.