Là dữ liệu được lấy từ SQL Server được nén để truyền?


20

Dữ liệu được lấy từ Microsoft SQL Server có được nén không? Nếu điều này được kiểm soát bởi chuỗi kết nối, có cách nào đơn giản để biết liệu có ứng dụng cụ thể nào đang sử dụng không?

Tôi đang kiểm tra các công cụ phân tích và khối lượng dữ liệu có thể mất vài phút để truyền qua mạng của chúng tôi. Tôi đang tự hỏi liệu tôi có nên tăng hiệu suất hay không nếu chúng tôi lấy dữ liệu từ một kho lưu trữ dữ liệu nén trên cùng một máy chủ từ xa.

Miễn là chúng ta đang ở trong chủ đề này, tôi tò mò: dữ liệu được truyền ở dạng nhị phân hay ASCII? Ví dụ: nếu giá trị 12345được truy vấn từ một INTcột, thì nó được truyền dưới dạng năm byte 0x31, 0x32, 0x33, 0x34, 0x35; hai byte được yêu cầu cho giá trị; hoặc bốn byte theo yêu cầu cho cột?

Để rõ ràng, tôi hiểu rằng có các tùy chọn liên quan đến việc lưu trữ dữ liệu bằng nén và sao lưu dữ liệu. Tôi đang hỏi về cách truyền dữ liệu.


Nén là một cơ chế nội bộ. Một trang được nén trên đĩa và trong vùng đệm nhưng một luồng byte thông thường trên dây. @ShawnMelton đã viết blog về việc đánh hơi định dạng dây trước đây và hy vọng sẽ phản hồi với những điểm nổi bật.
Mark Storey-Smith

Những gì tôi viết đã tập trung nhiều hơn vào việc nó có được mã hóa hay không. Tôi có thể chọn dữ liệu tôi đang lấy ở định dạng có thể đọc được, mặc dù tôi không thử các giá trị nguyên. Cách duy nhất để biết chắc chắn chỉ là thiết lập và thử nó: mssqltips.com/sqlservertip/2436/ mẹo
Shawn Melton

@ MarkStorey-Smith: Vậy câu trả lời là "không", dữ liệu không được nén? Đó là một sự xấu hổ, nhưng nó giúp giải thích tại sao những truy vấn lớn này có thể mất nhiều thời gian để truyền tải. Có vẻ như tôi cần một bộ đệm gần hơn về mặt vật lý. Nếu bạn muốn làm cho câu trả lời thực sự, tôi sẽ chấp nhận nó.
Jon của tất cả các giao dịch

@ShawnMelton: Điều đó chắc chắn nghe có vẻ đúng cách, tôi chỉ không có đủ nền tảng mạng để đến đúng lớp và tự tin vào những gì tôi đang thấy. May mắn cho tôi là có những người có nhiều kỹ năng hơn và có nhiều thời gian hơn trên tay!
Jon của tất cả các giao dịch

Câu trả lời:


16

Dữ liệu bạn đang tìm cách nén là dữ liệu được gửi qua dây qua TDS . Có một số nén nhỏ ở đây nhưng không ở đâu gần kiểu nén mà bạn có được với nén trang / hàng, nén sao lưu hoặc nén Cột.

Nó đã được yêu cầu trước đây:

http://connect.microsoft.com/QueryServer/feedback/details/412131/enable-network-compression-compress-tds-stream

http://connect.microsoft.com/QueryServer/feedback/details/377479/wan-compression-option

Các mặt hàng vẫn đang mở, vì vậy có thể có một số hy vọng. Không có cách nào để kiểm soát điều này thông qua chuỗi kết nối mà tôi từng thấy.

Trong khi đó, có một số sản phẩm tuyên bố sẽ làm điều này, vd

http://www.nitrosphere.com/products/nitroaccelerator/

http://toonel.net/tcpany.htm

Bạn cũng có khả năng định cấu hình mạng giữa Máy chủ SQL của mình và máy chủ ứng dụng để hỗ trợ nén (và những thứ khác như mã hóa) nhưng bạn vượt quá phạm vi của tôi ở đây và tôi không chắc liệu điều này có được hỗ trợ bởi mọi tính năng duy nhất của SQL không Máy chủ.

Và thành thật mà nói, tôi không tin đây là nơi bạn muốn tập trung vào việc tối ưu hóa. Nén luồng này thực sự có thể làm mọi thứ chậm lại và vượt xa lợi ích của việc gửi ít byte hơn. Tôi thà tiết kiệm tiền để kết nối mạng tốt hơn giữa máy chủ và máy khách hơn là dành thời gian đầu tư vào loại công việc này và kiểm tra xem nó có bất kỳ lợi ích thực tế nào không - và không thể làm điều đó cho đến sau đó. Từ 10/100 đến gig gig có tác động đã biếtcó thể dự đoán được đối với I / O mạng.


Tôi không chắc chắn về định dạng của các byte được gửi qua dây; bạn sẽ phải thiết lập một số loại sniffer gói cho điều đó (hoặc có thể ai đó đã thực hiện điều đó và sẽ kêu gọi).

Về tác động của việc nén, trừ khi bạn đang sử dụng Fusion-IO hoặc các giải pháp loại SSD cao cấp khác, hiện tại bạn gần như chắc chắn bị ràng buộc I / O và không bị ràng buộc CPU. Vì vậy, miễn là bạn có chi phí hoạt động của CPU, bạn sẽ thấy hiệu suất nhanh hơn khi bật tính năng nén (nhưng điều này sẽ không thay đổi hiệu suất mạng , vì dữ liệu không bị nén trước khi truyền). Tôi nói rằng không biết gì về máy chủ, ứng dụng, dữ liệu hoặc mô hình sử dụng của bạn - bạn rất có thể có trường hợp cạnh mà việc nén thực sự làm giảm hiệu suất hoặc khi dữ liệu không phải là ứng cử viên tốt cho tỷ lệ nén tốt.


Đó chắc chắn là mạng đó là vấn đề, ít nhất là khi truyền 10 MB. Tôi có thể truy vấn dữ liệu trong vài giây trên chính máy chủ trong RDP, nhưng cho biết máy chủ nằm ngoài trạng thái và sao chép dữ liệu vào máy tính ở vị trí doanh nghiệp - bằng tệp op đơn giản hoặc bằng cách truy vấn từ máy tính cục bộ với tôi - mất vài phút
Jon của tất cả các giao dịch

Vì vậy, có lẽ bạn nên sao chép, nhân bản hoặc một cái gì đó khác và truy vấn dữ liệu cục bộ từ bản sao. Bằng cách đó, độ trễ không được cảm nhận bởi người dùng cuối. Cách bạn tiếp cận điều này phụ thuộc vào mức độ mới của dữ liệu. Và cũng cho dù bạn thực sự cần một người dùng cuối để truy vấn 10 MB dữ liệu cùng một lúc.
Aaron Bertrand

Chính xác. Trừ khi chúng ta có thể di chuyển máy chủ BI. Về khối lượng dữ liệu, việc sử dụng là để phân tích (sử dụng QlikView, ATM), do đó, nhiều năm dữ liệu và rất nhiều kích thước và sự kiện. Các tệp có dung lượng lên tới 100 MB khi nén và đó chỉ là dữ liệu trong một vài năm!
Jon của tất cả các giao dịch

@Jonof ALLTrades Cuộc thi với ý định tốt nhất ... có vẻ như bạn đang cố gắng giải quyết vấn đề sai, với giải pháp sai.
Mark Storey-Smith

@ MarkStorey-Smith: Cái gì thay thế? Có rất nhiều dữ liệu và việc truy cập trên mạng WAN của chúng tôi rất chậm. Như Aaron đề cập, một số loại bộ đệm cục bộ sẽ giúp ích. Việc cắt giảm khối lượng dữ liệu được truyền sẽ làm giảm phạm vi phân tích của người dùng, điều này đã đánh bại mục đích khám phá dữ liệu trực quan.
Jon của tất cả các giao dịch

4

Dữ liệu được lấy từ Microsoft SQL Server có được nén không? Nếu điều này được kiểm soát bởi chuỗi kết nối, có cách nào đơn giản để biết liệu có ứng dụng cụ thể nào đang sử dụng không?

Về mặt kỹ thuật, kết quả có thể được nén rất nhẹ .

Luồng dữ liệu dạng bảng (TDS) 7.3B, được hỗ trợ đầu tiên bởi SQL Server 2008 R2, đã giới thiệu một thứ gọi là nén bitmap null , cho phép các hàng chứa nhiều null được truyền bằng cách sử dụng ít byte hơn so với yêu cầu thông thường của các giá trị trường null.

Máy chủ có thể xen kẽ các hàng thông thường với các hàng được nén bitmap null theo lựa chọn của nó khi nó gửi kết quả. Máy khách không có quyền kiểm soát này vì vậy không có tùy chọn cấu hình phía máy khách nào khả dụng.

Null bitmap là hình thức nén duy nhất hiện được TDS hỗ trợ. Nếu một hàng không được nén bitmap, nó được gửi không nén.

Miễn là chúng ta đang ở trong chủ đề này, tôi tò mò: dữ liệu được truyền ở dạng nhị phân hay ASCII?

Các cột có kiểu dữ liệu phi văn bản được truyền bằng định dạng nhị phân được xác định bởi giao thức TDS .


2

Như đã đề cập ở nơi khác , để khắc phục sự cố này, bạn có thể xem xét việc thiết lập VPN và cho phép nén.

Như những người khác đã nói, không có nén được tích hợp vào Giao thức TDS của SQL Server. Cũng đáng nói rằng theo mặc định cũng không có mã hóa. Để kích hoạt mã hóa, bạn phải sử dụng chứng chỉ và chỉ định nó trong chuỗi kết nối.

Giải pháp đơn giản nhất để giải quyết cả hai vấn đề là mở một đường hầm VPN có bật mã hóa và nén. Microsoft PPTP đơn giản giải quyết cả hai vấn đề và dễ dàng thiết lập.


1

Tại sao không thiết lập một cá thể SQL cục bộ lưu trữ dữ liệu liên quan và đồng bộ hóa mỗi n giờ? Một điều khác cần xem xét là tính toán trước các hình khối và có nút 'lấy thông tin chi tiết' khi bạn đến một ô tóm tắt. Điều đó sau đó sẽ chỉ lấy các hàng chi tiết có liên quan.


Câu đầu tiên của bạn nghe rất giống bình luận này .
Aaron Bertrand
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.