±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚÔÆÆÜÉçÇø,ÕâÆªÎÄÕÂÌÖÂÛÈçºÎÀûÓÃSQL
Server 2016Áд洢¼¼Êõ×öʵʱÊý¾Ý·ÖÎö£¬½â¾ö´«Í³·ÖÎö·½·¨µÄÍ´µã¡£ |
|
Êý¾Ý·ÖÎöÖ¸µ¼ÉÌÒµÐÐΪµÄ¼ÛÖµÔ½À´Ô½¸ß£¬Ê¹µÃÓû§¶ÔÊý¾Ýʵʱ·ÖÎöµÄÒªÇó±äµÃÔ½À´Ô½¸ß¡£Ê¹Óô«Í³RDBMSÊý¾Ý·ÖÎö¼Ü¹¹£¬Óöµ½ÁËǰËùδÓеÄÌôÕ½£¬¸ßÑÓ³Ù¡¢Êý¾Ý´¦ÀíÁ÷³Ì¸´ÔӺͳɱ¾¹ý¸ß¡£
´«Í³RDBMSÊý¾Ý·ÖÎö
ÔÚ¹ýÈ¥ºÜ³¤Ò»¶Îʱ¼ä£¬ÆóÒµ¾ùÑ¡Ôñ´«Í³µÄ¹ØÏµÐÍÊý¾Ý¿â×öOLAPºÍData Warehouse¹¤×÷¡£ÕâÒ»½ÚÌÖÂÛ´«Í³RDBMSÊý¾Ý·ÖÎöµÄ½á¹¹ºÍÃæÁÙµÄÌôÕ½¡£
´«Í³RDBMS·ÖÎö¼Ü¹¹
´«Í³¹ØÏµÐÍÊý¾Ý¿â×öÊý¾Ý·ÖÎöµÄ¼Ü¹¹£¬°´ÕÕ¹¦ÄÜÄ£¿é¿ÉÒÔ»®·ÖΪÈý¸ö²¿·Ö£º
OLTPÄ£¿é£ºOLTPµÄÈ«³ÆÊÇOnline Transaction Processing£¬ËüÊÇÊý¾Ý²úÉúµÄÔ´Í·£¬¶ÔÊý¾ÝµÄÍêÕûÐÔºÍÒ»ÖÂÐÔÒªÇóºÜ¸ß;¶ÔÊý¾Ý¿âµÄ·´Ó¦Ê±¼ä(RT:
Response Time)·Ç³£Ãô¸Ð;¾ßÓи߲¢·¢£¬¶àÊÂÎñ£¬¸ßÏìÓ¦µÈÌØµã¡£
ETLÄ£¿é£ºETLµÄÈ«³ÆÊÇExtract Transform Load¡£ËûÊÇ×öÊý¾ÝÇåÏ´¡¢×ª»¯ºÍ¼ÓÔØ¹¤×÷µÄ¡£¿ÉÒÔ½«ETLÀí½âΪÊý¾Ý´ÓOLTPµ½Data
WarehouseµÄ¡°°áÔ˹¤¡±¡£ETL×î´óµÄÌØ¶¨ÊǾßÓÐÑÓʱÐÔ£¬ÎªÁË×î´óÏ޶ȼõС¶ÔOLTPµÄÓ°Ï죬һ°ã»áÉè¼Æ³É°´Ð¡Ê±£¬°´Ìì»òÕß°´ÖÜÀ´ÖÜÆÚÐÔÔË×÷¡£
OLAPÄ£¿é£ºOLAPµÄÈ«³ÆÊÇOnline Analytic Processing£¬ËüÊÇ»ùÓÚÊý¾Ý²Ö¿â(Data
Warehouse)×öÊý¾Ý·ÖÎöºÍ±¨±í³ÊÏÖµÄÖն˲úÆ·¡£Êý¾Ý²Ö¿âµÄÌØµãÊÇ£ºÊý¾ÝÐÎ̬¹Ì¶¨£¬¼¸ºõ»òÕߺÜÉÙ·¢ÉúÊý¾Ý±ä¸ü£¬Í³¼Æ²éѯ·ÖÎö¶ÁÈ¡Êý¾ÝÁ¿´ó¡£
´«Í³µÄRDBMS·ÖÎöÄ£ÐÍͼ£¬ÈçÏÂͼչʾ(ͼƬֱ½Ó½ØÈ¡×Ô΢ÈíµÄÅàѵ²ÄÁÏ)£º

´ÓÕâ¸öͼ£¬ÎÒÃÇ¿ÉÒԷdz£ÇåÎúµÄ¿´µ½´«Í³RDBMS·ÖÎöÄ£Ð͵ÄÈý¸ö´óµÄ²¿·Ö£ºÔÚͼµÄ×î×ó±ßÊÇOLTPÒµÎñ³¡¾°£¬¸ºÔð²É¼¯ºÍ²úÉúÊý¾Ý;ͼµÄÖв¿ÊÇETLÈÎÎñ£¬¸ºÔð¡°°áÔË¡±Êý¾Ý;ͼµÄÓÒ±ßÊÇOLAPÒµÎñ³¡¾°£¬¸ºÔð·ÖÎöÊý¾Ý£¬È»ºó½«·ÖÎö½á¹û½»¸øBI±¨±íչʾ¸ø×îÖÕÓû§¡£ÆóҵʹÓÃÕâ¸ö´«Í³µÄ¼Ü¹¹³¤´ïÊýÄ꣬Óöµ½Á˲»ÉÙµÄÌôÕ½ºÍÀ§ÄÑ¡£
ÃæÁÙµÄÌôÕ½
É̳¡ÈçÕ½³¡£¬Õ½»úËæÏ¢Íò±ä£¬Êý¾Ý·ÖÎö½á¹ûÖ¸µ¼ÉÌÒµÐÐΪµÄ¼ÛÖµÔ½À´Ô½¸ß£¬Ê¹µÃÊý¾Ý·ÖÎö½á¹û±äµÃÔ½À´Ô½ÖØÒª£¬Óû§¶ÔÊý¾Ýʵʱ·ÖÎöµÄÒªÇó±äµÃÔ½À´Ô½¸ß¡£Ê¹Óô«Í³RDBMS·ÖÎö¼Ü¹¹£¬Óöµ½ÁËǰËùδÓеÄÌôÕ½£¬Ö÷ÒªµÄÍ´µã°üÀ¨£º
Êý¾ÝÑÓ³Ù´ó
Êý¾Ý´¦ÀíÁ÷³ÌÈß³¤¸´ÔÓ
³É±¾¹ý¸ß
Êý¾ÝÑÓ³Ù´ó£ºÎªÁ˼õÉÙ¶ÔOLTPÄ£¿éµÄÓ°Ï죬ETLÈÎÎñÍùÍù»áÑ¡ÔñÔÚÒµÎñµÍ·åÆÚÖÜÆÚÐÔÔË×÷£¬±ÈÈçÁ賿¡£Õâ¾Í»áµ¼ÖÂOLAP·ÖÎöµÄÊý¾ÝÔ´Data
WarehouseÏà¶ÔÓÚOLTPÓÐÖÁÉÙÒ»ÌìµÄʱ¼ä²îÒì¡£Õâ¸öʱ¼ä²îÒì¶ÔÓÚijЩʵʱÐÔÒªÇóºÜ¸ßµÄÒµÎñÀ´Ëµ£¬ÊÇÎÞ·¨½ÓÊܵġ£±ÈÈç£ºÒøÐп¨µÁË¢µÄ¼ì²é·þÎñ£¬ÊÇÐèÒª×öµ½Ãë¼¶±ð֪ͨ³Ö¿¨È˵ġ£ÊÔÏëÏ£¬Èç¹ûÄãµÄÒøÐп¨±»µÁË¢£¬Ò»ÌìÒÔºó²ÅÊÕµ½ÒøÐз¢¹ýÀ´µÄ¶ÌÐÅÌáÐÑ£¬»áÊǶàôÔã¸âµÄÌåÑé¡£
Êý¾Ý´¦ÀíÁ÷³ÌÈß³¤¸´ÔÓ£ºÊý¾ÝÊÇͨ¹ýETLÈÎÎñÀ´³éÈ¡¡¢ÇåÏ´ºÍ¼ÓÔØµ½Data WarehouseÖеġ£ÎªÁ˱£Ö¤Êý¾Ý·ÖÎö½á¹ûµÄÕýÈ·ÐÔ£¬ETL»¹±ØÐëÒª½â¾öһϵÁеÄÎÊÌâ¡£±ÈÈ磺OLTP±ä¸üÊý¾ÝµÄ²¶»ñ£¬²¢Í¬²½µ½Data
Warehouse;ÖÜÆÚÐԵĽøÐÐÊý¾ÝÈ«Á¿ºÍÔöÁ¿¸üÐÂÀ´È·±£OLTPºÍData WarehouseÖÐÊý¾ÝµÄÒ»ÖÂÐÔ¡£Õû¸öÊý¾ÝÁ÷Èß³¤£¬ÊµÏÖÂß¼Òì³£¸´ÔÓ¡£
³É±¾¹ý¸ß£ºÎªÁËʵÏÖ´«Í³µÄRDBMSÊý¾Ý·ÖÎö¹¦ÄÜ£¬±ØÐëÐÂÔöData Warehouse½ÇÉ«À´±£´æËùÓеÄOLTPÊý¾ÝÈßÓ࣬רÃÅÌṩ·ÖÎö·þÎñ¹¦ÄÜ¡£ÕâÊÆ±Ø»á¼Ó´óÁËÓ²¼þ¡¢Èí¼þºÍά»¤³É±¾Í¶Èë;ËæÖ®»¹»áµ½À´ETLÈÎÎñ×öÊý¾Ýץȡ¡¢ÇåÏ´¡¢×ª»»ºÍ¼ÓÔØµÄ¿ª·¢³É±¾ºÍʱ¼ä³É±¾Í¶Èë¡£
ÄÇô£¬SQL ServerÓÐûÓÐÒ»ÖÖ¼¼Êõ¼ÈÄܽâ¾öÒÔÉÏËùÓÐÍ´µãµÄ·½·¨£¬ÓÖÄÜʵÏÖÊý¾Ýʵʱ·ÖÎöÄØ?µ±È»ÓУ¬ÄǾÍÊÇSQL
Server 2016Áд洢¼¼Êõ¡£
SQL Server 2016Áд洢¼¼Êõ×öʵʱ·ÖÎö
ΪÁ˽â¾öOLAP³¡¾°µÄ²éѯ·ÖÎö£¬Î¢Èí´ÓSQL Server 2012¿ªÊ¼ÒýÈëÁд洢¼¼Êõ£¬´ó´óÌá¸ßÁËOLAP²éѯµÄÐÔÄÜ;SQL
Server 2014½â¾öÁËÁд洢±íÖ»¶ÁµÄÎÊÌ⣬ʹÓó¡¾°´ó´óÍØ¿í;¶øSQL Server 2016µÄÁд洢¼¼Êõ³¹µ×½â¾öÁËʵʱÊý¾Ý·ÖÎöµÄÒµÎñ³¡¾°¡£Óû§Ö»ÐèÒª×ö·Ç³£Ð¡¹æÄ£µÄÐ޸쬱ã¿ÉÒÔ¿ÉÒԷdz£Æ½»¬µÄʹÓÃSQL
Server 2016µÄÁд洢¼¼ÊõÀ´½â¾öʵʱÊý¾Ý·ÖÎöµÄÒµÎñ³¡¾°¡£ÕâÒ»½ÚÌÖÂÛÒÔϼ¸¸ö·½Ã棺
SQL Server 2016Êý¾Ý·ÖÎö¼Ü¹¹
Disk-based Tables with Nonclustered Columnstore Index
Memory-based Tables with Columnstore Index
Minimizing impacts of OLTP
SQL Server 2016Êý¾Ý·ÖÎö¼Ü¹¹
SQL Server 2016Êý¾Ý·ÖÎö¼Ü¹¹Ïà¶ÔÓÚ´«Í³µÄRDBMSÊý¾Ý·ÖÎö¼Ü¹¹ÓÐÁ˷dz£´óµÄ¸Ä½ø£¬±äµÃ¸ü¼Ó¼òµ¥¡£¾ßÌåÌåÏÖÔÚOLAPÖ±½Ó½ÓÈëOLTPÊý¾ÝÔ´£¬Èç´Ë¾ÍÎÞÐèData
Warehouse½ÇÉ«ºÍETLÈÎÎñÕâ¸ö¡°°áÔ˹¤¡±ÁË¡£
OLAPÖ±½Ó½ÓÈëOLTPÊý¾ÝÔ´£ºÈÃOLAP±¨±íÊý¾ÝÔ´Ö±½Ó½ÓÈëOLTPµÄÊý¾ÝÔ´Í·ÉÏ¡£SQL Server»á×Ô¶¯Ñ¡ÔñºÏÊʵÄÁд洢Ë÷ÒýÀ´Ìá¸ßÊý¾Ý·ÖÎö²éѯµÄÐÔÄÜ£¬ÊµÏÖʵʱÊý¾Ý·ÖÎöµÄ³¡¾°¡£
²»ÔÙÐèÒªETLÈÎÎñ£ºÓÉÓÚOLAPÊý¾ÝÔ´Ö±½Ó½ÓÈëOLTPµÄÊý¾Ý£¬Ã»ÓÐÁËData Warehouse½ÇÉ«£¬ËùÒÔ²»ÔÙÐèÒªETLÈÎÎñ£¬´Ó¶ø´ó´ó¼ò»¯ÁËÊý¾Ý´¦ÀíÁ÷³ÌÖеĸ÷»·½Ú£¬Ã»ÓÐÁËÏàÓ¦µÄ¿ª·¢Î¬»¤ºÍʱ¼ä³É±¾¡£
SQL Server 2016ʵʱ·ÖÎö¼Ü¹¹Í¼£¬Õ¹Ê¾ÈçÏÂ(ͼƬÀ´×Ô΢ÈíÅàѵ½Ì³Ì)£º

SQL Server 2016Ö®ËùÒÔÄܹ»ÊµÏÖÈç´Ë¼ò»¯µÄʵʱ·ÖÎö£¬µ×ÆøÊÇÀ´Ô´ÓÚSQL Server 2016µÄÁд洢¼¼Êõ£¬ÎÒÃÇ¿ÉÒÔ½¨Á¢»ùÓÚ´ÅÅÌ´æ´¢»òÕß»ùÓÚÄÚ´æ´æ´¢µÄÁд洢±íÀ´½øÐÐʵʱÊý¾Ý·ÖÎö¡£
Disk-based Tables with Nonclustered Columnstore Index
ʹÓÃSQL Server 2016Áд洢Ë÷ÒýʵÏÖʵʱ·ÖÎöµÄµÚÒ»ÖÖ·½·¨ÊÇΪ±í½¨Á¢·Ç¾Û¼¯Áд洢Ë÷Òý¡£ÔÚSQL
Server 2012°æ±¾ÖУ¬½öÖ§³Ö·Ç¾Û¼¯Áд洢Ë÷Òý£¬²¢ÇÒ±í»á³ÉΪֻ¶Á£¬¶øÎÞ·¨¸üÐÂ;ÔÚSQL Server
2014°æ±¾ÖУ¬Ö§³Ö¾Û¼¯Áд洢Ë÷Òý±í£¬ÇÒÊý¾Ý¿É¸üÐÂ;µ«ÊǷǾۼ¯Áд洢Ë÷Òý±í»¹ÊÇÖ»¶Á;¶øÔÚSQL Server
2016ÖУ¬Íêȫ֧³Ö·Ç¾Û¼¯Áд洢Ë÷ÒýºÍ¾Û¼¯Áд洢Ë÷Òý£¬²¢ÇÒ±í¿É¸üС£ËùÒÔ£¬ÔÚSQL Server 2016°æ±¾ÖУ¬ÎÒÃÇÍêÈ«¿ÉÒÔ½¨Á¢·Ç¾Û¼¯Áд洢Ë÷ÒýÀ´ÊµÏÖOLAPµÄ²éѯ³¡¾°¡£´´½¨·½·¨Ê¾ÀýÈçÏ£º
DROP TABLE IF
EXISTS dbo.SalesOrder;
GO
CREATE TABLE dbo.SalesOrder
(
OrderID BIGINT IDENTITY(1,1) NOT NULL
,AutoID INT NOT NULL
,UserID INT NOT NULL
,OrderQty INT NOT NULL
,Price DECIMAL(8,2) NOT NULL
,OrderDate DATETIME NOT NULL
,OrderStatus SMALLINT NOT NULL
CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED
(OrderID)
) ;
GO
--Create the columnstore index with a filtered
condition
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_SalesOrder
ON dbo.SalesOrder (OrderID, AutoID, UserID, OrderQty,
Price, OrderDate, OrderStatus)
;
GO |
ÔÚÕâ¸öʵÀýÖУ¬ÎÒÃÇ´´½¨ÁËSalesOrder±í£¬²¢ÇÒΪ¸Ã±í´´½¨Á˷Ǿۼ¯Áд洢Ë÷Òý£¬µ±½øÐÐOLAP²éѯ·ÖÎöµÄʱºò£¬SQL
Server»áÖ±½Ó´Ó¸ÃÁд洢Ë÷ÒýÖжÁÈ¡Êý¾Ý¡£
Memory-based Tables with Columnstore Index
SQL Server 2014°æ±¾ÒýÈëÁËIn-Memory OLTP£¬ÓÖ»òÕß½Ð×ÅHekaton£¬ÖÐÎijÆÖ®ÎªÄÚ´æÓÅ»¯±í£¬ÄÚ´æÓÅ»¯±íÍêÈ«ÊÇLock
Free¡¢Latch FreeµÄ£¬¿ÉÒÔ×î´óÏ޶ȵÄÔö¼Ó²¢·¢ºÍÌá¸ßÏìӦʱ¼ä¡£¶øÔÚSQL Server 2016ÖУ¬Èç¹ûÄãµÄ·þÎñÆ÷ÄÚ´æ×ã¹»´óµÄ»°£¬ÎÒÃÇÍêÈ«¿ÉÒÔ½¨Á¢»ùÓÚÄÚ´æÓÅ»¯±íµÄÁд洢Ë÷Òý£¬ÕâÑùµÄ±íÊý¾Ý»á°´Áд洢ÔÚÄÚ´æÖУ¬³ä·ÖÀûÓÃÁ½ÕßµÄÓÅÊÆ£¬×î´ó³Ì¶ÈµÄÌá¸ß²éѯ²éѯЧÂÊ£¬½µµÍÊý¾Ý¿âÏìӦʱ¼ä¡£´´½¨·½·¨ÊµÀýÈçÏ£º
DROP TABLE IF
EXISTS dbo.SalesOrder;
GO
CREATE TABLE dbo.SalesOrder
(
OrderID BIGINT IDENTITY(1,1) NOT NULL
,AutoID INT NOT NULL
,UserID INT NOT NULL
,OrderQty INT NOT NULL
,Price DECIMAL(8,2) NOT NULL
,OrderDate DATETIME NOT NULL
,OrderStatus SMALLINT NOT NULL
CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED
HASH (OrderID) WITH (BUCKET_COUNT = 10000000)
) WITH(MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA)
;
GO
ALTER TABLE dbo.SalesOrder
ADD INDEX CCSI_SalesOrder CLUSTERED COLUMNSTORE
;
GO |
ÔÚÕâ¸öʵÀýÖУ¬ÎÒÃÇ´´½¨ÁË»ùÓÚÄÚ´æµÄÓÅ»¯±íSalesOrder£¬³Ö¾Ã»¯·½°¸Îª±í½á¹¹ºÍÊý¾Ý;È»ºóÔÚÕâ¸öÄÚ´æ±íÉϽ¨Á¢¾Û¼¯Áд洢Ë÷Òý¡£µ±OLAP²éѯ·ÖÎöÖ´ÐеÄʱºò£¬SQL
Server¿ÉÒÔÖ±½Ó´Ó»ùÓÚÄÚ´æµÄÁд洢Ë÷ÒýÖлñÈ¡Êý¾Ý£¬´ó´óÌá¸ß²éѯ·ÖÎöµÄÄÜÁ¦¡£
Minimizing impacts of OLTP
¿¼Âǵ½OLTPÊý¾ÝÔ´µÄ¸ß²¢·¢£¬µÍÑÓ³ÙÒªÇóµÄÌØÐÔ£¬ÔÚijЩ·Ç³£¸ß²¢·¢ÊÂÎñ³¡¾°ÖУ¬ÎÒÃÇ¿ÉÒÔ²ÉÓÃÒÔÏ·½·¨×î´óÏ޶ȼõÉÙ¶ÔOLTPµÄÓ°Ï죺
Filtered NCCI + Clustered B-Tree Index
Compress Delay
Offloading OLAP to AlwaysOn Readable Secondary
Filtered NCCI + Clustered B-Tree Index
´ø¹ýÂËÌõ¼þµÄË÷ÒýÔÚSQL Server²úÆ·Öв¢²»ÊÇʲôȫеĸÅÄÔÚSQL Server 2008¼°ÒÔºóµÄ²úÆ·°æ±¾ÖУ¬¾ùÖ§³Ö´´½¨¹ýÂËË÷Òý£¬ÕâÏî¼¼ÊõÔÊÐíÓû§´´½¨´æÔÚ¹ýÂËÌõ¼þµÄË÷Òý£¬ÒÔ¼ÓËÙÌØ¶¨Ìõ¼þµÄ²éѯÓï¾äʹÓùýÂËË÷Òý¡£¶øÔÚSQL
Server 2016ÖÐÖ§³Ö´æÔÚ¹ýÂËÌõ¼þµÄÁд洢Ë÷Òý£¬ÎÒÃÇ¿ÉÒÔʹÓÃÕâÏî¼¼ÊõÀ´Çø·ÖÊý¾ÝµÄÀäÈȳ̶È(Êý¾ÝÀäÈȳ̶ÈÊÇÖ¸Êý¾ÝµÄÐÞ¸ÄÆµÂÊ;ÀäÊý¾ÝÊÇÖ¸¼¸ºõ»òÕߺÜÉÙ±»Ð޸ĵÄÊý¾Ý;ÈÈÊý¾ÝÊÇÖ¸¾³£»á±»Ð޸ĵÄÊý¾Ý¡£±ÈÈçÔÚ¶©µ¥³¡¾°ÖУ¬¶©µ¥´ÓÉú³É״̬µ½¿Í»§ÊÕµ½»õÎïÖ®¼äµÄ״̬£¬»á±»¾³£¸üУ¬ÊôÓÚÈÈÊý¾Ý;¶ø¿ÍÈËÒ»µ©ÊÕµ½»õÎ¶©µ¥ÐÅÏ¢¼¸ºõ²»»á±»ÐÞ¸ÄÁË£¬¾ÍÊôÓÚÀäÊý¾Ý)¡£ÀûÓùýÂËÁд洢Ë÷ÒýÀ´Çø·ÖÀäÈÈÊý¾ÝµÄ¼¼Êõ£¬ÊÇʹÓþۼ¯B-TreeË÷ÒýÀ´´æ·ÅÈÈÊý¾Ý£¬Ê¹ÓùýÂ˷Ǿۼ¯Áд洢Ë÷ÒýÀ´´æ·ÅÀäÊý¾Ý£¬ÕâÑùSQL
Server 2016µÄÓÅ»¯Æ÷¿ÉÒԷdz£ÖÇÄܵĴӷǾۼ¯Áд洢Ë÷ÒýÖлñÈ¡ÀäÊý¾Ý£¬´Ó¾Û¼¯B-TreeË÷ÒýÖлñÈ¡ÈÈÊý¾Ý£¬ÕâÑùʹµÃOLAP²Ù×÷ÓëOLTPÊÂÎñ²Ù×÷Âß¼¸ôÀ뿪À´£¬×îÖÕOLAP×î´óÏ޶ȵļõÉÙ¶ÔOLTPµÄÓ°Ïì¡£
ÏÂͼֱ¹ÛµÄ±íʾÁËFiltered NCCI + Clustered B-Tree IndexµÄ½á¹¹Í¼(ͼƬÀ´×Ô΢ÈíÅàѵ½Ì³Ì)£º

ʵÏÖ·½·¨²Î¼ûÒÔÏ´úÂ룺
-- create demo
table SalesOrder
DROP TABLE IF EXISTS dbo.SalesOrder;
GO
CREATE TABLE dbo.SalesOrder
(
OrderID BIGINT IDENTITY(1,1) NOT NULL
,AutoID INT NOT NULL
,UserID INT NOT NULL
,OrderQty INT NOT NULL
,Price DECIMAL(8,2) NOT NULL
,OrderDate DATETIME NOT NULL
,OrderStatus SMALLINT NOT NULL
CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED
(OrderID)
) ;
GO
/*
¡ª OrderStatus Description
¡ª 0 => ¡®Placed¡¯
¡ª 1 => ¡®Closed¡¯
¡ª 2 => ¡®Paid¡¯
¡ª 3 => ¡®Pending¡¯
¡ª 4 => ¡®Shipped¡¯
¡ª 5 => ¡®Received¡¯
*/
CREATE CLUSTERED INDEX CI_SalesOrder
ON dbo.SalesOrder(OrderStatus)
;
GO
--Create the columnstore index with a filtered
condition
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_SalesOrder
ON dbo.SalesOrder (AutoID, Price, OrderQty, orderstatus)
WHERE orderstatus = 5
;
GO |
ÔÚÕâ¸öʵÀýÖУ¬ÎÒÃÇ´´½¨ÁËSalesOrder±í£¬²¢ÔÚOrderStatus×Ö¶ÎÉϽ¨Á¢ÁËClustered
B-Tree½á¹¹µÄË÷ÒýCI_SalesOrder£¬È»ºóÔÙ½¨Á¢ÁË´ø¹ýÂËÌõ¼þµÄ·Ç¾Û¼¯Áд洢Ë÷ÒýNCCI_SalesOrder¡£µ±¿ÍÈË»¹Î´ÊÕµ½»õÎïµÄ¶©µ¥£¬»á´¦ÓÚÇ°ÃæÎåÖÐ״̬£¬ÊôÓÚÐèÒª¾³£¸üеÄÈÈÊý¾Ý£¬SQL
Server²éѯ»á¸ù¾ÝClustered B-TreeË÷ÒýCI_SalesOrderÀ´²éѯÊý¾Ý;¿ÍÈËÒѾÊÕ»õµÄ¶©µ¥£¬´¦ÓÚµÚÁùÖÖ״̬£¬ÊôÓÚÀäÊý¾Ý£¬SQL
Server²éѯÀäÊý¾Ý»áÖ±½Ó´Ó·Ç¾Û¼¯Áд洢Ë÷ÒýÖлñÈ¡Êý¾Ý¡£´Ó¶ø×î´óÏ޶ȼõÉÙ¶ÔOLTPÓ°ÏìµÄͬʱ£¬Ìá¸ß²éѯЧÂÊ¡£
Compress Delay
Èç¹û°´ÕÕÒµÎñÂß¼²ãÃæºÜÄÑÃ÷È·»®·Ö³öÊý¾ÝµÄÀäÈȳ̶ȣ¬Ò²¾ÍÊÇ˵ºÜÄÑ´Ó¹ýÂËÌõ¼þÀ´Âß¼Çø·ÖÊý¾ÝµÄÀäÈÈ¡£ÕâÖÖÇé¿öÏ£¬ÎÒÃÇ¿ÉÒÔʹÓÃÑÓ³ÙѹËõ(Compress
Delay)¼¼Êõ´Óʱ¼ä²ãÃæÀ´Çø·ÖÀäÈÈÊý¾Ý¡£±ÈÈ磺ÎÒÃǶ¨Ò峬¹ý60·ÖÖÓµÄÊý¾ÝΪÀäÊý¾Ý£¬60·ÖÖÓÒÔÄÚµÄÊý¾ÝΪÈÈÊý¾Ý£¬ÄÇôÎÒÃÇ¿ÉÒÔÔÚ´´½¨Áд洢Ë÷ÒýµÄʱºòÌí¼ÓWITHÑ¡ÏîCOMPRESSION_DELAY
= 60 Minutes¡£µ±Êý¾Ý²úÉú³¬¹ý60·ÖÖÓÒÔºó£¬Êý¾Ý»á±»Ñ¹Ëõ´æ·Åµ½Áд洢Ë÷ÒýÖÐ(ÀäÊý¾Ý)£¬60·ÖÖÓÒÔÄÚµÄÊý¾Ý»áפÁôÔÚDelta
StoreµÄB-Tree½á¹¹ÖУ¬ÕâÖÖÑÓ³ÙѹËõµÄ¼¼Êõ²»µ«Äܹ»´ïµ½¸ôÀëOLAP¶ÔOLTP×÷Ó㬻¹ÄÜ×î´óÏ޶ȵļõÉÙÁд洢Ë÷ÒýË鯬µÄ²úÉú¡£
ʵÏÖ·½·¨²Î¼ûÒÔÏÂÀý×Ó£º
-- create demo
table SalesOrder
DROP TABLE IF EXISTS dbo.SalesOrder;
GO
CREATE TABLE dbo.SalesOrder
(
OrderID BIGINT IDENTITY(1,1) NOT NULL
,AutoID INT NOT NULL
,UserID INT NOT NULL
,OrderQty INT NOT NULL
,Price DECIMAL(8,2) NOT NULL
,OrderDate DATETIME NOT NULL
,OrderStatus SMALLINT NOT NULL
CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED
(OrderID)
) ;
GO
--Create the columnstore index with a filtered
condition
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_SalesOrder
ON dbo.SalesOrder (AutoID, Price, OrderQty, orderstatus)
WITH(COMPRESSION_DELAY = 60 MINUTES)
;
GO
SELECT name
,type_desc
,compression_delay
FROM sys.indexes
WHERE object_id = object_id('SalesOrder')
AND name = 'NCCI_SalesOrder'
; |
¼ì²éË÷ÒýÐÅÏ¢½ØÍ¼ÈçÏ£º

Offloading OLAP to AlwaysOn Readable Secondary
ÁíÍâÒ»ÖÖ¼õÉÙOLAP¶ÔOLTPÓ°ÏìµÄ·½·¨ÊÇÀûÓÃAlwaysOnÖ»¶Á¸±±¾£¬ÕâÖÖÇé¿ö£¬¿ÉÒÔ½«OLAPÊý¾ÝÔ´´ÓOLTP°þÀë³öÀ´£¬½ÓÈëµ½AlwaysOnµÄÖ»¶Á¸±±¾ÉÏ¡£AlwaysOnµÄÖ÷¸±±¾¸ºÔðÊÂÎñ´¦Àí£¬Ö»¶Á¸±±¾¿ÉÒÔ×÷ΪOLAPµÄÊý¾Ý·ÖÎöÔ´£¬ÕâÑùʵÏÖÁËOLAPÓëOLTPµÄÎïÀí¸ôÀ룬½«Ó°Ïì¼õµ½×îµÍ¡£¼Ü¹¹Í¼ÈçÏÂËùʾ(ͼƬÀ´×Ô΢ÈíÅàѵ½Ì³Ì)£º

Ò»¸öʵ¼ÊÀý×Ó
ÔÚ¶©µ¥ÏµÍ³³¡¾°ÖУ¬Óû§ÊÕµ½»õÎï¹ý³Ì£¬Ã¿¸ö¶©µ¥»á¾Àú6ÖÐ״̬£¬¼ÙÉèΪPlaced¡¢Canceled¡¢Paid¡¢Pending¡¢ShippedºÍReceived¡£ÔÚÇ°Ãæ5ÖÐ״̬µÄ¶©µ¥£¬»á±»¾³£Ð޸쬱ÈÈ磺´ò°ü¶©µ¥£¬³ö¿â£¬¸üпìµÝÐÅÏ¢µÈ£¬Õⲿ·Ö¾³£±»Ð޸ĵÄÊý¾Ý³ÆÎªÈÈÊý¾Ý;¶ø¶©µ¥Ò»µ©±»¿ÍÈ˽ÓÊÜÒԺ󣬶©µ¥Êý¾Ý¾Í¼¸ºõ²»»á±»Ð޸ģ¬Õⲿ·ÖÊý¾Ý³ÆÎªÀäÊý¾Ý¡£Õâ¸öÀý×Ó¾ÍÊÇʹÓÃSQL
Server 2016 Filtered NCCI + Clustered B-TreeË÷ÒýµÄ·½Ê½À´Âß¼»®·Ö³öÊý¾ÝµÄÀäÈȳ̶ȣ¬SQL
ServerÔÚ²éѯ¹ý³ÌÖУ¬»á´Ó·Ç¾Û¼¯Áд洢Ë÷ÒýÖÐÈ¡ÀäÊý¾Ý£¬´ÓB-TreeË÷ÒýÖÐÈ¡ÈÈÊý¾Ý£¬×î´óÏÞ¶ÈÌá¸ßOLAP²éѯЧÂÊ£¬¼õÉÙ¶ÔOLTPµÄÓ°Ïì¡£
¾ßÌ彨±í´úÂëʵÏÖÈçÏ£º
-- create demo
table SalesOrder
DROP TABLE IF EXISTS dbo.SalesOrder;
GO
CREATE TABLE dbo.SalesOrder
(
OrderID BIGINT IDENTITY(1,1) NOT NULL
,AutoID INT NOT NULL
,UserID INT NOT NULL
,OrderQty INT NOT NULL
,Price DECIMAL(8,2) NOT NULL
,OrderDate DATETIME NOT NULL
,OrderStatus SMALLINT NOT NULL
CONSTRAINT PK_SalesOrder PRIMARY KEY NONCLUSTERED
(OrderID)
) ;
GO
/*
¡ª OrderStatus Description
¡ª 0 => ¡®Placed¡¯
¡ª 1 => ¡®Closed¡¯
¡ª 2 => ¡®Paid¡¯
¡ª 3 => ¡®Pending¡¯
¡ª 4 => ¡®Shipped¡¯
¡ª 5 => ¡®Received¡¯
*/
CREATE CLUSTERED INDEX CI_SalesOrder
ON dbo.SalesOrder(OrderStatus)
;
GO
--Create the columnstore index with a filtered
condition
CREATE NONCLUSTERED COLUMNSTORE INDEX NCCI_SalesOrder
ON dbo.SalesOrder (AutoID, Price, OrderQty, orderstatus)
WHERE orderstatus = 5
;
GO |
ΪÁËÄܹ»Ö±¹ÛµÄ¿´µ½ÀûÓÃSQL Server 2016Áд洢Ë÷ÒýʵÏÖʵʱ·ÖÎöµÄЧ¹û£¬ÎÒÐéÄâÁËÒ»¸öÍøÂçÆû³µÏúÊÛ¶©µ¥ÏµÍ³£¬Ê¹ÓÃNodeJs
+ SQL Server 2016 Columnstore Index + Socket.IOÀ´ÊµÏÖʵʱ¶©µ¥ÏúÁ¿ºÍÏúÊÛÊÕÈëµÄ·ÖÎöÒ³Ãæ¡£
×ܽá
ÕâÆªÎÄÕ½²½âÀûÓÃSQL Server 2016Áд洢Ë÷Òý¼¼ÊõʵÏÖÊý¾Ýʵʱ·ÖÎöµÄÁ½ÖÖ·½·¨£¬ÒÔ½â¾ö´«Í³RDBMSÊý¾Ý·ÖÎöµÄ¸ßÑÓ³Ù¡¢¸ß³É±¾µÄÍ´µã¡£µÚÒ»ÖÖ·½·¨ÊÇHekaton
+ Clustered Columnstore Index;µÚ¶þÖÖ·½·¨ÊÇFiltered Nonclustered
Columnstore Index + Clustered B-Tree¡£±¾ÎIJ¢ÒÔ´ËÀíÂÛΪ»ù´¡£¬Õ¹Ê¾ÁËÒ»¸öÍøÂçÆû³µÔÚÏßÏúÊÛϵͳµÄʵʱ¶©µ¥·ÖÎöÒ³Ãæ¡£ |