ali.n93
سه شنبه 01 اردیبهشت 1394, 10:47 صبح
سلام دوستان
من پروژه ای دارم با عنوان "بررسی تحقیقاتی و عملیاتی تکنولوژی in-memory oltp"
قسمت تحقیقاتی رو تا حدودی انجام دادم و مشکلی ندارم اما قسمت عملیاتی مونده و یه سوال دارم
من برای اثبات برتری جدول های oltp میتونم یک دستور حلقه ایجاد کنم که برای مثال ده هزار رکورد تکراری رو اضافه می کنه و همین کار رو روی یک جدول معمولی انجام بدم و سرعت انجام عملیات رو مقایسه کنم. اما این کار خیلی ساده ست و برای یک پروژه پایانی چندان قابل قبول نیست. یک راه و روش بهتر برای اثبات این موضوع تحت محیط عملیاتی میخوام. ممنونم
****
اما یک سوال هم در همین مورد دارم
جدول هایی که schema_and_data ساخته میشن چه مزیتی نسبت به جدول های معمولی دارن؟ اخه سرعتشون رو هم تست کردم پایین تر از جدول های معمولی هستن. چون هم توی رم ذخیره میشن و هم هارد. اما جدول های schema_only فوق العاده سریع هستند
golbafan
سه شنبه 01 اردیبهشت 1394, 11:05 صبح
سلام
اول شما بگید منظور شما از جدول های معمولی چیه؟؟؟
مثالی برای تست شما:
تست جداول مبتنی بر حافظه با جداول مبتنی بر هارد دیسک:
sql server 2014
ایجاد دیتابیس:
CREATE DATABASE [INMEMORYDB]CONTAINMENT = NONE
ON PRIMARY
(NAME = N'INMEMORYDB', FILENAME = N'D:\SQLDATA\INMEMORYDB_Data01.mdf',
SIZE = 1GB, MAXSIZE = UNLIMITED, FILEGROWTH = 2GB),
FILEGROUP [INMEMORYDB_FILEGROUP] CONTAINS MEMORY_OPTIMIZED_DATA DEFAULT
(NAME = N'INMEMORYDB_CONTAINER', FILENAME = N'D:\INMEMORYDB_CONTAINER', MAXSIZE = UNLIMITED)
LOG ON
(NAME = N'INMEMORYDB_log', FILENAME = N'E:\SQLLog\INMEMORYDB_Log.ldf',
SIZE = 1GB, MAXSIZE = 2048GB, FILEGROWTH = 1GB)
ایجاد جدول حافظه و دیسک:
CREATE TABLE [dbo].[Product_InMemory]
([ProductID] [int] IDENTITY(1,1) NOT NULL NONCLUSTERED PRIMARY KEY HASH WITH (BUCKET_COUNT=3000000),
[ProductName] [nvarchar](40) NOT NULL,
[SupplierID] [int] NOT NULL INDEX [IX_SupplierID] HASH WITH (BUCKET_COUNT=3000000),
[CategoryID] [int] NOT NULL INDEX [IX_CategoryID] HASH WITH (BUCKET_COUNT=3000000),
[QuantityPerUnit] [nvarchar](20) NULL,
[UnitPrice] [money] NULL DEFAULT ((0)),
[UnitsInStock] [smallint] NULL DEFAULT ((0)),
[UnitsOnOrder] [smallint] NULL DEFAULT ((0)),
[ReorderLevel] [smallint] NULL DEFAULT ((0)),
[Discontinued] [bit] NOT NULL DEFAULT ((0))
)
WITH (MEMORY_OPTIMIZED=ON)
GO
CREATE TABLE [dbo].[Product_OnDisk]
([ProductID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED ,
[ProductName] [nvarchar](40) NOT NULL,
[SupplierID] [int] NOT NULL INDEX [IX_SupplierID] NONCLUSTERED ,
[CategoryID] [int] NULL INDEX [IX_CategoryID] NONCLUSTERED,
[QuantityPerUnit] [nvarchar](20) NULL,
[UnitPrice] [money] NULL DEFAULT ((0)),
[UnitsInStock] [smallint] NULL DEFAULT ((0)),
[UnitsOnOrder] [smallint] NULL DEFAULT ((0)),
[ReorderLevel] [smallint] NULL DEFAULT ((0)),
[Discontinued] [bit] NOT NULL DEFAULT ((0))
)
انجام تست:
--In-Memory OLTP Stored Procedure to modify In-Memory Table
CREATE PROCEDURE dbo.usp_ProductInsert_InMemory(@InsertCount int )
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER
AS
BEGIN ATOMIC
WITH (TRANSACTION ISOLATION LEVEL=SNAPSHOT, LANGUAGE=N'us_english')
DECLARE @SupplierID int=1, @CategoryID int=1
DECLARE @Start int=1
WHILE @Start<@InsertCount
BEGIN
INSERT INTO dbo.Product_InMemory(ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued )
SELECT 'NewProduct_' + CAST(@Start AS VARCHAR(10)),@SupplierID,@CategoryID, 1,1,1,1,1,1
IF @SupplierID=10 SET @SupplierID=0
IF @CategoryID=8 SET @CategoryID=0
SET @SupplierID=@SupplierID+1
SET @CategoryID=@CategoryID+1
SET @Start=@Start+1
END
END
-- OnDisk-Based Stored Procedure to modify OnDisk Table
CREATE PROCEDURE dbo.usp_ProductInsert_OnDisk(@InsertCount int )
AS
BEGIN
DECLARE @SupplierID int=1, @CategoryID int=1
DECLARE @Start int=1
WHILE @Start<@InsertCount
BEGIN
INSERT INTO dbo.Product_OnDisk(ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued )
SELECT 'NewProduct_' + CAST(@Start AS VARCHAR(10)),@SupplierID,@CategoryID, 1,1,1,1,1,1
IF @SupplierID=10 SET @SupplierID=0
IF @CategoryID=8 SET @CategoryID=0
SET @SupplierID=@SupplierID+1
SET @CategoryID=@CategoryID+1
SET @Start=@Start+1
END
END
نتیجه:
http://www.mssqltips.com/tipimages2/3392_InMemory_OLTP_Performance_01.jpg
golbafan
سه شنبه 01 اردیبهشت 1394, 11:26 صبح
در مورد سوال دوم:
اولا باید بگم که جداول in memory درسته که از لحاظ سرعت خوب ترند اما این برای سیستم های ناپایدار بسیار خطرناکه و هر لحظه امکان از بین رفتن داده ها وجود داره مخصوصا اگر حافظه شما کم باشه که در این مورد در مواقعی که دیتا خیلی زیاد میشه میتونه باعث کرش شدن سیستم هم بشه و همچنین از دست دادن داده های شما
به هر حال توصیه میکنم عنوان خودتون رو عوض کنید (برتری oltp) رو باید به (برتری oltp در سرعت) تغییر بدید
چراکه هر چیزی را بهر کاری ساخته اند...
tooraj_azizi_1035
دوشنبه 07 اردیبهشت 1394, 15:54 عصر
سلام
یکی از مشتری های مایکروسافت به نام BWin تونست با استفاده از این تکنولوژی از 15000 تراکنش در ثانیه به 250000 تراکنش در ثانیه دست پیدا کنه. و دلیل اون ساختارهای Lock Free و Latch Free استفاده شده در این سیستم هست که همزمانی رو فوق العاده بالا می بره. بهتره روی چنین موضوعی تمرکز کنید.
SQL Server In-Memory OLTP Internals Overview رو سرچ کنید.
schema_and_data مقداری برای خاصیت Durability یک جدول Memory Optimized است که تعیین می کند پس از Recover جدول هم داده ها و هم Schema ی جدول باید قابل دستیابی باشد اما در Schema only فقط Schema ذخیره می شود و چون Log نداریم I/O هم نداریم پس سرعت به مراتب بیشتر است.
abbasTaghizadeh
سه شنبه 19 آبان 1394, 13:02 عصر
دوستان به کمک شما اورژانسی احتیاج دارم لطفا کمک کنید
من یه برنامه سنگین دارم که پایگاه داده روی سرور قرار دارد و برنامه روی کامپیوتر های کلاینت نصب شده است وقتی این کاربران در طول روز با برنامه کار می کنن حجم رم در سرور هی بالا میره تا جایی که کل رم پر شده و سرور ریست میشه اگر امکانش هست منو راهنمایی بفرمایید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.