Dapper caches query information like SQL statements and parameters to improve performance when materializing objects from query results. The cache is stored in a ConcurrentDictionary that is never flushed, so it could cause memory issues with dynamically-generated SQL. Queries using parameters are preferred since the cache key depends on the SQL and parameters, allowing caching of the execution plan. Buffering determines if all rows are loaded into memory before iterating. QueryMultiple is used for queries returning multiple result sets. Dirty tracking with interfaces allows Dapper to detect whether updates actually changed data to skip unnecessary SQL generation.