当我将某些类型的SQL查询中的数据读入pandas数据帧时遇到性能问题。我首先使用以下代码在Azure中查询SQL DB:
cnxn = pyodbc.connect(db_conn_str)
starttime = timeit.default_timer()
sql = "Select * from table where var1 != 'a' and var2 = 'b' and var3 = 'c' and var3 = 'd'"
outdata = pd.read_sql(sql, cnxn)
print("Elapsed time :", timeit.default_timer() - starttime)
这通常需要20到30秒左右的时间。如果我重新运行上述查询,或者如果我在接下来的20分钟左右的时间内运行了另一个查询,其中“ a”,“ b”,“ c”和“ d”不同,则查询仅需约0.5秒。经过20分钟后,下一次此类查询将花费20-30秒。
其他类型的查询需要更短的时间(例如,我仅限制使用var2的查询),并且我尝试过先运行这些查询,但是使用上述代码进行的第一个查询仍然需要20-30秒。
我想这与SQL DB有关吗?有人可以解释为什么我看到这种情况吗?有什么方法可以防止第一个查询花费更长的时间?
正如Gordon指出的那样,索引很重要,您需要解决SQL语句中的冲突。你是这个意思吗
同样,考虑是否需要所有这些语句也是一个好主意。 var1是a,var2不是b,而var3是c或d以外的东西,有多少行?如果数量非常少,则可能要考虑在代码中而不是SQL语句中过滤结果。
有时,您可以通过where子句中的子查询(WHERE var IN(a,b,c)和var NOT IN(b,e)),或者通过选择单个列或count(*)而不是*来看到性能提高。
希望这对您有所帮助:)
对于此查询:
I would recommend an index on
(var2, var3, var4, var1)
. The query will then use this index to find the rows you want. The query can still take a long time if the result set is large.就是说,您面临的问题听起来像是“冷缓存”问题。您没有指定数据库,但是通常,数据库开始时内存中没有数据。当您获取数据页或索引页时,数据库会将它们缓存在内存中,因此后续访问要快得多。