У меня проблема с оконными функциями в MySQL8 - они дают неверные результаты при применении к большим таблицам (либо: большое количество строк или большое количество столбцов).
Пример:
Таблица: bureau.csv (1,7 млн. Строк) из https://www.kaggle.com/c/home-credit-default-risk/data
Я выполняю 3 простых запроса, меняя только количество строк в таблице и количество столбцов, которые нужно вычислить. Вы можете ясно видеть, что комбинация большого количества строк и большого количества столбцов с ошибками дает неверные результаты «count (*) over ()» - последний столбец.
большое количество строк, небольшое количество столбцов - результат: ОК;
большое количество строк, большое количество столбцов - результат: НЕПРАВИЛЬНО;
небольшое количество строк, высокое количество столбцов - результат: ОК;
Ubuntu 16.04, 32 ГБ ОЗУ
Большое спасибо за Вашу помощь! :)
Витольд
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
;
редактирование:
объяснение и указатели картинка
И еще одна вещь, которую я заметил: на рисунке «НЕПРАВИЛЬНО» все столбцы неверны (не только последний) - сравните с изображениями с «ХОРОШИМ» результатом »(посмотрите на sk_id_curr).
По просьбе Уилсона Хаука: A) завершить (не редактировать) my.cnf-ini Текстовые результаты: B) SHOW GLOBAL STATUS; В) ПОКАЗАТЬ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ; D) ПОКАЗАТЬ ДВИГАТЕЛЬ INNODB STATUS; ШОУ CREATE TABLE бюро;
часть1
часть2
Пример 1000 строк в БД Fiddle: https://www.db -fiddle.com / f / fzXsN6vFzidhanxeUjWkiB / 0
То, как я импортировал данные в mysql:
Сначала Я заменил «пробелы» в csv на «NULL» в python:
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
;