2008-08-26 21 views
16

Gần đây, tôi bắt đầu thay đổi một số ứng dụng của chúng tôi để hỗ trợ MS SQL Server như là một kết thúc thay thế.MS-SQL có hỗ trợ các bảng trong bộ nhớ không?

Một trong những vấn đề tương thích mà tôi gặp phải là sử dụng bảng TẠO TẠO TẠO của MySQL để tạo các bảng trong bộ nhớ chứa dữ liệu để truy cập rất nhanh trong một phiên mà không cần lưu trữ vĩnh viễn.

Tương đương với MS SQL là gì?

Một yêu cầu là tôi cần phải có thể sử dụng bảng tạm thời giống như bất kỳ bảng nào khác, đặc biệt là JOIN nó với số vĩnh viễn.

+1

Tôi hy vọng bạn nhận thức được trong MySQL, các bảng tạm thời do người dùng tạo không nằm trong bộ nhớ theo mặc định! Chỉ khi bạn chỉ định ENGINE = MEMORY trong câu lệnh CREATE TABLE, bảng sẽ nằm trong bộ nhớ. Nếu không, bảng tạm thời sẽ được tạo với công cụ lưu trữ mặc định, rất có thể là MyISAM hoặc INNODB và được lưu trên đĩa. Không được gây nhầm lẫn do người dùng tạo ra với các bảng tạm thời nội bộ được tạo bởi MySQL trong quá trình kết hợp phức tạp. Chúng được tạo ra trong bộ nhớ, nếu có thể. –

Trả lời

13

@Keith

Đây là một quan niệm sai lầm phổ biến: Bảng biến không nhất thiết phải được lưu trữ trong bộ nhớ. Trong thực tế, SQL Server quyết định có nên giữ biến trong bộ nhớ hay làm tràn nó vào TempDB hay không. Không có cách đáng tin cậy (ít nhất là trong SQL Server 2005) để đảm bảo rằng dữ liệu bảng được lưu giữ trong bộ nhớ. Để biết thêm thông tin chi tiết, hãy xem here

0

CREATE TABLE #tmptablename

Sử dụng băm/pound dấu hiệu tiền tố

3

Bạn có thể khai báo một "biến bảng" trong SQL Server 2005, như thế này:

declare @foo table (
    Id int, 
    Name varchar(100) 
); 

Sau đó bạn tham khảo nó giống như một biến:

select * from @foo f 
    join bar b on b.Id = f.Id 

Không cần phải thả nó - nó biến mất khi thứ biến e nằm ngoài phạm vi.

0

Cú pháp bạn muốn là:

tạo bảng #tablename

CáC# tiền tố xác định bảng như một bảng tạm thời.

1

Một tốt blog post here nhưng về cơ bản tiền tố bảng tạm thời địa phương với # và tạm thời toàn cầu với ## - ví dụ

CREATE TABLE #localtemp 
17

Bạn có thể tạo các biến bảng (trong bộ nhớ), và hai loại khác nhau của bảng temp:

--visible only to me, in memory (SQL 2000 and above only) 
declare @test table (
    Field1 int, 
    Field2 nvarchar(50) 
); 

--visible only to me, stored in tempDB 
create table #test (
    Field1 int, 
    Field2 nvarchar(50) 
) 

--visible to everyone, stored in tempDB 
create table ##test (
    Field1 int, 
    Field2 nvarchar(50) 
) 

Edit:

Sau thông tin phản hồi tôi nghĩ rằng điều này cần một chút làm rõ.

#table##table sẽ luôn ở trong TempDB.

@Table biến thường sẽ có trong bộ nhớ nhưng không được bảo đảm. SQL quyết định dựa trên kế hoạch truy vấn và sử dụng TempDB nếu nó cần.

1

Tôi hiểu những gì bạn đang cố gắng đạt được. Chào mừng bạn đến với thế giới của nhiều cơ sở dữ liệu!Máy chủ SQL 2000 hỗ trợ các bảng tạm thời được tạo bởi tiền tố một tên bảng, làm cho nó thành một bảng tạm thời có thể truy cập cục bộ (cục bộ đến phiên) và trướC## với tên bảng, cho các bảng tạm thời có thể truy cập toàn cục, ví dụ #MyLocalTable và ## MyGlobalTable tương ứng.

Máy chủ SQL 2005 trở lên hỗ trợ cả bảng tạm thời (cục bộ, toàn cầu) và biến bảng - xem ra chức năng mới trên các biến bảng trong SQL 2008 và phát hành hai biến! Sự khác biệt giữa các bảng tạm thời và các biến bảng không quá lớn nhưng nằm trong cách máy chủ cơ sở dữ liệu xử lý chúng.

tôi sẽ không muốn nói về phiên bản cũ của SQL server như 7, 6, mặc dù tôi đã làm việc với họ và nó là nơi tôi đến từ anyway :-)

Nó thường nghĩ rằng các biến bảng luôn cư trú trong bộ nhớ nhưng điều này là sai. Tùy thuộc vào mức sử dụng bộ nhớ và khối lượng giao dịch của máy chủ cơ sở dữ liệu, các trang của biến bảng có thể được xuất từ ​​bộ nhớ và được viết bằng tempdb và phần còn lại của quá trình xử lý diễn ra ở đó (trong tempdb). Xin lưu ý rằng tempdb là một cơ sở dữ liệu trên một cá thể không có đối tượng cố định nhưng chịu trách nhiệm xử lý khối lượng công việc liên quan đến các giao dịch phụ như phân loại và các công việc xử lý khác tạm thời trong tự nhiên. Mặt khác, các biến bảng (thường với dữ liệu nhỏ hơn) được lưu trong bộ nhớ (RAM) làm cho chúng truy cập nhanh hơn và do đó ít đĩa IO hơn khi sử dụng ổ đĩa tempdb khi sử dụng các biến bảng với dữ liệu nhỏ hơn so với các bảng tạm thời. đăng nhập tempdb.

Biến bảng không thể lập chỉ mục trong khi bảng tạm thời (cả cục bộ và toàn cầu) có thể được lập chỉ mục để xử lý nhanh hơn trong trường hợp số lượng dữ liệu lớn. Vì vậy, bạn biết lựa chọn của mình trong trường hợp xử lý nhanh hơn với khối lượng dữ liệu lớn hơn bằng các giao dịch tạm thời. Cũng cần lưu ý rằng các giao dịch trên các biến bảng một mình không được ghi lại và không thể được khôi phục trong khi các giao dịch được thực hiện trên các bảng tạm thời có thể được khôi phục!

Tóm lại, các biến bảng tốt hơn cho dữ liệu nhỏ hơn trong khi các bảng tạm thời tốt hơn để dữ liệu lớn hơn được xử lý tạm thời. Nếu bạn cũng muốn kiểm soát giao dịch thích hợp bằng cách sử dụng các khối giao dịch, các biến bảng không phải là một tùy chọn để quay lại các giao dịch, vì vậy bạn nên sử dụng các bảng tạm thời trong trường hợp này.

Cuối cùng, bảng tạm thời sẽ luôn tăng đĩa IO vì chúng luôn sử dụng tempdb trong khi các biến bảng có thể không tăng, tùy thuộc vào mức độ căng thẳng của bộ nhớ.

Hãy cho tôi biết nếu bạn muốn biết các mẹo về cách điều chỉnh tempdb của mình để kiếm được hiệu suất nhanh hơn nhiều để vượt quá 100%!

+0

Chris, tại sao bạn không thiết lập một tài khoản SO? –

+0

@Chris - vui lòng để lại các dòng thẻ tôn giáo ở cuối bài đăng của bạn. Ngoài ra các công cụ tự quảng cáo thuộc về hồ sơ của bạn, không phải ở cuối bài đăng của bạn. – slugster

2

Có thể với MS SQL Server 2014.

Xem: http://msdn.microsoft.com/en-us/library/dn133079.aspx

Dưới đây là một ví dụ về mã thế hệ SQL (từ MSDN):

-- create a database with a memory-optimized filegroup and a container. 
CREATE DATABASE imoltp 
GO 

ALTER DATABASE imoltp ADD FILEGROUP imoltp_mod CONTAINS MEMORY_OPTIMIZED_DATA 
ALTER DATABASE imoltp ADD FILE (name='imoltp_mod1', filename='c:\data\imoltp_mod1') TO FILEGROUP imoltp_mod 
ALTER DATABASE imoltp SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON 
GO 

USE imoltp 
GO 


-- create a durable (data will be persisted) memory-optimized table 
-- two of the columns are indexed 
CREATE TABLE dbo.ShoppingCart ( 
    ShoppingCartId INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED, 
    UserId INT NOT NULL INDEX ix_UserId NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000), 
    CreatedDate DATETIME2 NOT NULL, 
    TotalPrice MONEY 
) WITH (MEMORY_OPTIMIZED=ON) 
GO 

-- create a non-durable table. Data will not be persisted, data loss if the server turns off unexpectedly 
CREATE TABLE dbo.UserSession ( 
    SessionId INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=400000), 
    UserId int NOT NULL, 
    CreatedDate DATETIME2 NOT NULL, 
    ShoppingCartId INT, 
    INDEX ix_UserId NONCLUSTERED HASH (UserId) WITH (BUCKET_COUNT=400000) 
) WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY) 
GO 
Các vấn đề liên quan