سؤال

في الآونة الأخيرة بدأت في تغيير بعض من التطبيقات لدعم MS SQL Server كبديل النهاية الخلفية.

واحدة من مشاكل التوافق ركضت هو استخدام الخلية إنشاء جدول مؤقت خلق في الذاكرة الجداول التي تحمل بيانات سريع جدا خلال الدورة مع عدم وجود الحاجة إلى التخزين الدائم.

ما يعادل في MS SQL ؟

الشرط هو أن لا تحتاج إلى أن تكون قادرة على استخدام الجدول المؤقت تماما مثل أي دولة أخرى ، وخاصة JOIN مع الدائم منها.

هل كانت مفيدة؟

المحلول

@كيث

هذا هو مفهوم خاطئ شائع:الجدول المتغيرات ليست بالضرورة المخزنة في الذاكرة.في الواقع SQL Server يقرر ما إذا كان للحفاظ على المتغير في الذاكرة أو أن تمتد إلى TempDB.ليس هناك طريقة يمكن الاعتماد عليها (على الأقل في SQL Server 2005) للتأكد من أن جدول البيانات يتم الاحتفاظ بها في الذاكرة.لمزيد من المعلومات التفصيلية نظرة هنا

نصائح أخرى

يمكنك إنشاء جدول المتغيرات (في الذاكرة) و اثنين من أنواع مختلفة من الجدول المؤقت:

--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)
)

تحرير:

في أعقاب ردود الفعل أعتقد أن هذا يحتاج إلى القليل من التوضيح.

#table و ##table سوف تكون دائما في TempDB.

@Table المتغيرات عادة في الذاكرة, ولكن لا يضمن أن تكون.SQL تقرر بناء على خطة الاستعلام ، ويستخدم TempDB إذا كان يحتاج إلى.

يمكنك أن يعلن "الجدول متغير" في SQL Server 2005, مثل هذا:

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

ثم تشير إلى أنه في مثل متغير:

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

لا تحتاج إلى إسقاط ذلك - فإنه يذهب بعيدا عندما متغير يخرج من نطاق.

فمن الممكن مع MS SQL Server 2014.

انظر: http://msdn.microsoft.com/en-us/library/dn133079.aspx

هنا هو مثال على SQL رمز جيل (من 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

جيد بلوق وظيفة هنا ولكن أساسا البادئة المحلية temp الجداول مع # والعالمية درجة الحرارة مع ## - على سبيل المثال

CREATE TABLE #localtemp

أنا أفهم ما كنت تحاول تحقيق.مرحبا بكم في العالم من مجموعة متنوعة من قواعد البيانات!

يدعم SQL server 2000 الجداول المؤقتة التي تم إنشاؤها قبل التقديم رقم إلى اسم الجدول ، مما يجعلها محليا يمكن الوصول إليها الجدول المؤقت (المحلية إلى الدورة) و السابقة ## إلى اسم الجدول ، من أجل الوصول إليها عالميا الجداول المؤقتة هـ.g #MyLocalTable و ##MyGlobalTable على التوالي.

SQL server 2005 وما فوق دعم كل الجداول المؤقتة (المحلية والعالمية) و متغيرات الجدول - احترس من وظائف جديدة على متغيرات الجدول في SQL server 2008 الإصدار اثنين!الفرق بين الجداول المؤقتة و متغيرات الجدول ليست كبيرة جدا ولكن يكمن في الطريقة خادم قاعدة البيانات مقابض لهم.

لا أود التحدث عن الإصدارات القديمة من SQL server مثل 7, 6, على الرغم من أنني عملت معهم و هو من أين أتيت على كل حال :-)

فإنه من الشائع أن تعتقد أن متغيرات الجدول يقيمون دائما في الذاكرة ولكن هذا غير صحيح.اعتمادا على استخدام الذاكرة و خادم قاعدة البيانات حجم المعاملات ، متغير جدول صفحات قد يصدر من الذاكرة و الحصول على كتب في tempdb وبقية تجهيز يحدث هناك (في tempdb).

يرجى ملاحظة أن بيانات قاعدة بيانات على سبيل المثال لا دائم الكائنات في الطبيعة ولكن هو مسؤول عن التعامل مع أعباء العمل التي تنطوي على جانب المعاملات مثل الفرز ، وغيرها من تجهيز عمل مؤقتة في طبيعتها.من ناحية أخرى, متغيرات الجدول (عادة مع أصغر البيانات) يتم الاحتفاظ بها في الذاكرة (RAM) مما يجعلها أسرع في الوصول وبالتالي أقل القرص IO من حيث استخدام بيانات محرك الأقراص عند استخدام متغيرات الجدول مع البيانات أصغر مقارنة الجداول المؤقتة التي دائما الدخول في tempdb.

الجدول المتغيرات لا يمكن فهرستها في حين الجداول المؤقتة (المحلية و العالمية) يمكن فهرستها من أجل معالجة أسرع في حالة كمية البيانات كبيرة.حتى تعرف اختيارك في حالة معالجة أسرع مع أكبر أحجام البيانات المؤقتة المعاملات.ومن الجدير بالذكر أيضا أن المعاملات على متغيرات الجدول وحدها لا تسجيل و لا يمكن التراجع في حين أن أولئك عمله على الجداول المؤقتة يمكن التراجع!

في ملخص, متغيرات الجدول أفضل أصغر البيانات أثناء الجداول المؤقتة هي أفضل كميات أكبر من البيانات يتم معالجتها بشكل مؤقت.إذا كنت تريد أيضا الصفقة المناسبة التحكم باستخدام المعاملات كتل الجدول المتغيرات ليست خيارا من أجل دحر المعاملات لذلك كنت أفضل حالا مع الجداول المؤقتة في هذه الحالة.

وأخيرا الجداول المؤقتة دائما زيادة القرص IO لأنها دائما استخدام tempdb في حين متغيرات الجدول قد لا تزيد الأمر اعتمادا على الذاكرة مستويات التوتر.

اسمحوا لي أن أعرف إذا كنت تريد نصائح حول كيفية ضبط tempdb لكسب أداء أسرع بكثير للذهاب أعلى من 100%!

جملة تريدها:

إنشاء جدول #tablename

رقم بادئة يحدد الجدول جدول مؤقت.

إنشاء جدول #tmptablename

استخدام التجزئة/الجنيه البادئة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top