1

問題

Python、具体的には SQLalchemy、pymssql、および pandas.read_sql を使用して、MS SQL Server のテーブルを読み込もうとしています。クエリを実行し、結果を pandas データフレームに入れ、妥当な速度で 1 日を続けたいのですが、かなり単純なクエリ (出力 = 100 MB) は、イーサネットを使用した LAN 接続でほぼ 5 ~ 10 分かかります。ケーブル - Wi-Fi が見えない。

3 つの列と 3214086 のエントリを持つ結果のデータフレームには、なんと 423 秒かかりました。次の情報():

Int64Index: 3214086 entries, 0 to 3214085
Data columns (total 3 columns):
DateTime    datetime64[ns]
TagName     object
Value       float64
dtypes: datetime64[ns](1), float64(1), object(1)
memory usage: 98.1+ MB
None

私の計算が正しければ、423 秒で 100 MB は約 230 kB/s であり、イーサネット接続では非常に遅いと思います。ボトルネックはSQLサーバー自体にある必要があります


クエリ情報

SQL サーバー自体は Wonderware のセットアップであり、それと関係がある場合とない場合があります。次のクエリでは、1 か月のタイムスパンで 6 つの異なるタグの値を求めています。解像度は 5000 ミリ秒 (5 秒) です。

クエリ自体は次のようになります。

sql_query = '''
SELECT DateTime, TagName, Value

    FROM Runtime.dbo.AnalogHistory

    WHERE
        DateTime BETWEEN '2014-05-26 00:00' AND '2014-06-26 00:00'
    AND 
        TagName IN (
            'Tag1.ActualValue', 
            'Tag2.ActualValue', 
            'Tag3.ActualValue', 
            'Tag4.ActualValue', 
            'Tag5.ActualValue', 
            'Tag6.ActualValue')
    AND
        wwRetrievalMode = 'Cyclic'
    AND
        wwResolution = 5000
'''

そして最後に、executeQuery 関数:

import pandas as pd
import pymssql
import sqlalchemy

def executeQuery(sql_query):
    connection_string = 'mssql+pymssql://user:password@server'
    engine = sqlalchemy.create_engine(connection_string)

    df = pd.read_sql(sql_query, engine)

    if 'DateTime' in df.columns:
        df.DateTime = pd.to_datetime(df.DateTime, infer_datetime_format=True)

    return df

質問

何が起きてる?これは私が使用しているパッケージの 1 つの制限ですか、それとも私が持っているものでスピードアップできますか?

この質問は、OPがSQLサーバーに書き込もうとしていたという事実に関連しているようです。そこには、.csv ファイルを使用して pandas を使用する代わりに「BULK INSERT」を使用する方が高速であると記載されていますが、それは SQL サーバーから読み取るための実行可能なオプションではありません。すべての日付/時刻とすべてのタグの .csv ファイルを含むディレクトリが必要でしょうか!? それはそもそもSQLサーバーの使用を否定するでしょうね。

4

1 に答える 1