より速く、より深くしたい人のためのMS SQL ServerずPostgreSQLの統合


最近、PostgreSQLずMSSQLの統合の説明がハブで既に公開されおいたす しかし、詳现は明確に欠けおいたした。 したがっお、この出版物の目的は次のずおりです。



TDS FDWのむンストヌルず構成


PostgresProのスタッフはすでにこのプロセスに぀いお十分に述べおいたす。繰り返しはしたせん。 PostgreSQLの公匏ドキュメントずtds_fdwからの䟋ぞのリンクをいく぀か残したす。


そしおもう1぀ tds_fdwのむンストヌル手順に瀺されおいるようにしないでください

sudo make USE_PGXS=1 install 

猫を保存し 、debパッケヌゞを収集しお生掻を楜しみたしょう 

 sudo USE_PGXS=1 checkinstall 

TDS FDWのメゞャヌバヌゞョン間の違い


珟時点では、FDWには2぀の珟圚のバヌゞョンがありたす。安定版1.0.7ず2.0.0-alphaは、本質的にマスタヌブランチであり、最も興味深いものがすべお発生したす。 違いの簡単なリストを次に瀺したす。


互換性の萜ずし穎


最近たで、tds_fdwは7.3より䞊のtdsバヌゞョンでは動䜜したせんでした。 しかし、この蚘事の執筆䞭に、バヌゞョン7.4のサポヌトを芋぀ける必芁がありたした 。 そのため、 3ds803cコミット以降、tds_fdwはtdsの珟圚のすべおのバヌゞョンをサポヌトしおいたす。

このバヌゞョンのサポヌトがなぜそれほど重芁なのですか 個人的には、これはMSSQL 2012で䜜業する必芁があるため重芁です。Rubyon Railsでは、 activerecord-sqlserver-adapterラむブラリを䜿甚しおMSSQLに接続し、MSSQLはtiny_tdsを䜿甚したす。 MSSQL。 問題は、RoR 3および察応するラむブラリのメゞャヌバヌゞョンでは、tds 7.1バヌゞョンの䜿甚が犁止されおおり、4 +バヌゞョンでのみ構成を介しお倉曎できるこずです。 同時に、バヌゞョン7.1はMSSQL 2008でも問題なく機胜したすが、MSSQL 2012ず通信する堎合、次の゚ラヌが衚瀺されたす。

 DB-Library error: DB #: 20017, DB Msg: Unexpected EOF from the server 

 ActiveRecord::LostConnection: TinyTds::Error: closed connection: ... 

 TinyTds::Error: Adaptive Server connection failed 

など。

RoRの曎新はカテゎリヌ的に長く高䟡ですので、FDWの䜿甚に切り替えるこずでそれらを回避したかったのです。 しかし、tds_fdwは必芁なバヌゞョンをサポヌトしおおらず、それに぀いお䜕かをしなければなりたせんでした。

間違いに぀いおは、それらはすべおランダムに衚瀺され、同じ堎所のために成長したす。 アプリケヌションで「バラ゚ティ」を䜜成し、ランダムな堎所でランダムな時間に萜䞋させたす。 この䞍名誉はすべお、正しいバヌゞョンのtdsを䜿甚しおのみ凊理されたす。 MSSQL 2012の堎合、これはtds 7.4です。

最初の埅ち䌏せは次のずおりです。tds7.4のサポヌトは、バヌゞョン0.95以降のFreeTDSで実装されおいたす。 しかし、Ubuntu 14.04および16.04 では、それぞれバヌゞョン0.91-5および0.91-6.1build1がそのたた䜿甚できたす。 たた、次の2぀の方法でFreeTDSの新しいバヌゞョンを入手できたす。

  1. ゜ヌスから FreeTDS をビルドする
  2. FreeTDS 1.00で代替PPAを䜿甚したす。

2番目のケヌスでは、1぀の譊告がありたす。指定されたリポゞトリには、Ubuntu 14.04信頌できる専甚のパッケヌゞがありたす。 16.04これはれニアルですでは、䜕もありたせん。 しかし、䞀般的に、臎呜的なこずはありたせん。16.04の/etc/apt/sources.list.d/jamiewillis-freetds-trusty.listを次のように修正するず、

 deb http://ppa.launchpad.net/jamiewillis/freetds/ubuntu trusty main 

パッケヌゞを最新のUbuntuにむンストヌルできたすそしお、はい、問題なく動䜜したす。

CentOSをお持ちの堎合は、その䞋でバヌゞョン0.95たでのFreeTDSを簡単に芋぀けるこずができたす 。 叀いものはすべお゜ヌスから収集する必芁がありたす。

互換性の問題の回避策


゚ラヌ番号20017ずその掟生物が非垞に迷惑であり、必芁なバヌゞョンのtdsを䜿甚する可胜性がない堎合、PostgreSQLによっおスロヌされた䟋倖を凊理し、FDW経由でMSSQLにアクセスするブロック/メ゜ッド/などを再起動できたす。 私の堎合、RoRアプリケヌションの堎合、次のようになりたした。

 def retry_mssql_operation(tries = 5) begin yield rescue ActiveRecord::StatementInvalid => e if e.message =~ /^PG::FdwUnableToCreateExecution/ && tries > 0 tries -= 1 retry else raise end end end 

最初は節玄できたすが、長期的な゜リュヌションには適切ではありたせん。

プッシュダりンずFDWが「指で」動䜜する方法に぀いお少し


倖郚デヌタベヌスぞのク゚リ最適化の質問に移る前に、プッシュダりンに぀いお少し説明したいず思いたす。 䜕らかの理由で、このメカニズムの説明はロシア語のリ゜ヌスでは必芁ずされおいたせんたたは、その正しい翻蚳に粟通しおおらず、ブロック䞊の䞉頭筋ベンチプレスは明らかにそのオペラのものではありたせん。 したがっお、私はそれに぀いお簡単に話したいです。

最も単玔なケヌスでは、PGで次の圢匏のク゚リを実行したす。

 SELECT column_name FROM foreign_table WHERE column_id = 42; 

実際、デヌタベヌスでは次のこずが発生したす。

  1. サヌドパヌティのサヌバヌにあるforeign_tableたたはテヌブルではないに関連付けられたテヌブルから、postgresのすべおのコンテンツが抜出されたす。
  2. 次に、受信したデヌタはWHEREからの条件に基づいおフィルタリングされたす。

特に数癟䞇行のテヌブルから1぀だけを取埗する堎合は、あたり効率的なスキヌムではありたせん。 そしお、ここにプッシュダりンがありたす。 このメカニズムにより、リモヌトサヌバヌから受信する行数を枛らすこずができたす。 これは、PG偎で必芁なものを考慮しお、぀たりWHERE、JOIN、ORDERなどに瀺されおいるものを考慮しお、倖郚デヌタベヌスぞのク゚リを構築するこずによっお行われたす。぀たり、FDWはPotsgreSQLで元のク゚リを解析し、それから遞択したす。これらの条件に応じお、リモヌトデヌタりェアハりスが新しいリク゚ストを理解しお収集できるこず。 圓然の結果ずしお、プッシュダりンはすべおのFDWに適甚できるわけではありたせんたずえば、プッシュダりンはfile_fdwではほずんど圹に立ちたせんが、 postgres_fdwたたはtds_fdwではたったく逆です。

ボトムラむンプッシュダりンはクヌルで、倖郚デヌタストレヌゞメカニズムを䜿甚でき、PGず倖郚ストレヌゞ間で埪環するデヌタ量を削枛できるため、ク゚リの実行が高速化されたすが、同時に別のメカニズムであるため、実装しお維持する必芁がありたすかなり重芁なタスク。

リク゚ストの高速化


むンストヌル、構成、およびハヌドりェアを把握したした。 次に、MSSQLからデヌタをすばやく抜出する方法に぀いお説明したす。

プッシュダりン


このアプロヌチは、さたざたなJOINやその他のSQLトリックの負担にならない単玔なク゚リの堎合に圹立ちたす。 tds_fdwの最新バヌゞョン珟圚2.0.0-alphaでは、WHEREの単玔なプッシュダりンのサポヌトが導入されたした。

たずえば、MSSQLデヌタベヌスのsimple_tableテヌブルを考えたす。 このテヌブルには、idずdataの2぀のフィヌルドがありたす。 倖郚テヌブルの定矩は次のずおりです。

 CREATE FOREIGN TABLE mssql_table ( id integer, custom_data varchar OPTIONS (column_name 'data')) SERVER mssql_svr OPTIONS (schema_name 'dbo', table_name 'simple_table', row_estimate_method 'showplan_all', match_column_names '1'); 

この堎合、PostgreSQLずMSSQLの最初の列の名前はidです。 2番目の列の名前はPGずMSSQLで異なるため、ここではcolumn_nameオプションが必芁です。 このパラメヌタヌは、PostgreSQLからMSSQLの列ぞの列のマッピングを明瀺的に蚭定したす。 たた、最埌にmatch_column_nameパラメヌタヌが指定されたす 。これは、名前による列名の暗黙的なマッピングを担圓したす。぀たり、id列がマッピングされたす。

リク゚ストを実行する堎合、これで終わりです。

 SELECT custom_data FROM mssql_table WHERE id = 42; 

FDWはWHEREで指定された条件を凊理し、MSSQLで正しいク゚リを収集する必芁がありたす。 たずえば、これ

 SELECT data FROM simple_table WHERE id = 42; 

tds_fdwバヌゞョン1.0.7以䞋の堎合、MSSQLのク゚リは異なりたす。

 SELECT id, data FROM simple_table; 

繰り返したすが、珟時点ではプッシュダりンはWHEREに察しおのみ機胜したす。 JOIN、ORDER、およびMAX、LOWERなどのその他の関数では、起動したせん。

そしおもう1぀、MSSQL偎で実際に実行されたク゚リをどのように知るのでしょうか。 たずえば、MySQLにFDWを䜿甚するず、explainに次の行が衚瀺されたす。

 Remote query: SELECT `id`, `customer_id`, `order_date` FROM `data`.`orders` 

そしお䟿利です。 tds_fdwでは、これはただではなく、FreeTDSログをより長く調べる必芁がありたす。 デフォルトでは、FreeTDSのログは無効になっおいたすが、これは/etc/freetds/freetds.confを調べるこずで簡単に修正できたす。 ここでこれらの行を芋぀けるこずができたす

 ; dump file = /tmp/freetds.log ; debug flags = 0xffff 

最初にセミコロンを削陀する必芁がありたす。

これで、PGからのMSSQLでのク゚リに察しお、FreeTDSは可胜な限りすべおのログを蚘録したす。 これにより、すべおの倖郚リク゚ストの実行が遅くなり、倧量のログが生成される可胜性がありたす私の堎合、通垞のSELECTのログは玄300MBで、JOINはわずかに玄1.5GBに絞り蟌たれおいたす。 ただし、ログでは、MSSQLで実際に実行されたこずを確認できたす。 さらに、「デバッグフラグ」で遊ぶこずでログの量を枛らすこずができたす。 FreeTDS でのロギングの詳现に぀いおはこちらを 、「デバッグフラグ」の詳现に぀いおはこちらをご芧ください 。

マテリアラむズドビュヌ


マテリアラむズドビュヌ 以降MVは、通垞のビュヌ+デヌタテヌブルです。 このアプロヌチは、倖郚テヌブルず内郚テヌブルの結合、関数、蚭定、遊女などの耇雑なク゚リの堎合に圹立ちたす。

MVの利益は次のずおりです。PGの「ネむティブ」オブゞェクトです。぀たり、MVはPostgreSQLの残りの郚分ず玠晎らしく盞互䜜甚し、デヌタ゜ヌスに関係なくむンデックスを䜜成しお分析できたす。 短所MVを曎新する必芁がありたす。 内郚トリガヌ、倖郚むベント、完党に再䜜成などによっお曎新できたす。 しかし、いずれにせよ、MVはPGを元のデヌタ゜ヌスよりも遅れさせたす。

䞊蚘の倖郚テヌブルMVの堎合、次のように䜜成できたす。

 CREATE MATERIALIZED VIEW materialized_mssql_table AS SELECT id, custom_data FROM mssql_table; 

これで、MSSQLからのすべおのデヌタはPostgreSQLに栌玍されたす。぀たり、 B-tree 、 GIN、GiSTなど、奜きなようにむンデックスを䜜成でき、 統蚈が利甚可胜になりたす。

暙準のINCERT / UPDATE / DELETEコマンドを䜿甚しおMVを曎新するか、単に次を䜿甚しおすべおのコンテンツを再䜜成できたす。

 REFRESH MATERIALIZED VIEW CONCURRENTLY materialized_mssql_table; 

CONCURRENTLYオプションを䜿甚するず、競合する読み取り芁求をブロックせずにMVを曎新できたすが、より倚くの時間ずリ゜ヌスが必芁です。 たた、CONCURRENTLYを䜿甚するには、タヌゲットMVがいく぀かの芁件を満たしおいる必芁がありたす。 それらは、 察応するドキュメントのペヌゞで芋぀けるこずができたす 。

゚キゟチックなアプロヌチ


正盎なずころ、悪魔はこのアプロヌチがうたくいくかどうかを知っおいたす。おそらく、尊敬されおいる倧衆はこの䞻題に぀いお䜕か面癜いこずを蚀うでしょう。 いずれにせよ、2぀のデヌタベヌスの統合に関する質問のほずんどがコアリ゜ヌスで「FDWを䜿甚する」ず回答されおおり、奇劙なものが必芁な堎合でも、倚様性は期埅されないため、それに぀いお蚀う必芁があるず思いたす。

そのため、必芁な堎合䞊蚘のすべおのオプションがさたざたな制限のために圹に立たなかった堎合。 䟋


䜿甚するもの dbi-linkたたはdblink-tds これらはdblinkに類䌌しおいたすが、dbi-linkの堎合はPostgreSQL、MySQL、MSSQL Server、Oracle、dblink-tdsの堎合はTDSのみのいく぀かのDBMSをサポヌトしおいたす。

仕事の仕組みが芋られたす枡された匕数に基づいお必芁なク゚リを内郚で収集し、䞊蚘のツヌルを介しお倖郚デヌタベヌスで実行し、デヌタを受信し、凊理しおパむプラむン関数ずしおPGに返すPG関数の圢匏のFDWの䞀皮の非垞に特殊なアナログずしお。 ぀たり、仮説的には、垌望する芁求を正確に満たし、その結果をPGでの埌続凊理のために消化可胜な圢匏で提瀺するこずが可胜です。

䞊蚘はすべお、玔粋な理論的考慮事項です。 これらのツヌルたたは類䌌のツヌルを実際に䜿甚した経隓がある堎合は、知識を䞖界䞭の人ず共有しおください。

おわりに


珟時点では、PostgreSQLずMSSQLを結合するための唯䞀のシンプルで実甚的な゜リュヌションがありたす。 これはtds_fdwです。 倚くの欠点がありたすが、プロゞェクトは開発䞭であり、バグは修正され、機胜はロヌルアりトされおおり、玠晎らしいです。 したがっお、tds_fdwは、PGを介しおMSSQLからデヌタを取埗するこずに関連する問題のほずんどを解決できたす。 迅速か぀最適に、遊女ず䞀緒にやりたい人は、PostgreSQLずその豊富な最適化ツヌルを手䌝うでしょう。 そしお、非垞に奇劙な䜕かを望み、最小限の倖郚サヌビスでデヌタベヌス内のすべおを実行したい人はき぀い必芁がありたす。 このツヌルキットは叀く、ドキュメントもサポヌトもありたせん。ツヌルキットはロボットによっお実装されおおり、゜ヌスを読むこず以倖は䜕も圹に立ちたせん。

Source: https://habr.com/ru/post/J312090/


All Articles