±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚinfoq£¬½éÉÜÁËʹÓÃAppache
Arrow½øÐÐÏòÁ¿»¯¶ÓÁд¦Àí£¬DremioϵͳÖеÄArrow²éѯ´¦ÀíµÈ¡£ |
|
񻵋
ÁÐʽÊý¾Ý¿âÓÐÖúÓÚ¼õÉÙÁª»ú·ÖÎö´¦Àí(OLAP)µÄ¸ºÔØ£¬ÒòΪ²éѯ»áÉæ¼°µ½ÁеÄÒ»¸ö×Ó¼¯£¬µ«ÕâЩÁж¼ÓдóÁ¿µÄÐÐÊý¡£
ÁÐʽ´æ´¢¸ñʽʹÎÒÃÇ¿ÉÒÔ²ÉÓÃһЩ»ùÓÚÿÁеÄÇáÁ¿¼¶Ñ¹ËõËã·¨£¨lightweight compression
algorithms£© ¡£
ÏòÁ¿»¯µÄÊý¾Ý´¦Àíͨ¹ýÓÐЧʹÓÃCPU»º³å»úÖÆµÄ·½·¨£¬À´¿ª·¢¸ü¿ìËٵķÖÎö²éѯÒýÇæ¡£
ArrowµÄÁÐʽÊý¾Ý½á¹¹ÔÊÐíʹÓÃÇáÁ¿¼¶·½°¸£¬Èç×Öµä±àÂ루dictionary encoding£©¡¢Î»Ñ¹Ëõ£¨bit
packing £©£¬»òÊÇÔËÐг¤¶È±àÂ루run length£©£¬ÕâÑùÔÚѹËõ±ÈÀýÒ»¶¨Ê±£¬¿ÉÒÔÌá¸ß²éѯÐÔÄÜ¡£
ÁÐʽÊý¾Ý¿â×éÖ¯´ÅÅÌ»òÄÚ´æÖиø¶¨µÄÁ¬ÐøÁÐÊý¾Ý¡£»ùÓÚÁеĴ洢·½Ê½£¬ÓÐÖúÓÚ¼õÉÙÁª»ú·ÖÎö´¦Àí(OLAP)µÄ¸ºÔØ£¬ÒòΪ²éѯ»áÉæ¼°µ½ÁеÄÒ»¸ö×Ó¼¯£¬µ«ÕâЩÁж¼ÓдóÁ¿µÄÐÐÊý¡£¶ÔÓÚÕâÀà²éѯ£¬Ê¹ÓÃÁÐÊý¾Ý¸ñʽ¿ÉÒÔ´ó´ó¼õÉÙ´Ó´ÅÅ̵½ÄÚ´æºÍ´ÓÄÚ´æµ½¼Ä´æÆ÷µÄÊý¾Ýת»»¡£ÕâÑù¿ÉÒÔÓÐЧµØÌá¸ßÕû¸ö´æ´¢ÌåϵµÄÍÌÍÂÁ¿¡£¶øÇÒ£¬ÁÐʽ¸ñʽÈÃÎÒÃÇ¿ÉÒÔʹÓÃһЩ»ùÓÚÿÁеÄÇáÁ¿¼¶Ñ¹ËõËã·¨¡£ÕâÖÖÇé¿öÏ£¬Ñ¹ËõËã·¨ÐÔÄÜ»á¸üºÃ£¬ÒòΪѹËõÒýÇæµÄÊäÈëÊý¾ÝÊÇͬһÀàÐÍÊý¾Ý£¬Äܹ»Ñ¹ËõµÄ¸üºÃ¸ü¿ì¡£
ÏòÁ¿»¯´¦Àí×ÔMonerDB-X100£¨Vectorwise£©ÏµÍ³¿ªÊ¼Á÷ÐУ¬ÏÖÔÚÒѳÉΪÔÚÏÖ´úÓ²¼þÌõ¼þϹ¹½¨¸ßЧ·ÖÎö²éѯÒýÇæ£¬½ø¶ø¼ÓËÙÊý¾Ý´¦ÀíµÄ±ê×¼¡£ÕâÖÖģʽÐèÒª°´ÁбíʾµÄÊý¾ÝÀ´±àд¸ßЧÓÅ»¯µÄ²éѯ´¦ÀíËã·¨¡£ÏòÁ¿»¯µÄ¹ý³ÌºÍ´«Í³µÄ»ùÓÚÔª×éµÄ²éѯ¹ý³ÌģʽÓÐ×ÅÏÔÖøÇø±ð¡£
Á½ÖÖ·½·¨×îÖ÷ÒªµÄ²»Í¬ÊÇ£¬Ç°ÕßÊÇ»ùÓÚÁжø²»ÊÇ»ùÓÚÐÐ/Ôª×éÀ´ÖØÐ´²éѯ´¦ÀíËã·¨¡£Á¬Ðø´æ´¢µÄÒ»ÁÐÊý¾Ý£¬ÔÚÄÚ´æÖпÉÒÔ±íʾΪһ¸öÏòÁ¿£¬Õâ¸öÏòÁ¿°üº¬Á˸ÃÁÐÖй̶¨ÊýÄ¿µÄһЩֵ¡£
ÏòÁ¿Ä£Ê½ºÍ´«Í³Ä£Ê½µÄµÚ¶þ¸ö²»Í¬ÊÇ£¬ÎÒÃÇ¿ÉÒÔÌí¼ÓÒ»¸ö¿é£¬¶ø²»ÊÇÔÚ²éѯ¼Æ»®Ê÷¶¥²¿Ò»´ÎÌí¼ÓÒ»¸öÔª×é¡£Ò»¸ö¿éÓɹ̶¨µÄÒ»×éÔª×飨¼Ç¼£©×é³É£¬Ëü´ú±íÒ»×éÏòÁ¿£¬ÕâЩÏòÁ¿ºÍÁÐ/×Ö¶ÎÓÐÒ»Ò»¶ÔÓ¦µÄ¹ØÏµ¡£ÏòÁ¿¿éÊÇÊý¾ÝµÄ»ù±¾µ¥Ôª£¬Ëü¾ÓÉÖ´Ðмƻ®Ê÷£¬´ÓÒ»¸ö²Ù×÷·ûÁ÷ÏòÁíÒ»¸ö²Ù×÷·û¡£

ͼ1£º´«Í³µÄÒ»´ÎÌí¼ÓÒ»¸öÔª×éµÄ´¦ÀíºÍÏòÁ¿»¯´¦Àí±È½Ï
ÔÚͼ1ÖУ¬×ó²àͼΪ´«Í³µÄÒ»´Î²Ù×÷Ò»¸öÔª×éµÄ´¦ÀíÁ÷³Ì¡£É¨ÃèÔËËã·û¿ªÊ¼»ñÈ¡ÊäÈëÊý¾Ý£¬²¢Í¨¹ý¹ýÂËÔËËã·û¿ªÊ¼Íƶ¯Ôª×éµÄ´¦Àí¡£½ÓÏÂÀ´£¬¹ýÂËÔËËã·û´«µÝ·ûºÏÌõ¼þµÄÔª×éµ½¾ÛºÏÔËËã·û¡£ÔËËã·û²»Í£µ÷Óòéѯ¼Æ»®Ê÷ϲãµÄÏÂÒ»¸öÔËËã·û¡£Æä½á¹û¾ÍÊÇλÓÚÊ÷ϲãµÄÔËËã·û°ÑÔª×éÍÆÏòλÓÚÊ÷¶¥µÄÔËËã·û¡£Õâ¾ÍÊDzéѯµÄÖ´Ðйý³Ì¡£
ÏÖÔÚ£¬ÓÉÓÚÓдóÁ¿µÄº¯Êýµ÷Óã¬ÇÒÿ´Îº¯Êýµ÷ÓÃʱ´ÓÒ»¸öÔËËã·ûµ½ÁíÒ»¸öÔËËã·ûÐèÒª´¦Àí»ò´«ÊäµÄÊý¾Ý²»¶à£¬ÔÚÕâ¸öÖ´Ðйý³ÌÖУ¬ÐÔÄÜ¿ªÏúºÜ´ó¡£Æä´Î£¬µ±½öÐèÒª´¦ÀíÔª×éÀïÁеÄÒ»¸ö×Ó¼¯Ê±£¬ÐèÒª´«µÝÕû¸öÔª×é¡£
ÓÒ²àµÄΪһ¸öÏòÁ¿Ä£ÐÍ£¬Íù¸ÃÄ£ÐÍÖÐÌí¼ÓÒ»¸öÏòÁ¿¿é£¬Ã¿¸öÏòÁ¿ÓÐÒ»×é¼Ç¼»òÁÐÖµ¡£ÔÚÕâ¸öÊý¾Ý¼¯ºÏÖУ¬ÓжàÉÙÁУ¬¾ÍÓжàÉÙÏòÁ¿¡£²»¶ÏÍù²éѯ¼Æ»®Ê÷ÉÏÃæÑ¹ÈëÒ»ÅúÏòÁ¿£¬ËüÃǾÍÊDzéѯ¼Æ»®Öв»Í¬²Ù×÷·ûµÄÊäÈëÓëÊä³ö¡£ÕâÖÖ·½·¨Ô¶±ÈÆäËü·½·¨ÓÐЧ£¬ÒòΪÕâÖÖ·½·¨ÔÚ²»Í¬µÄ²Ù×÷·û¼äƽ̯Á˺¯Êýµ÷ÓõĿªÏú£¬Æä´Î£¬²Ù×÷»ùÓÚÁжø²»ÔÙ»ùÓÚÐлòÔª×é¡£
ÏòÁ¿»¯µÄ´úÂë¿ÉÒÔ³ä·ÖÀûÓÃCPUµÄ»º´æ¡£ÀýÈ磬ÓÐ10ÁеÄÒ»ÐÐÊý¾ÝºÍÖ»Ðè²Ù×÷Ò»ÁеIJéѯ¼Æ»®¡£ÔÚ»ùÓÚÐеIJéѯ´¦ÀíģʽÖУ¬9ÁÐÊý¾Ý»á²»±ØÒªµÄÕ¼Óûº´æ£¬ÏÞÖÆÁË¿ÉÒÔ½øÈ뻺´æµÄÊý¾ÝÊýÁ¿¡£ÔÚ»ùÓÚÁеĴ¦ÀíÖУ¬Ö»»á¶ÁÈë¸ÐÐËȤµÄÁÐÊý¾Ý£¬ÕâÑù¿ÉÒÔÒ»Æð´¦Àí¸ü¶àµÄÖµ£¬Í¬Ê±ÓÐЧʹÓÃÁËCPUµÄÄÚ´æ´ø¿í¡£
ÏòÁ¿´¦Àí±³ºóµÄÖ÷Ҫ˼ÏëÊÇ£¬°´ÁУ¨»òÁÐʽÊý¾ÝÊý¾Ý£©¹¤×÷£¬²¢°Ñ´Ó¶àÁе½Ôª×飨ÐУ©µÄʵ¼Êת»¯ÍƳٵ½²éѯ¼Æ»®µÄºÜ¿¿ºóµÄλÖýøÐд¦Àí£¬´ó²¿·ÖÇé¿öÊÇÐèҪչʾ½á¹û¸øÓû§Ê±¡£ÕâÕýÊÇΪʲô²éѯִÐÐË㷨ͨ³£»áÖØÐ´£¬À´×ö»ùÓÚÁеĴ¦Àí¡£Èç¹ûÎÒÃÇÒÔÁÐʽ·½Ê½´æ´¢Êý¾Ý£¬µ«ÊÇ´¦Àí´úÂëÊÇ»ùÓÚÐд¦Àí±àдµÄ£¬ÄÇôµ±¶Áµ½ÁÐʱ£¬¾Í²»µÃ²»×éºÏºÜ¶àÁеÄÊý¾ÝÀ´¹¹³ÉÒ»¸öÔª×飬²¢½«¸ÃÔª×é´«µÝ¸ø²éѯ²Ù×÷·ûÀ´½øÐд«Í³µÄÖðÐд¦Àí¡£Ö´Ðйý³ÌÖеÄÔª×é¹¹½¨³ÙÔç»áÓ°Ïì¶ÔÁÐʽÊý¾Ý½øÐи߶ÈÓÅ»¯µÄ²éѯ´¦Àí¡£
ÏÖ´ú´¦ÀíÆ÷ÓÐÀ©Õ¹µÄÖ¸Á£¬ÔÚµ¥¶ÀµÄÒ»¸öÖ¸ÁîÖУ¬¸ÃÖ¸Á¿ÉÒÔÀ©Õ¹ÏòÁ¿Ö´ÐиÅÄîµ½¶àÁеÄÖµ¡£µ¥Ö¸Áî¶àÊý¾ÝÁ÷£¨SIMD£©Ö¸ÁîÔÚ20ÊÀ¼Í90Äê´ú³ÉΪ×ÀÃæÔËËãÖ÷Á÷£¬Ìá¸ßÁ˶àýÌåÓ¦ÓÃÈçÓÎÏ·µÄÐÔÄÜ¡£
¶Ô¶à¸öÖµ×öÏàͬ¸Ä±ä£¬±ÈÈçµ÷ÕûÒ»¸öͼÏñµÄÁÁ¶Èʱ£¬SIMDÓÈÆäÓÐÓá£Ã¿¸öÏñËØµãµÄÁÁ¶ÈÓɺìÉ«£¨R£©£¬ÂÌÉ«£¨G£©ºÍÀ¶É«£¨B£©µÄֵȷ¶¨¡£¸Ä±äÁÁ¶È£¬Òª´ÓÄÚ´æ¶ÁÈ¡R£¬GºÍBµÄÖµ£¬²¢½øÐе÷Õû£¬µ÷ÕûºóµÄÖµÒªÖØÐ´»ØÄÚ´æ¡£²»Ê¹ÓÃSIMD£¬ÏñËØµÄRGBÖµ»áÒÀ´Îµ¥¸ö¶ÁÈëÄڴ档ʹÓÃSIMD£¬ÏñËØµÄRGBÊý¾Ý¿é¿ÉÒÔÔÚÒ»¸öÖ¸ÁîÖÐÒ»Æð½øÐд¦Àí¡£ÕâÑù¾Í¼«´óµØÌá¸ßÁËÓÐЧÐÔ¡£
ÕâЩ¸ÅÄîÔÚ·ÖÎöѧµÄÊý¾Ý´¦ÀíÖзdz£ÊÊÓá£SIMD²ÉÓúͲ¢·¢Î޹صÄÊý¾Ý¼¶²¢ÐС£SIMDÖ¸ÁîÔÊÐíÔÚͬһʱÖÓÖÜÆÚÄÚ£¬¶Ô²»Í¬µÄÁÐÊý¾ÝÖ´ÐÐÏàͬµÄÖ¸Áî,
ʵ¼ÊÉÏÖ´ÐÐÍÌÍÂÁ¿£¨throughput of execution£©¿ÉÒÔÌá¸ß4±¶»ò¸ü¶à¡£ÁÐʽÊý¾Ý¿ÉÒÔ×ñÑSIMD´¦Àí£¬ÕâÑù¿ÉÒÔ´æ´¢ÁÐÖµµ½ÄÚ´æÖеÄÓÐÐòÅÅÁÐÇÒ×Ö½Ú¶ÔÆëµÄÃܼ¯Êý×éÖУ¬ÕâЩÊý¾Ý»áÔØÈëµ½¹Ì¶¨¿í¶ÈµÄSIMD¼Ä´æÆ÷ÖС£ÏÖÔÚµÄIntel±àÒëÆ÷ÅäÖÃÁËAVX-512£¨¸ß¼¶Ê¸Á¿À©Õ¹£©Ö¸Á£¬¸ÃÖ¸ÁÔö¼ÓSIMD¼Ä´æÆ÷µÄ¿í¶Èµ½512±ÈÌØ¡£»»¶øÑÔÖ®£¬¿ÉÒÔ²¢ÐÐÔËËã16¸ö4×Ö½ÚµÄÕûÊýÁÐÖµ¡£ÆäËüµÄSIMDÖ¸Á»¹ÓÐSSE£¬SSE2£¬AVX£¬AVX2.
ҪʹÓÃÏòÁ¿´¦ÀíºÍSIMD£¬ºÜÖØÒªµÄÒ»µãÊÇÕýÈ·×éÖ¯Êý¾ÝÒÔ×î´ó»¯ÊÕÒæ¡£ÏÖÔÚÓÐÒ»ÖÖÄÚ´æ´¦ÀíµÄ¿ªÔ´¿ò¼Ü½ÐApache
Arrow¡£ArrowÈ·±£ÄÚ´æÖеÄÊý¾ÝÊÇÕýÈ·¶ÔÆëµÄ£¬ÕâÑùÄÜ×î´óÏ޶ȵØÀûÓÃÏòÁ¿»¯ºÍSIMDÖ¸ÁîµÄÓÅÊÆ¡£
Apache Arrow
ArrowÏîÄ¿ÊÇApacheÈí¼þ»ù½ð»á¶¥¼¶µÄ¿ªÔ´ÏîÄ¿¡£Arrow¶¨ÒåÁ˱ê×¼µÄ·½Ê½À´±íʾ¿ÉÓÐЧ´¦ÀíµÄÄÚ´æÊý¾Ý£¬Í¬Ê±Ö§³Ö¶àÖÖÁ÷Ðеıà³ÌÓïÑÔÖУ¬°üÀ¨Java£¬C++ºÍPython¡£
ArrowÏîÄ¿Á½Äê·¢·¢²¼£¬È¡µÃÁË¿ìËٵķ¢Õ¹¡£×Ô·¢²¼ºó£¬Ê®¶à¸öÖ÷ÒªµÄ¿ªÔ´ÏîÄ¿ÖеĿª·¢Õß¶¼ÎªArrowÉçÇø×ö³öÁ˹±Ïס£ArrowʹºÜ¶à²»Í¬ÀàÐ͵ÄÏîÄ¿¶¼ÄÜÊÜÒæ£¬²¢¼ò»¯Á˹ý³ÌÖ®¼äµÄÊý¾Ý½»»»¡£Ê¹ÓÃArrowµÄºÃ´¦·Ç³£ÏÔÖø¡£
ʹÓÃAppache Arrow½øÐÐÏòÁ¿»¯¶ÓÁд¦Àí
ArrowµÄÖ÷Òª¹Ø×¢µãÔÚCPUºÍGPUµÄЧÂÊÉÏ¡£Arrow¶ÔÁÐʽÊý¾Ý£¨±âƽµÄ»òǶÌ׵ģ©ÌṩÓëÓïÑÔÎ޹صıê×¼¸ñʽºÍÏàÓ¦µÄ¿â£¬ÕâÑù¿ÉÒÔÔÚÏȽøµÄÓ²¼þÉÏÓÐЧµÄÔËÐзÖÎöÈÎÎñ¡£
Êý¾Ý²Ö¿â¹¤×÷ºÍ·ÖÎö²éѯ´ÓÁÐʽÊý¾ÝÖлñÒæ·Ëdz£¬ÒòΪ²éѯͨ³£Éæ¼°µ½ÁеÄ×Ó¼¯£¬ÔÚÕâЩÁм䣬»áÉæ¼°µ½´óÁ¿µÄÐС£·ÖÎö¹¤×÷µÄ²éѯ°üÀ¨´óÁ¿µÄ»Ø¹é£¬É¨ÃèºÍ¸´ÔÓµÄÁ¬½Ó¡£
¿ÉÒÔÓÃÁÐʽÊý¾Ý¸ñʽÀ´±àд¼òµ¥¶øÓÐЧµÄ²éѯ¹ý³Ì´úÂ룬ÒÔ¼Ó¿ì·ÖÎö²Ù×÷¡£½ô´ÕµÄforÑ»·´úÂëÄÜ¿ìËÙÔËÐÐÔÚÁÐÖµÉÏ£¬²¢Ö´ÐбØÐèµÄ²Ù×÷£¬ÈçFILTER£¬COUNT,
SUMºÍMINµÈµÈ¡£ÕâÖÖ·½·¨¶ÔCPUÓѺã¬ÒòΪCache lineÖÐÌî³äµÄΪÏà¹ØÊý¾Ý£¬¼´Ò»ÏµÁдÓÁлñÈ¡µÄÖµ£¬ËüÃǶ¼ÐèÒª½øÐд¦Àí¡£ÀàËÆµÄ£¬ÎÒÃÇ´Ó´ÅÅ̽«ËùÐèÁÐʽÊý¾Ý¶ÁÈëÄÚ´æÊ±£¬Ö»ÐèÒª¶ÁÈ¡ËùÐèÁм´¿É¡£Òò´Ë£¬ÔÚ´ÅÅÌI/OºÍCPUÄÚ´æ´ø¿íÕ¼Ó÷½Ã棬»ùÓÚÁÐʽ¸ñʽÊý¾Ý±àдµÄ²éѯËã·¨£¬Ð§ÂÊÔ¶±È»ùÓÚÐÐµÄÆäËüËã·¨¸ß¡£
¶øÇÒ£¬ÔÚ±àÒëÖУ¬Èç¹ûÓÐÓÅ»¯»ú»á£¬±à¼Æ÷»á½«½ô´ÕÑ»·´úÂë×Ô¶¯×ª»»ÎªÏòÁ¿Ö¸Áî¡£µ±±àд»ùÓÚÐÐÊý¾ÝµÄ²éѯ´¦ÀíË㷨ʱ£¬ÕâÖÖÓÅ»¯»ú»áÊÇûÓеġ£
ArrowÁÐʽÊý¾ÝµÄÄÚ´æ¸ñʽʵ¼ÊÉÏÈÃCPUʹÓÃÂÊѹËõÉè¼Æ£¨CPU-efficient compression
schemes£©£¬ÕâÖÖÉè¼ÆÊÇÇáÁ¿¼¶µÄ£¬¸ü¹Ø×¢Êµ¼ÊµÄ²éѯ¹ý³ÌÐÔÄܶø²»ÊÇʵ¼ÊµÄѹËõÂÊ£¬ºóÕß»áÑÏÖØÓ°ÏìCPUЧÂÊ¡£
DremioϵͳÖеÄArrow²éѯ´¦Àí
DremioÊÇ×Ô·þÎñÊý¾ÝµÄ¿ªÔ´Æ½Ì¨¡£ºËÐĵÄÒýÇæÃûΪSabot£¬ËüÍêÈ«»ùÓÚArrow¿âµÄ¶¥²ã½øÐй¹½¨¡£
Ê×ÏÈÀ´ÌÖÂÛDremioÀïArrowÏà¹ØµÄÄÚ´æ¹ÜÀí¡£Arrowʵ¼Ê°üº¬Ò»¸ö»ùÓÚChunk¹ÜÀíµÄ·ÖÅäÆ÷£¬¸Ã·ÖÅäÆ÷ÍêÈ«¹¹½¨ÔÚNettyµÄJEMalllocµÄ¶¥²ãʵÏÖÖС£Ö÷ÒªµÄÄÚ´æ¹ÜÀíģʽ»ò·ÖÅäģʽÊÇÒ»ÖÖ»ùÓÚÊ÷µÄģʽ£¬´Ó¸ù·ÖÅäÆ÷¿ªÊ¼½øÐзÖÅä¡£ÕâÑù£¬¿ÉÒÔÔÚ¸ù·ÖÅäÆ÷Ï´´½¨¶à¸ö×Ó·ÖÅäÆ÷¡£Ã¿¸ö·ÖÅäÆ÷ÓÐÒ»¸ö³õʼԤÁô£¨´´½¨·ÖÅäÆ÷ʱ´¥·¢£©ºÍ×î´óµÄ·ÖÅäÏÞ¶î¡£Ô¤Áô²»ÊÇÖ¸Ô¤ÏÈ·ÖÅ䣬ËüÒâζ×ÅÔÚ·ÖÅäÆ÷Õû¸öÉúÃüÖÜÆÚÖУ¬¿ÉÓÃÓÚ·ÖÅä²Ù×÷·û¶ÔµÄÔ¤ÁôµÄÄÚ´æÊýÁ¿¡£

ͼ2: Ê÷×´·ÖÅäϵͳ
ÔÚÔËÐÐÒýÇæÖУ¬¿ÉÒÔ½«¶ÑÍâÄڴ滺³åÓÃ×öÄÚ´æÁÐʽÊý¾Ý½á¹¹µÄµ×²ãÄڴ棨underlying memory£©¡£ÔÚJavaµÄÀ¬»ø»ØÊÕÖУ¬Ó¦±ÜÃâʹÓÃJVM¶Ñ£¬ÒÔ¼õÉÙ¿ªÏú¡£
ÏÖÔÚ£¬À´ÌÖÂÛÔõÑùʹÓÃÊ÷×´·ÖÅäģʽ£¬ÒÔ¼°DremioÖеijõʼԤÁôºÍÄÚ´æÏÞÖÆÁ½¸ö¸ÅÄî¡£²éѯ¼Æ»®Ê÷µÄÿ¸öÔËËã·ûµÃµ½Ëü×Ô¼ºµÄ·ÖÅäÆ÷£¨¸¸·ÖÅäÆ÷£©¡£ÕâÑù£¬Ã¿¸öÔËËã·û»áΪÆäÖеÄÿ¸ö¶ÀÁ¢ÈÎÎñ´´½¨Ò»¸ö»ò¶à¸ö·ÖÅäÆ÷£¨´ø³õʼԤÁôºÍÄÚ´æÏÞÖÆ£©¡£
ÒÔÍⲿsortÔËËã·ûΪÀý¡£Õâ¸öÔËËã·û¸ºÔðÔÚÄÚ´æ²»×ãʱ£¬ºÜºÃµÄ´¦ÀíÅÅÐò²éѯ¡£ÔÚÈκεÍÄÚ´æµÄÇé¿öÏ£¬Ëü¶¼¿ÉÒÔÒç³öÊý¾Ý¡£ 
ͼ3£º¶ÔÍⲿsortÔËËã·û½øÐлùÓÚÊ÷µÄ·ÖÅä
ÔÚÔËËã·ûµÄ¶¥²ã£¬ÓÐÒ»¸ö¸ÃÔËËã·ûµÄ¸ù·ÖÅäÆ÷¡£²éѯ¿ªÊ¼ÔËÐÐǰ£¬»áÏȽ¨Á¢¸ÃÔËËã·û×Ô¼ºµÄ·ÖÅäÆ÷¡£ÅÅÐòÔËËã·ûÓÐÁ½¸öÖ÷ÒªµÄ×Ó¹¹¼þ¡£Ò»¸öÊÇÔËÐÐÄڴ棬ÁíÒ»¸öÊÇÔËÐдÅÅÌ£¬Ã¿¸ö×Ó¹¹¼þ´´½¨¶ÀÁ¢ÓÚÔËËã·û·ÖÅäÆ÷µÄ×Ó·ÖÅäÆ÷¡£
½øÈëÔËËã·ûµÄÅúÁ¿Êý¾Ý£¬ÓÉÔËÐÐÄڴ渺ÔðÆä»ñÈ¡ºÍÅÅÐò¡£µ±ËùÓеÄÊäÈë¶¼±»´¦Àíºó£¬ËùÒÔµÄÊý¾Ý¶¼ÒÑÅÅÐò£¬ÔËËã·û¿ÉÒÔ¿ªÊ¼´ÓÔËÐÐÄÚ´æµÄ×Ó¹¹¼þÖÐÊä³öÊý¾Ý¡£
´ÅÅÌÔËÐиºÔð¹ÜÀíÒç³ö¡£Èç¹ûÄÚ´æ²»×㣬ÐèÒªÒç³ö£¨Ò»´Î»ò¶à´Î£©ÄÚ´æÖÐÒÑÅÅÐòµÄÊý¾Ý¡£Ò»µ©Êý¾ÝÒç³ö£¬ÐèÒªÖØÐ¶ÔһЩ´¦Àí½øÐÐÅÅÐò£¬´Ó´ÅÅÌÍùÄÚ´æÖмÓÔØ¶à¸öÒÑÅÅÐòµÄÊý¾ÝÁ÷£¬ÔÚÄÚ´æÖнøÐÐÆäºÏ²¢À´Íê³É´¦Àí£¬È»ºó½«Êý¾Ý´ÓÔËËã·û³éÈ¡³öÀ´¡£´¦ÀíÒç³öÊý¾ÝµÄ´úÂëÐèÒª±£Ö¤ÓÐ×ã¹»µÄ¿Õ¼ä£¬¿ÉÒÔ¼ÓÔØ2×é»ò¶à×飨»òÅú£©Òç³ö¼Ç¼µ½ÄÚ´æÀÀ´¼ÌÐøÄÚ´æÖеĺϲ¢´¦Àí¡£´ÅÅÌÔËÐв¿¼þ»áÒ»Ö±¼à²â¶à¸öÒì³£ÖÜÆÚ£¨»òÑ»·£©ºÍÿ¸öÖÜÆÚÄÚ×î´óÒç³öÅú´ÎµÄ´óС¡£×Ó·ÖÅäÆ÷Ô¤Áô×ã¹»µÄÄÚ´æ¿Õ¼ä£¬¿ÉÒÔ¼ÓÔØÃ¿´ÎÒç³öÑ»·²úÉúµÄÒç³öÅú´Î¡£
ÔÚDremioÖУ¬Êý¾Ý×÷Ϊһ×éÏòÁ¿£¬Í¨¹ý¹ÜµÀ´ÓÒ»¸öÔËËã·ûÁ÷ÏòÁíÒ»¸öÔËËã·û¡£Õâ½Ð×ö¼Ç¼Åú´Î¡£Ò»¸ö¼Ç¼Åú´ÎÓɹ̶¨¸öÊýµÄÁÐÏòÁ¿£¨ÁÐʽÃèÊöµÄÐÐÊý¾Ý½á¹¹£©×é³É¡£¼Ç¼Åú´ÎÊÇDremioÔËÐÐÒýÇæµÄÈÎÎñµ¥Î»¡£

ͼ4: ´ÓÒ»¸ö²éѯÔËËã·ûµ½ÁíÒ»¸öµÄ¹ÜµÀÊý¾ÝÁ÷£¨²»Ðè¾¹ý¿½±´£©
ÔÚÕâ¸öÀý×ÓÖУ¬ÓÐÁ½¸öÔËËã·û£ºscanºÍaggregation¡£Êý¾ÝÓÐÈýÁУ¬Ã¿¸öÁÐÓиöArrowÏòÁ¿£¬×ܹ²ÓÐÈý¸öÏòÁ¿¡£ÉÏͼ±íʾscanÔËËã·ûµÄÊä³ö£¨¼Ç¼ÏòÁ¿£©ÕýºÃ×÷ΪaggregationÔËËã·ûµÄÊäÈë¡£
ÔÚijЩÔËËãÖУ¬±ÈÈçÓÐЩÀàÐ͵ÄjoinºÍaggregation£¬¿ÉÄÜÐèÒª°Ñ»ùÓÚÁеÄÊý¾Ýת»»Îª»ùÓÚÐеÄÊý¾Ý¡£Í¨¹ýÐÔÄÜʵÑ飬¿ÉÒÔ·¢ÏÖÁÐʽÊý¾Ý¶ÔÓÚhash±íµÄ²åÈ룬hash
joinºÍhash aggregationËã·¨ÖеÄlookup²»¹»ÓÐЧ¡£¶ÔaggregationºÍjoin£¬ÔÚ¼ÓÈëµ½hash±í֮ǰ£¬ÐèÒª°ÑÖ÷ÒªµÄÁдÓÊäÈë¼Ç¼Åú´Îת»»µ½µ½ÏàÓ¦µÄÐбíʾÊý¾ÝÀÒò´ËÕâЩË㷨ʵÏÖ²¿·Ö£¨ÓÈÆähash±íµÄ´úÂ룩ÔËÐлùÓÚÐÐʽ±í´ï¡£

ͼ5£ºÏòÁ¿»¯µÄHash Aggregation£¬¼°ÆäÖ÷ÒªÁÐÊý¾ÝµÄÐÐʽ±í´ï
ÏÂÃæÊÇÏòÁ¿»¯´úÂëµÄ¸ÅÊö£¬ÓÃÀ´Ö´ÐдÓÁÐʽÊý¾Ýµ½ÐÐʽÊý¾ÝµÄת»¯£º
±àдһ¶Î´úÂ뽫ÏòÁ¿ÁÐʽÊý¾Ýת»»ÎªÐÐʽ±í´ï£¬¿ÉÒÔÔÚhash±íÖÐÓÐЧµÄ½øÐÐinsertion/lookupµÄ²Ù×÷£¨ÏòÁ¿»¯µÄhash
aggregationºÍjoinÒ²»áÓõ½¸Ã±í£©¡£¶ÔÓÚhash aggregationºÍhash join£¬¿ÉÒÔͨ¹ý¶ÔÖ÷ÒªµÄÁнøÐÐGROUP
BY»òjoinÀ´ÊµÏÖ¡£
static void
pivot4Bytes(
VectorPivotDef def ,
FixedBlockVector fixedBlock,
final int count) {
/* source column vector to pivot */
final FieldVector field =def.getIncomingVector();
/* source column vector buffers */
final List <ArrowBuf> buffers = field.getFieldBuffers();
final int blockLength = fixedBlock.getBlockWidth();
final int bitOffset = def.getNullBitOffset();
/* validity buffer of source vector */
long srcBitsAddr = buffers.get(0).memoryAddress();
/* data buffer of source vector */
long srcDataAddr = buffers.get(1).memoryAddress();
/* target memory region to store pivoted (row-wise)
representation */
long targetAddr = fixedBlock.getMemoryAddress();
/* determine number of null values to work
through a word at a time */
final int remainCount = count % WORD_BITS;
final int wordCount = (count - remainCount)
/ WORD_BITS;
final long finalWordAddr = srcDataAddr + (wordCount
* WORD_BITS * FOUR_BYTE);
long bitTargetAddr = targetAddr + def. getNullByte
Offset ();
long valueTargetAddr = targetAddr + def.getOffset();
// decode word at a time -- 64 column values
while (srcDataAddr < finalWordAddr) {
final long bitValues = PlatformDependent .getLong
(srcBitsAddr);
if (bitValues == NONE_SET) {
// noop (all nulls).
bitTargetAddr += (WORD_BITS * blockLength);
valueTargetAddr += (WORD_BITS * blockLength);
srcDataAddr += (WORD_BITS * FOUR_BYTE);
} else if (bitValues == ALL_SET) {
// all set, set the bit values using a constant
AND.
// Independently set the data values without
transformation.
final int bitVal = 1 << bitOffset;
for (int i = 0; i < WORD_BITS; i++, bitTargetAddr
+= blockLength ) {
PlatformDependent.putInt(bitTargetAddr,
PlatformDependent.getInt(bitTargetAddr) | bitVal);
}
for (int i = 0; i < WORD_BITS; i++, valueTargetAddr
+= blockLength , srcDataAddr += FOUR_BYTE) {
PlatformDependent .putInt(valueTargetAddr, PlatformDependent
.getInt(srcDataAddr));
}
} else {
// some nulls, some not, update each value to
zero or the value, depending on the null bit.
for (int i = 0; i < WORD_BITS; i++, bitTargetAddr
+= blockLength , valueTargetAddr += blockLength,
srcDataAddr += FOUR_BYTE) {
final int bitVal = ((int) (bitValues >>>
i)) & 1;
PlatformDependent.putInt (bitTargetAddr,
PlatformDependent.getInt (bitTargetAddr) | (bitVal
<< bitOffset ));
PlatformDependent.putInt(valueTargetAddr, PlatformDependent
.getInt(srcDataAddr) * bitVal);
}
}
srcBitsAddr += WORD_BYTES;
}
if(remainCount > 0) {
// do the remaining bits..
} |
´úÂëʵÀý£º´ÓÒ»ÁÐÏòÁ¿£¨Ô´£©µ½ÁíÒ»ÁÐÏòÁ¿£¨Ä¿±ê£©×öÏòÁ¿¿½±´£¬Ê¹ÓÃ2×Ö½ÚÑ¡ÔñÏòÁ¿¡£¸ßЧC/C++·ç¸ñµÄ½ô´ÕÑÐò´úÂ룬ֱ½Ó×÷ÓÃÓÚunderlying
memory£¨ÊµÀýÊʺϹ̶¨¿í¶ÈΪ4×Ö½ÚµÄÁУ©£º
ÓÃÀý£ºSELECT C1 from FOO where C2 > 1000;
Ê×ÏÈ£¬ÔÚ½ô´ÕforÑ»·ÏòÁ¿´úÂëÖУ¬¶ÔC2×öÓÐЧµÄ¹ýÂË´¦Àí£¬¹¹½¨Ñ¡ÔñÏòÁ¿£¬´æ´¢Í¨¹ý¸Ã¹ýÂËÆ÷µÄÁÐÖµÆ«ÒÆ¡£ÏÖÔÚ¿ªÊ¼ÔËÐÐÁíÒ»¸öÑ»·£¬Ê¹ÓÃÕâÐ©Æ«ÒÆÁ¿À´Ë÷Òý´ÓC1´«µÝ³öÀ´µÄÖµ¡£
static class
FourByteCopier extends FieldBufferCopier {
private static final int SIZE = 4;
private final FieldVector source;
private final FieldVector target;
private final FixedWidthVector targetAlt;
public FourByteCopier(FieldVector source,
FieldVector target) {
this.source = source;
this.target = target;
this.targetAlt = (FixedWidthVector) target;
}
@Override
public void copy(long offsetAddr, int count)
{
targetAlt.allocateNew(count);
final long max = offsetAddr + count * 2;
final long srcAddr = source.getDataBufferAddress();
long dstAddr = target.getDataBufferAddress();
for(long addr = offsetAddr; addr < max; addr
+= STEP _ SIZE, dstAddr += SIZE){
PlatformDependent.putInt(dstAddr,
PlatformDependent.getInt(srcAddr + ((char)PlatformDependent.getShort(addr))
* SIZE));
}
} |
È·¶¨ÏòÁ¿µÄÅú´Î´óС
ÏÖÔÚÀ´ÌÖÂÛʵ¼ÊÔõôȷ¶¨ÏòÁ¿´óС¡£DremioÖеÄÈÎÎñµ¥Ôª½Ð¼Ç¼Åú´Î»òÊý¾ÝÅú´Î»ò¼¯£¬ÓÉArrowÄÚ´æÏòÁ¿×é³É¡£Ã¿¸öÏòÁ¿´ú±íÁËÊý¾Ý¼¯ÖеÄÒ»¸öÓò»òÒ»¸öÁУ¬Óɹ̶¨ÊýÁ¿µÄ¼Ç¼¹¹³É¡£

ͼ6£ºÔÚ²éѯÔËËã·ûÖд«µÝµÄ¼Ç¼Åú´Î
¼ÙÉèÓÐÒ»¸ö°ÙÍòµÄ¼Ç¼Êý¾Ý¼¯ºÏ¡£ÔÚͬһʱ¼äÐèÒª´¦ÀíµÄÊÇÔ¼4800¸ö¼Ç¼µÄ¼Ç¼Åú´Î¡£¼Ç¼Åú´ÎÊÇÔÚÔËËã·ûÖ®¼ä¹ÜµÀÖÐÁ÷¶¯µÄÊý¾Ýµ¥Ôª¡£ÏÖÔÚ£¬¹ØÓÚÈçºÎ¹Ì¶¨Ò»¸öÊý¾ÝÅú´ÎµÄ¼Ç¼×ÜÊý£¬Óкܶ಻ͬµÄ·½°¸£¬¸ÃÊý¿ÉÄܶà´ï64,000¡£
¿ÉÒÔ¿´µ½£¬´óµÄÅú´ÎÈÝÁ¿Èç8000»ò16,000ʵ¼ÊÉÏ¿ÉÒÔÌáÉýЧÂÊ£¬ÒòΪµ¥Î»ÈÎÎñÔö¼ÓÁË£¬ÐèÒªÖØ¸´Ö´ÐÐÒ»¸ö¹ý³ÌµÄ´ÎÊý¾Í»á½µµÍ¡£µ«ÊÇ£¬´óµÄÅú´ÎÒ²»áÒýÆð¹ÜµÀÎÊÌ⣬ÒòΪÔËËã·ûÖ®¼äʵ¼Ê´«µÝµÄÊý¾ÝÁ¿Ò²Ôö¼ÓÁË¡£È»¶øÊ¹ÓÃСµÄÅú´Î´óС£¬Èç128»ò256£¬ËäÈ»µ¥¸öÅú´ÎµÄ´¦Àí»á±ä¿ì£¬ÔËËã·ûÖ®¼ä´«µÝµÄÊý¾Ý»áÂýºÜ¶à£¬µ«ÒòΪ´¦Àí¹ý³ÌÖØ¸´µÄ¾ø¶Ô´ÎÊýºÍÒª´´½¨µÄ¶ÔÏóÈÝÁ¿´ó£¬»áºÜ¿ìµ½´ï²éѯµÄ¶Ñ¶¥¡£ÕâÒ²ÊÇΪʲôÔÚDremioÖУ¬Ê¹Óõ½µÄ±ê×¼¼Ç¼Åú´Î´óСÊÇ¿ÉÅäÖõ쬴ó¶àÊýÇé¿öÏ£¬Õâ¸ö´óСΪ4096¸ö¼Ç¼¡£
ͨ¹ýÅú´Î´óС£¬¿ÉÒÔʵ¼Ê¿ØÖÆÎªÏòÁ¿·ÖÅäµÄÄÚ´æÊýÁ¿¡£ÔÚexternal sort£¬aggregationºÍjoinµÈÔËËãÖУ¬Ò»¶¨ÒªÒâʶµ½ÔËËã·ûÐèÒª¹¤×÷µÄÄÚ´æÊýÁ¿£¬Êµ¼ÊÉϲ»ÄÜÒÀÀµArrow
APIÌṩµÄ¸øÏòÁ¿·ÖÅäµÄȱʡÄÚ´æ¡£
ÔÚÄÚ´æÊÜÏÞµÄÇé¿öÏ£¬×ÐϸÅäÖÃÏòÁ¿µÄÅú´Î´óС£¬½ø¶øÕýÈ·µØ¸øÕâЩ¼Ç¼·ÖÅäÄڴ棬ÕâÑù¿ÉÒÔд³öÄܺܺù¤×÷µÄ½¡×³Ëã·¨¡£
ͨ³£´«Í³ÒâÒåµÄѹËõÔÚÊý¾Ý¿âºÍÆäËüϵͳÈçLZO£¬ZLIBµÈÖеÄʹÓÃÊÇÖØÁ¿¼¶µÄ£¬¶øÑ¹ËõÁÐʽ¸ñʽ¿ÉÒÔÆ½ºâʹÓÃÉϵÄÇáÁ¿¼¶ºÍCPUÓÐЧѹËõ·½°¸¡£´«Í³Ñ¹ËõËã·¨Ìṩ¸üºÃµÄѹËõ±ÈÀý£¬µ«»áÓ°ÏìCPUЧÂÊ£¬ÒòΪѹËõºÍ½âѹËõÔö¼ÓÁ˲éѯµÄ×Üʱ¼äÏûºÄ¡£
ArrowµÄ×ÝÁиñʽÈÃÎÒÃÇ¿ÉÒÔʹÓÃÇáÁ¿¼¶·½°¸£¬Èç×Öµä±àÂ루dictionary encoding£©¡¢Î»Ñ¹Ëõ£¨bit
packing£©£¬»òÊdz¤¶È±àÂ룬ºóÕ߿ɸù¾ÝѹËõ±ÈÀýµ÷Õû²éѯÐÔÄÜ¡£Æä´Î£¬¿ÉÒÔÖ±½Ó²Ù×÷ѹËõºóµÄÁÐʽÊý¾Ý£¬ÕâÑùÔÚ¿ªÊ¼´¦Àí֮ǰ£¬²»ÐèÒª¶ÔËùÓеÄÁÐʽÊý¾Ý½øÐнâѹË飬²éѯÐÔÄܾͿÉÒÔÌá¸ßÒ»¸öÊýÁ¿¼¶¡£
ÏÂÃæ¾ÙÀý˵Ã÷Ôõô¶Ô¿É±ä¿í¶ÈÁÐÖµ½øÐÐʹÓÃ×Öµä±àÂë¡£

ͼ7: ʹÓôøSIMDµÄ×Öµä±àÂëÀ´ÓÐЧ¶ÏÑÔStringsµÄ¹ÀÖµ
ÁÐCOUNTRYÓÐUnited States£¬China£¬India£¬FranceºÍUnited
KingdomµÈ¹ú¼Ò£¬Æä³¤¶ÈÊǿɱäµÄ£¬ÐèÒª±àдһ¸ö»ùÓÚCOUNTRYµÄ¹ýÂ˵IJéѯ¡£¶Ô¸ÃÁнøÐÐ×Öµä±àÂ룬Ïñ¹Ì¶¨¿í¶ÈµÄ×Öµä±àÂëÖµµÄ¹ýÂËÆ÷Ò»Ñù£¬ÖØÐ´¿É±ä³¤¶È×Ö·û´®µÄ¹ýÂËÆ÷£¬ÕâÑù¿ÉÒÔÓÐЧµÄ½øÐйýÂË´¦Àí¡£
SELECT C1, C2 FROM FOO WHERE COUNTRY=¡¯FRANCE¡¯
Ê×ÏȲéÔÄ×ֵ䣬µÃµ½¡°FRANCE¡±µÄ×Öµä±àÂëֵΪ4¡£¼ÓÔØ×ÖµäÖµ4µ½SIMF¼Ä´æÆ÷£¬È»ºó¼ÓÔØµÄËùÓÐÒѱàÂëÖµ£¬Í¬Ê±±È½Ï±àÂëºóµÄÖµºÍ4£¬´Ó¶øÕÒ³ö¸Ãµ¥ÔªÏà¶ÔÓÚCOUNTRYÁÐֵΪ¡°FRANCE¡±µ¥ÔªµÄλÖ㨻òË÷Òý£©¡£
Õâ¾ÍÊÇ×Öµä±àÂëµÄÇ¿ÓÐÁ¦µÄµØ·½¡£Êµ¼ÊÉÏ£¬¿ÉÒÔѹËõ¿É±ä³¤¶ÈÁпíµÄÖµµ½¹Ì¶¨³¤¶ÈµÄ×ÖµäÖµÊý×éÖУ¬È»ºó´Óд²éѯ´¦ÀíËã·¨£¬¸ÃËã·¨¿ÉÒԷdz£ÓÐЧµÄÔÚÕâЩѹËõºóµÄÁÐÖµ¼äÒÀ´Îͨ¹ý¡£
Êý¾Ý·´Éä
Ϊ¼Ó¿ì²éѯËÙ¶È£¬DremioʹÓÃÃûΪÊý¾Ý·´É䣨Data Reflection£©µÄÌØÐÔÀ´½øÐÐÊý¾ÝÓÅ»¯¡£Êý¾Ý·´ÉäÔÚ´ÅÅÌÖд洢£¬ËüʹÓÃÁÐʽÊý¾Ý¸ñʽ£¬²ÉÓÃÁËParquetÁÐʽ´æ´¢¸ñʽ£¨Apache
Parquet£©¡£µ±´ÓÊý¾Ý·´ÉäÖжÁÈ¡Êý¾Ýʱ£¬»á´ÓParquet°ÑÊý¾Ý¼ÓÔØÎªÏàÓ¦µÄÁиñʽµ½ArrowµÄÄڴ棬ÒÔ±ãÔÚÖ´ÐÐÒýÇæÖнøÐд¦Àí¡£
Êý¾Ý·´ÉäµÄ×î³õ¶Áȡʵ¼ÊÊÇ»ùÓÚÐиñʽµÄ¡£Ëü»ù±¾ÊÇÐе¼ÏòµÄ¶ÁÈ¡£¬ÍêȫûÓÐÀûÓÃÔ´£¨´ÅÅÌ£©ºÍÄ¿±ê£¨Äڴ棩Êý¾Ý¸ñʽ¶¼ÊÇÁÐʽµÄÇé¿ö¡£
Òò´ËÎÒÃÇÖØÐ´¶ÁȡΪÍêÈ«µÄÏòÁ¿»¯¶ÁÈ¡£¬¸Ã¹ý³ÌÖУ¬Îª»ùÓÚÁеĴ¦Àí¡£ÕâÌá¸ßÁËÁ½·½ÃæµÄ´úÂëЧÂÊ£¬¼´´Ó´ÅÅ̶ÁÈ¡ParquetÒ³£¨Ñ¹Ëõ¹ý»òûÓÐѹËõ¹ýµÄ£©ºÍÖØ¹¹ArrowÁÐÏòÁ¿¡£
ÎÒÃÇÒ²Ìṩ֧³ÖParquetɨÃèµÄ¹ýÂËÆ÷ѹÈë¡£ÔÚ²éѯÖеĶÏÑÔÄÜÖ±½ÓѹÈëµ½ParquetɨÃè´úÂëÖУ¬Òò´ËÔÚÖØ¹¹ArrowÄÚ´æÏòÁ¿Ê±£¬Ö»Ðè¼ÓÔØÄÚ´æÖÐÐèÒªµÄÁÐÊý¾Ý¡£
×ܽá
DremioÊÇ»ùÓÚApache ArrowµÄ¿ªÔ´Êý¾Ý´¦Àí¿ò¼Ü£¬¾ßÓÐÏòÁ¿»¯ÌØÐÔ¡£ÔÚ±¾ÎÄÖУ¬ÔÎÄ×÷ÕßÌÖÂÛÁËÕâÐ©ÌØÐÔµÄÖ÷Òª·½Ã棬ϸ½ÚµÄ¼¼ÊõÌÖÂÛÔÚ½ñÄêSan
JoseµÄStrata ConferenceÖÐÒѸø³ö¡£ÔÚDrmioÖУ¬À©Õ¹ÁËArrowÔÚÕû¸öÄÚ´æÔËÐÐÒýÇæµÄʹÓá£×î½ü£¬ÔÎÄ×÷ÕßËùÔÚÍŶÓÖØÐ´ÁËArrowÖеĴ󲿷ÖJavaʵÏÖ£¬Ìá¸ßÆäÐÔÄܺͶÑʹÓá£Ò»Ð©TPCH²éѯÏÔʾÑÓ³Ù½µµÍÁË60%¡£ËûÃǼƻ®×ö¸ü¶àµÄ¸Ä½ø£¬°üÀ¨±¾µØSIMD¼ÓËٿ⣬²¢ÈÏΪËüÔÚ´¦ÀíЧÂÊÉÏ¿ÉÒÔÓм«´óµÄ¸Ä½ø¡£ |