0

这是我的第一篇文章,我真的需要帮助......我得到了这个场景......

  1. 从 dbf 文件中导出数据
  2. 将 dbf 文件数据保存到普通文件中,所有值由“,”分隔
  3. 然后我净化数据并只取我需要的字段
  4. 取这些字段名称并在 mysql 上创建表
  5. 将数据导入mysql(加载数据infile)
  6. 处理数据并获得计算值
  7. 使用这些值生成 csv

所以....直到第6步一切都好,但是当我尝试导出查询时一切都出错了,数据永远不会输出....大约运行2天,没有任何反应....仍在处理但没有输出

这是查询:

SELECT (DATE_FORMAT(NOW(), '%Y%m%d')),'0001391343',
IFNULL(LPAD(UPPER(TCPCB.CODICLIE), 10, '0'), "          "),'VE0801',
(SELECT IFNULL(LPAD(REPLACE(IFNULL(SUM(C.MONTO),0), '.', ''), 15, '0'),
   '000000000000000') FROM TCPCB C WHERE C.SIGNO = "D" AND C.CODICLIE = TCPCB.CODICLIE),
(SELECT IFNULL(LPAD(REPLACE(IFNULL(SUM(C.MONTO),0), '.', ''), 15, '0'),
   '000000000000000') FROM TCPCB C WHERE C.SIGNO = "C" AND C.CODICLIE = TCPCB.CODICLIE),
(SELECT IFNULL(LPAD(REPLACE(((SELECT IFNULL(SUM(C.MONTO),0) FROM TCPCB C 
   WHERE C.SIGNO = "D" AND C.CODICLIE = TCPCB.CODICLIE)-(SELECT IFNULL(SUM(C.MONTO),0)
   FROM TCPCB C WHERE C.SIGNO = "C" AND C.CODICLIE = TCPCB.CODICLIE)), '.', ''), 15, '0'),
   '000000000000000')),
IFNULL(LPAD(UPPER(TCPCB.SIGNO), 1, ' '), " "),
IF(((((SELECT IFNULL(SUM(C.MONTO),0) FROM TCPCB C WHERE C.SIGNO = "D" AND C.CODICLIE = TCPCB.CODICLIE)-
   (SELECT IFNULL(SUM(C.MONTO),0) FROM TCPCB C WHERE C.SIGNO = "C" AND C.CODICLIE = TCPCB.CODICLIE))*
   DAY(LAST_DAY(NOW())))/
   (SELECT IFNULL(SUM(TOTADOCU),0) FROM TFACHISA WHERE TIPODOCU = "FA" AND CODICLIE = TCPCB.CODICLIE)-
   (SELECT IFNULL(SUM(TOTADOCU),0) FROM TFACHISA WHERE TIPODOCU = "DV" AND CODICLIE = TCPCB.CODICLIE)) < 0, "   0",
   LPAD(ROUND(((((SELECT IFNULL(SUM(C.MONTO),0) FROM TCPCB C WHERE C.SIGNO = "D" AND C.CODICLIE = TCPCB.CODICLIE)-
   (SELECT IFNULL(SUM(C.MONTO),0) FROM TCPCB C WHERE C.SIGNO = "C" AND C.CODICLIE = TCPCB.CODICLIE))*
   DAY(LAST_DAY(NOW())))/
   (SELECT IFNULL(SUM(TOTADOCU),0) FROM TFACHISA WHERE TIPODOCU = "FA" AND CODICLIE = TCPCB.CODICLIE)-
   (SELECT IFNULL(SUM(TOTADOCU),0) FROM TFACHISA WHERE TIPODOCU = "DV" AND CODICLIE = TCPCB.CODICLIE)),0), 4, " "))
INTO OUTFILE 'C:\\Users\\username\\Desktop\\gg.csv'
    FIELDS TERMINATED BY ';'
    ENCLOSED BY ''
    ESCAPED BY ''
    LINES TERMINATED BY '\n'
FROM TCPCB
INNER JOIN TFACHISA ON TFACHISA.CODICLIE = TCPCB.CODICLIE
WHERE 1 GROUP BY TCPCB.CODICLIE

关于这个的事情是....如果我删除 outfile 行一切都很好,在 7 秒内得到结果....(1.844 d / 7.703 f)....引擎是 MyISAM

PD:使用 myisam 因为我只需要读取数据和过程值,然后我删除所有内容并保留 csv ......原谅我的英语......

谢谢!!

更新:

现在的过程是服务器端的 conf,尝试全新安装,一切都很好,但现在当我使用 where 条件失去连接时,查询永远不会返回数据......只有 where 条件或内部连接。

解决了:

很长一段时间,但终于解决了,使用 MyISAM 并在主要字段中使用多索引....但是,存储过程在这里是个好主意...谢谢!

4

1 回答 1

0

我有一个类似的问题,它花费了太长时间,因为它在运行查询时将结果写入文件,这非常慢,特别是如果您要转储 CSV 的硬盘与数据库所在的硬盘相同存储。

解决方案只是将原始查询打包到另一个SELECT查询中。

所以,而不是

SELECT * 
FROM tableA a INNER JOIN tableB b 
ON (a.b_id = b.id) 
INTO OUTFILE 'C:\\Users\\username\\Desktop\\gg.csv'

利用

SELECT *
FROM (SELECT *
      FROM tableA a INNER JOIN tableB b 
      ON (a.b_id = b.id)) tm 
INTO OUTFILE 'C:\\Users\\username\\Desktop\\gg.csv'

这确保您首先运行查询,然后将所有内容写入文件。应该有一个更好的解决方案,比如只更改一个配置变量,避免每次都通过磁盘写入,但这已经对我有用。

于 2018-04-27T22:21:28.647 回答