none
Index Seek e Key lookup com PK e Partição RRS feed

  • Pergunta

  • Bom dia,

    Eu tenho uma tabela que é particionada por trimestre, usando um campo chamado TABLEID (INT)

    Faço um select nela que utiliza a chave primária (que é nonclustered).

    Minha dúvida é: nesse select que uso a chave primária, não importa se filtro pelo meu campo TABLEID ou não, no plano de execução ele sempre me mostra que, tanto na operação de Index Seek, quanto na operação de Key Lookup, ele está utilizando o TABLEID.




    Qual exatamente é a relação da chave primária da tabela com o meu particionamento?

    OBS. Pelo profiler vejo que as duas consultas tem o mesmo consumo de recursos.

    Muito obrigada pela ajuda!


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    segunda-feira, 7 de maio de 2012 14:28

Respostas

  • Mariana,

    Certo, você esta utilizando Partition Function em conjunto com Filegroups distintos.

    Em relação a sua dúvida, vou tentar responder:

    1 - No meu WHERE eu uso a chave primária. O que eu queria entender é: se eu usar só a chave primária no WHERE, tanto no Index Seek quanto no Key Lookup ele usa o campo TABLEID, que é o campo utilizado na função de particionamento.

    -- Sim o campo será utilizado pelo plano de manutenção com base na análise realizado pelo Query Optimizer.

    Então, nao importa se eu coloco no WHERE o TableID ou não, ele sempre é utilizando no plano de execução.

    -- Isso mesmo se existe um índice que é a chave primária, por padrão este será invocado.

    Eu queria entender porque o SQL Server, quando eu estou usando uma PK como filtro, ele utiliza também meu campo de particionamento.

    -- Por você estar trabalhando com particionamento, o SQL Server precisa de um mecanismo inteligente e que faça a amarração dos dados dentro da partição, como indicar de pesquisa e retorno dos dados.

    Se eu estivesse utilizando qualquer outro campo no WHERE que não fosse PK, eu teria que, explicitamente, colocar o campo de particionamento no WHERE.

    --Sim, você teria que passar para o Where este indicador, ou até mesmo no seu order by.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 7 de maio de 2012 17:11

Todas as Respostas

  • Mariana,

    Você esta utilizando um particionamento horizontal de dados, dividindo por trimestre em tabelas distintas?

    Como você esta fazendo uso da chave primária, o plano de manutenção esta fazendo uso de mecanismo como forma de pesquisa e obtenção dos dados.

    Mesmo que você não utilize a chave primária no Where, por padrão o SQL Server vai utilizar esse recurso no query optimizer para tentar identificar a melhor forma de execução desta instrução.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 7 de maio de 2012 16:39
  • Junior,

    Meu particionamento divide minha tabela trimestralmente em filegroups diferentes. A tabela é uma só.

    No meu WHERE eu uso a chave primária. O que eu queria entender é: se eu usar só a chave primária no WHERE, tanto no Index Seek quanto no Key Lookup ele usa o campo TABLEID, que é o campo utilizado na função de particionamento.

    Então, nao importa se eu coloco no WHERE o TableID ou não, ele sempre é utilizando no plano de execução.

    Eu queria entender porque o SQL Server, quando eu estou usando uma PK como filtro, ele utiliza também meu campo de particionamento.

    Se eu estivesse utilizando qualquer outro campo no WHERE que não fosse PK, eu teria que, explicitamente, colocar o campo de particionamento no WHERE.

    obrigada!


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    segunda-feira, 7 de maio de 2012 16:43
  • Mariana,

    Certo, você esta utilizando Partition Function em conjunto com Filegroups distintos.

    Em relação a sua dúvida, vou tentar responder:

    1 - No meu WHERE eu uso a chave primária. O que eu queria entender é: se eu usar só a chave primária no WHERE, tanto no Index Seek quanto no Key Lookup ele usa o campo TABLEID, que é o campo utilizado na função de particionamento.

    -- Sim o campo será utilizado pelo plano de manutenção com base na análise realizado pelo Query Optimizer.

    Então, nao importa se eu coloco no WHERE o TableID ou não, ele sempre é utilizando no plano de execução.

    -- Isso mesmo se existe um índice que é a chave primária, por padrão este será invocado.

    Eu queria entender porque o SQL Server, quando eu estou usando uma PK como filtro, ele utiliza também meu campo de particionamento.

    -- Por você estar trabalhando com particionamento, o SQL Server precisa de um mecanismo inteligente e que faça a amarração dos dados dentro da partição, como indicar de pesquisa e retorno dos dados.

    Se eu estivesse utilizando qualquer outro campo no WHERE que não fosse PK, eu teria que, explicitamente, colocar o campo de particionamento no WHERE.

    --Sim, você teria que passar para o Where este indicador, ou até mesmo no seu order by.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 7 de maio de 2012 17:11
  • Junior, muito obrigada pelas respostas!!!

    []'s


    Mariana Del Nero /* Se a resposta foi útil, não esqueça de marcá-la */

    segunda-feira, 7 de maio de 2012 19:48