Pergunta

Estou fazendo esta pergunta em nome de um pequeno grupo de meus usuários que têm esse problema.

Uma vez que o script que eles estão usando chega ao ID 21, ele gera o seguinte erro:

O SELECT examinar mais de linhas max_join_size; verificar o seu ONDE e SQL_BIG_SELECTS uso SET = 1 ou SET SQL_MAX_JOIN_SIZE = # se o SELECT é OK

Eu pesquisei isso, tanto quanto possível e encontrou uma espécie de resposta: http://dev.mysql.com/doc/refman/5.0/en/set-option.html

O problema é que eles estão em hospedagem compartilhada para que eles não podem mudar suas configurações do MySQL para corrigir os erros.

Existe algo que eu possa escrever no meu script de modo que eles não têm este problema?

Esta é a função que gera a consulta da base de dados com base no qual os módulos são carregados: $ Sql ??= 'SELECT a.id como id, a.address como endereço';

        $query  = 'SELECT'
                . ' name AS module_name'
                . ', databasename AS module_database'
                . ', pregmatch AS module_pregmatch'
                . ', pregmatch2 AS module_pregmatch2'
                . ', html AS module_html'
                . ', sqlselect AS database_sqlselect'
                . ', sqljoin AS database_sqljoin'
                . ', sqlupdatewithvalue AS database_sqlupdatewithvalue'
                . ', sqlupdatenovalue AS database_sqlupdatenovalue'
                . ' FROM #__aqsgmeta_modules'
                . ' WHERE enabled = 1'
                . ' ORDER BY id';                       
        $db->setQuery($query);
        $results = $db->loadObjectList();
        if (count($results) != 0) {
            foreach ($results as $result) {
                $sqlselect .= ', ';
                $sqlselect .= $result->database_sqlselect;

                $sqljoin .= ' ';
                $result->database_sqljoin = preg_replace('/\{DATABASENAME\}/Ui', $result->module_database, $result->database_sqljoin);
                if (!(preg_match("/" . $result->database_sqljoin . "/Ui", $sqljoin))) 
                    $sqljoin .= $result->database_sqljoin;
            }
        }

        if ($use_sh404sef)
            $sqlselect .= ', g.oldurl AS sefurl';
        $sql .= $sqlselect;
        $sql .= ' FROM #__aqsgmeta_address AS a';
        $sql .= $sqljoin;

        if ($use_sh404sef)
            $sql .= ' LEFT JOIN #__redirection AS g ON g.newurl = a.address';

        $sql .=
        //. ' WHERE a.id IN (' . $cids . ')'
        ' WHERE a.id = ' . $id
        . ' ORDER BY a.address asc,a.id '
        ;
        $db->setQuery($sql);
        $rows = $db->loadObjectList();
Foi útil?

Solução

MAX_JOIN_SIZE é uma trava de segurança comumente utilizado nas hostings compartilhados.

Ele não vai deixar você executar acidentalmente longas consultas que iria pendurar o servidor.

Emitir este comando:

SET SQL_BIG_SELECTS = 1

antes de executar a consulta que você sabe para retornar lotes de valores.

Outras dicas

O MAX_JOIN_SIZE é atingido quando o MySQL calcula o produto cartesiano de uma junção, não os registros reais esperados de volta. Portanto, se você está se juntando a uma mesa enorme para outra mesa enorme, isso vai aumentar. Use índices e exibições para aparar as possíveis sucessos de mesa se é realmente tão grande.

Veja mais aqui: MySQL - SQL_BIG_SELECTS

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top