IIC2413 / Syllabus-2024-2

77 stars 9 forks source link

Duda taller 9 índices #302

Closed ignanuyens closed 6 days ago

ignanuyens commented 1 week ago

Hola, tengo una duda en la pregunta 1, parte III.

Nos piden un factor de carga 1, pero en la solución ponen la función hash como key mod 100, cuando en realidad existen 1000 tuplas. No me hace sentido que sea así para un factor de carga 1.

También quería preguntar si efectivamente no existe alguna diferencia al definir un índice clustered con uno unclustered, o bien un índice primario o uno secundario, en el código.

Muchas gracias de antemano

calvarezl-cl commented 1 week ago

Hola

Con respecto a la primera pregunta, un factor de carga 1 significa que todas los buckets de un índice hash o hojas de un B+ tree ya tienen un registro asociado. Por lo tanto al elegir 100 u otro valor que sea menor o igual que 1000 van a estar todos los índices ocupados.

La diferencia entre índices clustered y unclustered es que en clustered en la página del índice (hoja b+ o bucket) están los datos de la tupla y en unclustered los punteros a la página donde están los datos de la tupla. Entonces en menos pasos se encuentra la tupla en índices clustered que unclustered.

Saludos, CAL

ignanuyens commented 1 week ago

Sigo teniendo una duda respecto al factor de carga. Creo que la respuesta me confundió más el concepto. Si me dices que "un factor de carga 1 significa que todas los buckets de un índice hash o hojas de un B+ tree ya tienen un registro asociado", no me calza con la definición que tengo entendida que es factor de carga=numero de tuplas (valores almacenados)/número de buckets (tamaño tabla hash). Por lo tanto, para el ejercicio del taller, si queremos que el factor de carga sea 1, tendríamos que preguntarnos por cuánto tengo que dividir a 1000 tuplas, para que me quede aproximadamente 1 tupla por bucket, lo cual sería 1.000. En otras palabras, el factor de carga es aproximadamente la cantidad de tuplas que tendré en cada bucket, por lo que si utilizamos mod 100 tendríamos 10 tuplas por bucket, pero el factor de carga sería 10, no 1. Por eso creo que o la pauta está mal, o yo tengo un error de concepto que me gustaría que me explicara.

Respecto a mi segunda pregunta, entiendo la diferencia de definición y de concepto, mi pregunta era en la definición en código. Ambos se definen como CREATE INDEX nombre ON Tabla(atributo)?? o tengo que hacer una diferenciación si es clustered o unclustered?? Porque la pauta del taller no hace una diferenciación pero no me hace mucho sentido.

Agradezco que expliquen con más detalle por favor. Gracias

ypne commented 1 week ago

adicionalmente, según la estructura usada, una tabla de hash puede contener mas de una tupla (factor de bloqueo)

calvarezl-cl commented 1 week ago

Hola

Aclaro nuevamente, si quieres tener un factor de carga exactamente 1 (suponiendo una tupla por bucket) la función es mod 1000. Con mod 100 tienes 10 tuplas por bucket. En la pregunta no se especifica cuantas tuplas hay por bucket, por lo tanto cualquiera respuesta mayor a 1 es una respuesta factible.

Con respecto a la segunda consulta, la respuesta es depende de la BD. En la mayoría de las BD (ej: postgresql) toda llave primaria es clustered y no pueden existir 2 índices clustered a la vez.

Saludos, CAL

ignanuyens commented 1 week ago

Creo que entiendo la primera parte, gracias.

Respecto a la segunda, comprendo la definición y precisamente porque no pueden haber dos índices primario viene mi pregunta porque en taller no hacen una diferencia en la definición de código.

image

Cómo sabe el código que la segunda es un índice secundario? si es que no se le pone nada extra, a mi parecer los dos simulan ser primarios lo cual no se puede. Gracias

calvarezl-cl commented 1 week ago

Cuando los índices no son primarios, son secundarios. Ambos índices son secundarios, por lo tanto unclustered.

ignanuyens commented 1 week ago

Pero en teoría el primer índice era primario porque era para una llave primaria, por lo tanto estaría incorrecto decir que ambos son secundarios. Me podría dar un ejemplo de definición entre un índice clustered y uno unclustered por favor? En el formato de código tipo CREATE INDEX.... gracias

coniverav commented 1 week ago

quedé con la misma duda

calvarezl-cl commented 1 week ago

La sintaxis para crear un índice clustered es la siguiente:

CREATE CLUSTERED INDEX myIndex ON dbo.myTable(myColumn)

Saludos, CAL