O objetivo deste artigo é realizar a navegação paginada de big data e otimizar a velocidade.
Para construir uma aplicação web, a função de navegação de paginação é essencial; este problema também é o problema mais comum há muito tempo e está bem resolvido. Entre eles, existem muitos algoritmos de paginação para programas ASP, como o uso do. Atributos PageSize do objeto ado. Calcular páginas com base no número total de registros, depois pular para o conjunto de registros e gerar também maneiras de escrever procedimentos armazenados para implementar dados de paginação. . Abaixo apresentarei um algoritmo de paginação que é muito rápido em projetos reais
: SQL (Implementado usando TOP e numeração automática);
script de página (função de fallback do navegador)
:
IIS/SQL Server/Acesso
Estrutura da tabela:
criar tabela de conteúdo da tabela (
Número automático IDENTITY(int, 1,1) não nulo,
Código de classificação<I>var</I>char(20) null,
Título<I>var</I>char(255) NULL,
Conteúdo<I>var</I>char(4000) nulo,
hora datahora nulo,
)
Princípio de implementação:
Esta tabela é configurada com um campo de numeração automática. A característica deste campo é gerar modelagem não duplicada, inclusive que o campo ainda permanecerá 'fluido' após a exclusão do registro (Observação: Geralmente na construção de tabelas do sistema isso ocorre). O campo raramente é usado porque o número não pode ser gerenciado livremente, mas é usado aqui principalmente porque desejo omitir o código para manutenção do número no artigo).
Paginação:
Então a primeira etapa é consultar os dados de uma página; se houver 100 registros e 20 registros forem usados para uma página, então o algoritmo de paginação usual é "Número total de páginas = total de registros dividido pelo número de controle de paginação [Se há um resto, o número total de páginas mais um]", esta abordagem leva à necessidade de gerar um grande conjunto de registros de todos os registros; portanto, algumas pessoas propuseram o uso do algoritmo de paginação de procedimentos armazenados. O primeiro é um asp script para gerar um grande conjunto de registros, que é bastante lento, e o último está matando galinhas. Embora eu frequentemente escreva procedimentos armazenados, acho que escrever procedimentos armazenados é completamente redundante.
No SQL, muitos amigos que são novos conhecem a função da palavra-chave Top modificada, por exemplo: select TOP 1 * from table1 - Dessa forma, um conjunto de registros com apenas um registro é retornado da tabela Table1; o objetivo da otimização da paginação é evitar que a geração de um conjunto de registros excessivamente grande possa ser totalmente controlada por meio de TOP, agora a tabela de consulta deve selecionar a numeração automática, título, conteúdo e hora dos 20 principais na tabela de conteúdo;
Mas agora ainda há um problema, ou seja, como posicioná-lo. É impossível para o Top posicionar e gerar automaticamente uma determinada página para nós. É aqui que a cláusula é projetada para gerar o conteúdo correto de acordo com uma condição específica; nota: a ordem de classificação dos registros é muito importante, isso determina o sucesso ou o fracasso deste algoritmo;
A demonstração aqui é o método DESC, organizado em ordem inversa. Por exemplo, para atualizações de software em um site, a atualização mais recente é colocada primeiro, e este é o método de ordem inversa.
OK, vamos dar uma olhada no código real. Primeiro, precisamos determinar se é a página inicial.
dim strSQL,i,endID,isBeginPage
const Cnt_PageSize = 20 'Define o tamanho de cada página de registros
'Determine se é uma operação para entrar na próxima página verificando o valor do parâmetro Page passado pelo navegador
isBeginPage = isEmpty(request("Página")) ou request("Página")="" ou request("Página")<>"próximo"
'Aqui está o núcleo da paginação
if isBeginPage then 'Se for a página inicial
'Query = Listar os registros cujo código de classificação é igual ao parâmetro flbm, em ordem inversa, e listar apenas a primeira pena Cnt_PageSize (Cnt_PageSize é uma definição constante, como 20)
strSQL = "select TOP " & Cnt_pageSize & " numeração automática, título, conteúdo, hora da tabela de conteúdo onde codificação de classificação = '" & TRIM(SQLEncode(request("flbm"))) & "' ordenar por numeração automática desc"
else 'se não for a página inicial
if request("Page")="next" then 'Isso está escrito aqui para melhorar o desempenho do código. Se o parâmetro for o próximo, significa pegar o conteúdo da página.
'Query = Listar os registros cujo código de classificação é igual ao parâmetro flbm e deve ser menor que o número automático endID (endID também é um parâmetro), e ordená-los na ordem inversa, e listar apenas a primeira caneta Cnt_PageSize (Cnt_PageSize é um definição constante, como 20)
strSQL = "select TOP " & Cnt_pageSize & " numeração automática, título, conteúdo, hora da tabela de conteúdo onde codificação de classificação = '" & TRIM(SQLEncode(request("flbm"))) & "' e numeração automática<" & request ("endID") & "ordenar por número automático desc"
Terminar se
end if
'Abra a conexão de dados para executar SQL e criar um conjunto de registros
definir rs = Cnn.Execute (strSQL)
se não rs.Eof então 'Escreva aqui para determinar se é Eof Não é necessário, mas tem um significado especial aqui.
call TableTitle 'Aqui está uma função escrita por você mesmo usada para criar tags de tabela
chame startTr 'Aqui está a marca tr para criar a tabela
para i=0 para rs.fields.Count-1' Percorra os campos do conjunto de registros
chame AddCol(rs(i).name) 'Nome do campo de saída
Próximo
chame endTr
enquanto não rs.eof 'Repetir o conteúdo do conjunto de registros e gerar
chame BeginTr
para i = 0 para rs.fields.Count-1
chamar AddRow(ASPEncode(rs(i).value))
Próximo
chamada finalTr
endID = rs("numeração automática") 'Aqui salva o valor da numeração automática de cada saída
rs.MoveNext
Wend
call TableBottom 'Até agora, simplesmente produza todo o conteúdo do conjunto de registros
'A marca de virada de página é exibida aqui, vbaIIF é uma função autoescrita
O protótipo é <I>função</I> vbaIIF(a,b,c)
se um então
vbaIIF=b
outro
vbaIIF =c
terminar se
fim <I>função</I>
A implementação da página anterior é obtida chamando a função do navegador history.back(1) por meio de um script. Assim, não há necessidade de regenerar os dados no lado do servidor ao retornar à página, e a velocidade não precisa ser considerada. .
Quando estiver na página inicial, o link para a página anterior deve ser inválido. Isso é feito por meio de vbaIIF(isBeginPage, "disabled", ""). não a página inicial, adicione o comando de script history.back (1);
A próxima página deve passar o parâmetro Page e o parâmetro endID Page é definido como next para indicar a ação da próxima página endID indica o número final do conjunto de registros atual, e a próxima página será paginada a partir deste.
response.Write("〈a href=""#"" onclick=""java<I>script</I>:" & vbaIIF(isBeginPage,"","history.back(1);") & "" " " & vbaIIF(isBeginPage," desativado ","") & "〉Página anterior〈/a〉|〈a href=""TypeOptions.asp?flbm=" & request("flbm") & "&Page=next&endID = " & endID & """〉Próxima página〈/a〉")
outro
'Aqui, ao avaliar se o conjunto de registros está vazio, podemos resolver o problema de continuar a virar as páginas até a última página.
se não for isBeginPage então
'Determine se é um registro vazio e não é a página inicial e, em seguida, gere um script para a página de reversão. O efeito é que após entrar na página, ele retornará automaticamente à página anterior.
resposta.Write "〈<I>script</I> idioma=java<I>script</I>〉" & vbCrlf
Resposta.Write "history.back(1);"
Resposta.Escreva "〈/<I>script</I>〉"
Resposta.Fim
else 'Se for o registro da página inicial, estará vazio e avisará que não há conteúdo.
Response.Write "〈font color=blue〉Não há conteúdo nesta categoria〈/font〉"
terminar se
fimSe
Resumo: Por meio de scripts front-end e habilidades de consulta SQL, os programas de paginação de alto desempenho são simples e rápidos.
Espero que os pares possam criar melhores algoritmos de paginação de dados em tempo real.
Observação: como o fórum limita os caracteres HTML, os símbolos principais estão presentes. Letras maiúsculas chinesas.