1 votos

¿Por qué arcpy.GetCount_management y arcpy.ArcSDESQLExecute producen diferentes conteos de filas?

Estaba evaluando qué método era más rápido para contar el número de filas de una tabla, cuando ocurrió algo curioso:

import arcpy
import os
import time

test_tuple = ("path\to\connection", "feature_class_name")
fc = os.path.join(*test_tuple)

i = 0
while i < 3:
    # Method 1
    time.sleep(5)
    start_time = time.clock()
    count = int(arcpy.GetCount_management(fc).getOutput(0))
    end_time = time.clock()
    print("Method 1 ({count}) finished in {time} seconds".format(count=count, time=(end_time - start_time)))
    print("The count was: {count}".format(count=count))

    # Method 2
    time.sleep(5)  # Let the cpu/ram calm before proceeding!
    start_time = time.clock()
    query = """SELECT COUNT(*) FROM {}""".format(test_tuple[-1].upper())
    execute_object = arcpy.ArcSDESQLExecute(test_tuple[0])
    result = execute_object.execute(query)
    count = int(result)
    end_time = time.clock()
    print("Method 2 ({count}) finished in {time} seconds".format(count=count, time=(end_time - start_time)))
    print("The count was: {count}".format(count=count))
    i += 1

Esto dio los siguientes resultados:

Method 1 finished in 5.018752999999999 seconds
The count was: 22645
Method 2 finished in 0.24905560000000015 seconds
The count was: 21473
Method 1 finished in 0.7440046999999996 seconds
The count was: 22645
Method 2 finished in 0.7023353000000014 seconds
The count was: 21473
Method 1 finished in 0.7402944999999974 seconds
The count was: 22645
Method 2 finished in 0.684015500000001 seconds
The count was: 21473

¿Por qué los recuentos son diferentes entre los dos métodos?

4voto

Son of a Beach Puntos 184

Cuando se consulta la tabla de una clase de característica versionada (o archivada) directamente usando SQL, no se espera que sus resultados reflejen el estado actual de la clase de característica. En su lugar, debe utilizar la vista versionada. La tabla podría contener registros que han sido eliminados, o registros que han sido modificados, o pueden faltar registros que han sido añadidos.

Intenta cambiar la línea:

query = """SELECT COUNT(*) FROM {}""".format(test_tuple[-1].upper())

a:

query = """SELECT COUNT(*) FROM {}_EVW""".format(test_tuple[-1].upper())

Es decir, ejecutarlo contra la vista versionada, no contra la tabla. La vista versionada suele tener el mismo nombre que la tabla pero con "_evw" añadido y es lo que ArcGIS/arcpy estaría utilizando en realidad en el fondo y no la tabla directamente.

Si utiliza el versionado o el archivado, NUNCA debe interactuar directamente con la tabla de la base de datos fuera de ArcGIS, sino siempre con la vista versionada. De lo contrario, obtendrá datos no válidos, como datos superados, registros eliminados, registros que faltan, etc. (y si realiza ediciones directamente en la tabla, podría corromper su base de datos, en lo que respecta a ArcGIS).

ESRI tiene mucha documentación sobre este tipo de cosas. Por ejemplo:

y

1voto

Además de utilizar la vista versionada, hay que tener en cuenta la longitud del nombre de la tabla. En este caso, he descubierto que si se añade "_EVW" hasta el final del nombre de la tabla supera los 30 caracteres, se producirá un error. He solucionado esto con lo siguiente:

test_tuple = ("path\to\connection", "OWNER.table_name")
own, name = test_tuple[-1].split(".")
fc = os.path.join(*test_tuple)

desc = arcpy.Describe(fc)

query_name = test_tuple[-1]
char_limit = 30  # Oracle has a 30 character limit on table names
if desc.isVersioned:
    if len(name) + 4 > char_limit:  # +4 for the addition of "_EVW"
        query_name = ".".join([own, name[:char_limit - 4]])
    query = """SELECT COUNT(*) FROM {}_EVW""".format(query_name.upper())
else:
    if len(self.name) > char_limit:
        query_name = ".".join([self.owner, self.name[:char_limit]])
    query = """SELECT COUNT(*) FROM {}""".format(query_name.upper())

execute_object = ArcSDESQLExecute(self.connection)
result = execute_object.execute(query)
count = int(result)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X