Usuário com melhor resposta
Sequence

Pergunta
-
Respostas
-
Thiago, Bom dia!
São coisas distintas, quando falamos de sequence estamos falando de informações sequenciais que podem ser utilizadas em N tabelas, o objeto sequence só esta disponivel a partir do SQL Server 2012, até o SQL Server 2008R2 temos a possibilidade de utilização de um campo IDENTITY por tabela, o problema deste é que ele não seria compartilhado entre quais tabelas voce quer e poderia gerar conflito, a solução para tal então é a criação de uma tabela de controle por ID e voce fazer uma programação (Uma proc por exemplo, ou função) que faça um select nesta tabela, agrege +1 e o utilize como sequence mas voce dever-a gerenciar esta informação.
Ja ROW LEVEL LOCKING é a maneira de acesso do SQL Server a pagina de dados, pense na seguinte situação, voce tem uma tabela com 1 milhão de registros e fez o update em uma linha apenas, em um lock a nivel de linha um select na mesma trara todas as linhas menos esta que foi atualizada (Dado N variações ta, como isolation level entre outros), ja um page lock o select não conseguira ver nenhuma linha daquela pagina de dados aonde houve uma alteração (Ainda que em apenas uma linha!), ja em table lock a tabela inteira estara indisponivel.
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 19 de fevereiro de 2013 19:30
- Marcado como Resposta Fabrizzio CaputoModerator quarta-feira, 20 de fevereiro de 2013 15:28
-
Thiago,
É realmente mais complexo, todo caso voce deve seguir regras:
- A primeira coisa que que se fazer é buscar este valor dentro de uma transação e atualiza-lo para o proximo, caso este não seja realmente utilizado, paciencia, perdeu-se um valor (Coisa que tambem aconteceria na sequence).
- Como organização eu criaria uma procedure para este processo.
- Cuidado com Locks, apesar de que a utilização desta tabela é rapida, mas caso o processo esteja contigo em uma transação com N outras ações que demoram, voce terá lock, monitore-os.
- Utilize o NoLock, não é uma boa recomendação sua utilização mas neste caso faz-se necessario.
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Marcado como Resposta Fabrizzio CaputoModerator quarta-feira, 20 de fevereiro de 2013 15:28
Todas as Respostas
-
Thiago, Bom dia!
São coisas distintas, quando falamos de sequence estamos falando de informações sequenciais que podem ser utilizadas em N tabelas, o objeto sequence só esta disponivel a partir do SQL Server 2012, até o SQL Server 2008R2 temos a possibilidade de utilização de um campo IDENTITY por tabela, o problema deste é que ele não seria compartilhado entre quais tabelas voce quer e poderia gerar conflito, a solução para tal então é a criação de uma tabela de controle por ID e voce fazer uma programação (Uma proc por exemplo, ou função) que faça um select nesta tabela, agrege +1 e o utilize como sequence mas voce dever-a gerenciar esta informação.
Ja ROW LEVEL LOCKING é a maneira de acesso do SQL Server a pagina de dados, pense na seguinte situação, voce tem uma tabela com 1 milhão de registros e fez o update em uma linha apenas, em um lock a nivel de linha um select na mesma trara todas as linhas menos esta que foi atualizada (Dado N variações ta, como isolation level entre outros), ja um page lock o select não conseguira ver nenhuma linha daquela pagina de dados aonde houve uma alteração (Ainda que em apenas uma linha!), ja em table lock a tabela inteira estara indisponivel.
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Sugerido como Resposta Junior Galvão - MVPMVP terça-feira, 19 de fevereiro de 2013 19:30
- Marcado como Resposta Fabrizzio CaputoModerator quarta-feira, 20 de fevereiro de 2013 15:28
-
Bom Dia,
Obrigado pela resposta.
em relação a simulação de uma sequence, esta solução que você descreveu é a que eu iria seguir, pelo menos é a mais sugerida pesquisando sobre esta situação. Mas como controlar a concorrência desta informação, quando duas chamadas da procedure forem executadas simultaneamente?
-
Thiago,
É realmente mais complexo, todo caso voce deve seguir regras:
- A primeira coisa que que se fazer é buscar este valor dentro de uma transação e atualiza-lo para o proximo, caso este não seja realmente utilizado, paciencia, perdeu-se um valor (Coisa que tambem aconteceria na sequence).
- Como organização eu criaria uma procedure para este processo.
- Cuidado com Locks, apesar de que a utilização desta tabela é rapida, mas caso o processo esteja contigo em uma transação com N outras ações que demoram, voce terá lock, monitore-os.
- Utilize o NoLock, não é uma boa recomendação sua utilização mas neste caso faz-se necessario.
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com- Marcado como Resposta Fabrizzio CaputoModerator quarta-feira, 20 de fevereiro de 2013 15:28