هل MS-SQL الدعم في الذاكرة الجداول ؟
-
09-06-2019 - |
سؤال
في الآونة الأخيرة بدأت في تغيير بعض من التطبيقات لدعم 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
استخدام التجزئة/الجنيه البادئة