問題
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サーバーの使用を否定するでしょうね。