Pergunta
· Nov. 15, 2020

Como fazer um GET no valor de seletividade de uma propriedade de tabela

Caché: 2017.2.1.801.0

Fala pessoal, tenho uma dúvida relacionada um problema especifico que eu estou tentando entender, onde ainda não tenho muitas informações, porém estou tentando criar uma forma de levantar dados precisos para expor mais detalhes aqui na comunidade ou até mesmo consultar o suporte da IS, a questão é muito simples:

Precisava saber através de código/rotina a seletividade de uma propriedade de tabela, atualmente consigo realizar um SET utilizando o comando:

SYSTEM.SQL.SetFieldSelectivity("#PACOTE","#TABELA","#PROPRIEDADE","#SELETIVIDADE","")

Porém não consegui encontrar um método GET que me retorne esse valor.

Apenas para compartilhar o problema (lembrando que não tenho muitas informações sobre ele):

"Em algumas tabelas com uma quantidade significativa de registros (acima de 5 milhões de registros), o TUNE TABLE está calculando seletividade 0,0000%, fazendo com que o plano de consulta ignore o índice e assim, me obrigando a alterar manualmente para 0,0001%" 

Estou iniciando na comunidade e espero poder contribuir bastante por aqui também!

Discussão (3)1
Entre ou crie uma conta para continuar

Fala @Arian Botine beleza?

Eu não encontrei um método "Get" para retornar o valor Selectivity como menciona na questão acima.

No pacote %SYSTEM.SQL, tem o ClassMethod GetMapSelectability

Mas ele vai te retornar apenas 0 ou 1, conforme descrito aqui na documentação:

https://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=%25SYS&CLASSNAME=%25SYSTEM.SQL#METHOD_GetMapSelectability 

Returns: The method returns 1 if the map is selectable. If the map is not selectable, 0 is returned. If the Selectability of the map cannot be determined, a message string will be returned.

Se você analisar um outro pacote %Dictionary, vai se deparar com a classe persistente %Dictionary.StoragePropertyDefinition 

https://cedocs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=SAMPLES&CLASSNAME=%25Dictionary.StoragePropertyDefinition

Essa tabela tem uma coluna chamada Selectivity. 

Veja se com essas informações você consegue chegar na sua solução. 

Depois compartilha conosco.

Abraços

Henrique, boa tarde.

A propriedade Selectivity é exatamente o que preciso, ja fiz o teste :)

Eu estava tão focado em encontrar um método ou uma rotina "pronta" para isso que não explorei a %Dictionary, muito obrigado pelo apoio!

Fiz da seguinte forma:

SELECT Selectivity FROM %Dictionary.StoragePropertyDefinition WHERE parent = '<TABELA>||Default'

Assim posso criar uma rotina dinâmica para identificar as seletividades que ficam como 0.0000% e tentar encontrar um padrão, acredito que levará tempo, visto que é um problema que ocorre com uma frequência muito pequena, mas assim que tiver mais detalhes, volto a falar nesse assunto.