I also read some codes in the samples, and found that an object consisting of triangles is often put into a Geometry.
What if I put a single triangle into a Geometry, and build a GeometryInstance from the Geometries?
I notice that Acceleration is bound to GeometryInstance, so I don’t understand the difference between the two choices.

The Geometry holds the data describing your geometric primitives as well as the bounding box program to build the BVH acceleration structure inside OptiX and the intersection program in which you calculate the actual intersection with whatever geometric primitive you define.

The GeometryInstance on top of that combines one Geometry node with with a Material. The Material holds the anyhit and/or closesthit programs for all raytypes. That way you define the visibility and behavior of the material.

Only OptiX scene nodes with “Group” in the name can hold an acceleration structure. It’s not at GeometryInstance level, it’s at the GeometryGroup above it. That way you can share identical Acceleration structures among different GeometryGroups if all geometry below them is identical.