我在 MySQL8 中遇到了窗口函数的问题 - 它们在应用于大型表时会给出不正确的结果(或者:大量行或大量列)。
示例:表:来自https://www.kaggle.com/c/home-credit-default-risk/data的 Bureau.csv(170 万行)
我运行 3 个简单查询,仅更改要使用的表的行数和要输出的列数。您可以清楚地看到,大量行和许多输出列的组合给出了“count(*) over()”的错误结果 - 最后一列。
Ubuntu 16.04,32GB 内存
非常感谢您的帮助!:)
维托德
my.cnf:
[mysqld]
innodb_buffer_pool_size = 26G
default_authentication_plugin=mysql_native_password
thread_cache_size = 50
innodb-flush-method=O_DIRECT
local_infile=ON
innodb_thread_concurrency=2
internal_tmp_mem_storage_engine=MEMORY
join_buffer_size=1G
temptable_max_ram=4G
tmp_table_size=4G
max_heap_table_size=4G
mysqlx_connect_timeout=99999
mysqlx_read_timeout=99999
mysqlx_write_timeout=99999
net_read_timeout=99999
net_write_timeout=99999
regexp_time_limit=99999
mysqlx_port_open_timeout=99999
windowing-use-high-precision=OFF
sort_buffer_size=4G
要运行的代码:
select a.*
from
(
select #b.sk_id_curr,
b.*,
count(*) over(partition by b.sk_id_curr) as counter
from (select * from bureau limit 10000000) b
) a
order by a.sk_id_curr desc
limit 100
;
编辑: 解释和索引图片
还有一件事我注意到:在“不正确”图片中,所有列都不正确(不仅是最后一个) - 与“GOOD”结果的图片进行比较”(查看 sk_id_curr)。
根据 Wilson Hauck 的要求:A)完整(未编辑)my.cnf-ini 文本结果:B)显示全球状态;C) 显示全局变量;D) 显示 ENGINE INNODB 状态;SHOW CREATE TABLE 局; 第 1部分 第 2 部分
DB Fiddle 上的 1000 行示例:https ://www.db-fiddle.com/f/fzXsN6vFzidhanxeUjWkiB/0
我将数据导入mysql的方式:
首先,我将 csv 中的“空格”替换为 python 中的“NULL”:
import pandas as pd
bureau = pd.read_csv('../input/bureau.csv')
bureau.to_csv('../input/bureau2.csv',index=False,na_rep="NULL",header=True)
其次我在mysql中使用了代码:
LOAD DATA LOCAL INFILE '../input/bureau2.csv' INTO TABLE bureau
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
;