{"id":1449,"date":"2012-01-17T13:55:24","date_gmt":"2012-01-17T13:55:24","guid":{"rendered":"https:\/\/www.jose-aguilar.com\/blog\/?p=1449"},"modified":"2012-02-25T13:59:24","modified_gmt":"2012-02-25T13:59:24","slug":"diferencias-entre-truncate-table-y-delete-from","status":"publish","type":"post","link":"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/","title":{"rendered":"Diferencias entre TRUNCATE TABLE y DELETE FROM"},"content":{"rendered":"<p>Una duda bastante habitual entre los desarrolladores, es cu\u00e1l es la diferencia entre un TRUNCATE TABLE y un DELETE FROM TABLE. En este art\u00edculo vamos a hacer incapie en estas dos sentencias enumerando las diferencias y explicando su porque.<\/p>\n<table width=\"550\" border=\"0\">\n<tbody>\n<tr>\n<td width=\"50%\"><strong>TRUNCATE TABLE<\/strong><\/td>\n<td width=\"50%\"><strong>DELETE FROM<\/strong><\/td>\n<\/tr>\n<tr>\n<td>\n<ul>\n<li>Es una operaci\u00f3n DDL.<\/li>\n<\/ul>\n<\/td>\n<td>\n<ul>\n<li>Es una operaci\u00f3n DML.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<ul>\n<li>No permite el borrado selectivo. TRUNCATE TABLE elimina todo el contenido de la tabla.<\/li>\n<\/ul>\n<\/td>\n<td>\n<ul>\n<li>Permite el borrado selectivo, mediante la clausula WHERE.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<ul>\n<li>No se puede ejecutar, si la tabla tiene asociadas, aun si no existiesen registros en la tabla que contiene la FK.<\/li>\n<\/ul>\n<\/td>\n<td>\n<ul>\n<li>Se puede ejecutar si hay FK asociadas a la tabla, pero siempre y cuando no tenga registros asociados o la FK este deshabilitada.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<ul>\n<li>Es la forma m\u00e1s r\u00e1pida de eliminar el contenido de una tabla.<\/li>\n<\/ul>\n<\/td>\n<td>\n<ul>\n<li>Es m\u00e1s lenta.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<ul>\n<li>No se activa ning\u00fan trigger al ejecutarse (a partir de SQL Server 2005, es posible capturar el evento mediante un DDL trigger, pero a modo de auditor\u00eda, no es posible tener acceso a los valores que fueron eliminados).<\/li>\n<\/ul>\n<\/td>\n<td>\n<ul>\n<li>Puede activarse el trigger de ON DELETE y poder determinar que registros est\u00e1n siendo eliminados. siendo eliminados.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<ul>\n<li>En caso que la tabla tuviese un campo Identity, se resetea el valor a 1 (o al valor base determinado en el campo).<\/li>\n<\/ul>\n<\/td>\n<td>\n<ul>\n<li>No resetea el valor del campo Identity, en caso que la tabla tuviese uno.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<ul>\n<li>TRUNCATE TABLE desasocia (deallocate) las p\u00e1ginas de datos de la tabla.<\/li>\n<\/ul>\n<\/td>\n<td>\n<ul>\n<li>DELETE FROM marca cada registro afectado, como eliminado.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<ul>\n<li>El logueo en el transaction log es m\u00ednimo. Solo registra el dealloc de las p\u00e1ginas de datos.<\/li>\n<\/ul>\n<\/td>\n<td>\n<ul>\n<li>Loguea cada operaci\u00f3n sobre los registros afectados.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<ul>\n<li>No puede ser ejecutado si la tabla tiene asociadas vistas indexadas.<\/li>\n<\/ul>\n<\/td>\n<td>\n<ul>\n<li>Se puede ejecutar si la tabla tiene vistas indexadas.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Como podemos ver, TRUNCATE TABLE es bastante m\u00e1s restrictivo que DELETE, al punto que en muchas situaciones, aun si queremos eliminar todo el contenido de la tabla, no podemos hacerlo.<\/p>\n<p>Ahora bien, que es lo que hace TRUNCATE y porque es mas r\u00e1pido que su \u201ccompetidor\u201d?<\/p>\n<p>Para eso primero voy a hacer una brev\u00edsima introducci\u00f3n a como almacena internamente SQL Server los datos.<\/p>\n<p>En SQL Server, los registros de una tabla, son agrupados en una estructura f\u00edsica de datos, que se llama p\u00e1gina. Cada p\u00e1gina tiene un tama\u00f1o fijo de 8060 bytes, y puede almacenar uno o cientos de registros, dependiendo del tama\u00f1o del mismo. Cuando se intenta insertar m\u00e1s registros en una tabla y la p\u00e1gina de datos est\u00e1 llena, se crea otra donde se inserta el nuevo registro y as\u00ed sucesivamente.<\/p>\n<p>El comando TRUNCATE, lo que hace es desasociar (deallocate) las p\u00e1ginas de datos de la tabla, sin alterar los registros en s\u00ed mismo, mientras que el DELETE FROM recorre cada uno de los registros y los marca como borrados, por lo tanto, hace muchas m\u00e1s operaciones de I\/O, que aumenta exponencialmente en relaci\u00f3n con TRUNCATE, a medida que aumenta el tama\u00f1o de la tabla.<\/p>\n<p>Otra raz\u00f3n que explica la diferencia de performance, es que TRUNCATE TABLE solo loguea en el transaction log, el deallocate de las paginas con la tabla (por lo tanto, es posible hacer un rollback de un TRUNCATE, cosa que muchos piensan que no), mientras que el DELETE FROM manda al transaction log todos los registros afectados, lo que es obviamente mucho m\u00e1s costoso a nivel recursos de I\/O.<\/p>\n<p>Por \u00faltimo, al hacer un TRUNCATE un lockeo sobre la tabla, a diferencia del DELETE FROM que hace un lockeo por pagina o registro, el consumo de memoria para almacenar los objetos lockeados es mucho menor.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Una duda bastante habitual entre los desarrolladores, es cu\u00e1l es la diferencia entre un TRUNCATE TABLE y un DELETE FROM TABLE. En este art\u00edculo vamos a hacer incapie en estas dos sentencias enumerando las diferencias y explicando su porque. TRUNCATE TABLE DELETE FROM Es una operaci\u00f3n DDL. Es una operaci\u00f3n DML. No permite el borrado [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6469,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[],"class_list":["post-1449","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mysql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Diferencias entre TRUNCATE TABLE y DELETE FROM - Jose Aguilar Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Diferencias entre TRUNCATE TABLE y DELETE FROM - Jose Aguilar Blog\" \/>\n<meta property=\"og:description\" content=\"Una duda bastante habitual entre los desarrolladores, es cu\u00e1l es la diferencia entre un TRUNCATE TABLE y un DELETE FROM TABLE. En este art\u00edculo vamos a hacer incapie en estas dos sentencias enumerando las diferencias y explicando su porque. TRUNCATE TABLE DELETE FROM Es una operaci\u00f3n DDL. Es una operaci\u00f3n DML. No permite el borrado [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/\" \/>\n<meta property=\"og:site_name\" content=\"Jose Aguilar Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/joseaguilarblog\" \/>\n<meta property=\"article:published_time\" content=\"2012-01-17T13:55:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-02-25T13:59:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2014\/10\/Imagen-no-disponible-282x300.png\" \/>\n\t<meta property=\"og:image:width\" content=\"282\" \/>\n\t<meta property=\"og:image:height\" content=\"300\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jose Aguilar\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@JoseAguilarBlog\" \/>\n<meta name=\"twitter:site\" content=\"@JoseAguilarBlog\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jose Aguilar\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/\",\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/\",\"name\":\"Diferencias entre TRUNCATE TABLE y DELETE FROM - Jose Aguilar Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2014\/10\/Imagen-no-disponible-282x300.png\",\"datePublished\":\"2012-01-17T13:55:24+00:00\",\"dateModified\":\"2012-02-25T13:59:24+00:00\",\"author\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/#primaryimage\",\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2014\/10\/Imagen-no-disponible-282x300.png\",\"contentUrl\":\"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2014\/10\/Imagen-no-disponible-282x300.png\",\"width\":282,\"height\":300},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\/\/www.jose-aguilar.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Diferencias entre TRUNCATE TABLE y DELETE FROM\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#website\",\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/\",\"name\":\"Jose Aguilar Blog\",\"description\":\"Desarrollo Web con PrestaShop, WordPress, PHP, jQuery y Ajax\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.jose-aguilar.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11\",\"name\":\"Jose Aguilar\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g\",\"caption\":\"Jose Aguilar\"},\"description\":\"Director ejecutivo y tecnol\u00f3gico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.\",\"sameAs\":[\"https:\/\/plus.google.com\/114357189801512615537\"],\"url\":\"https:\/\/www.jose-aguilar.com\/blog\/author\/josea902\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Diferencias entre TRUNCATE TABLE y DELETE FROM - Jose Aguilar Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"og_locale":"es_ES","og_type":"article","og_title":"Diferencias entre TRUNCATE TABLE y DELETE FROM - Jose Aguilar Blog","og_description":"Una duda bastante habitual entre los desarrolladores, es cu\u00e1l es la diferencia entre un TRUNCATE TABLE y un DELETE FROM TABLE. En este art\u00edculo vamos a hacer incapie en estas dos sentencias enumerando las diferencias y explicando su porque. TRUNCATE TABLE DELETE FROM Es una operaci\u00f3n DDL. Es una operaci\u00f3n DML. No permite el borrado [&hellip;]","og_url":"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/","og_site_name":"Jose Aguilar Blog","article_publisher":"https:\/\/www.facebook.com\/joseaguilarblog","article_published_time":"2012-01-17T13:55:24+00:00","article_modified_time":"2012-02-25T13:59:24+00:00","og_image":[{"width":282,"height":300,"url":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2014\/10\/Imagen-no-disponible-282x300.png","type":"image\/png"}],"author":"Jose Aguilar","twitter_card":"summary_large_image","twitter_creator":"@JoseAguilarBlog","twitter_site":"@JoseAguilarBlog","twitter_misc":{"Escrito por":"Jose Aguilar","Tiempo de lectura":"3 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/","url":"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/","name":"Diferencias entre TRUNCATE TABLE y DELETE FROM - Jose Aguilar Blog","isPartOf":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/#primaryimage"},"image":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/#primaryimage"},"thumbnailUrl":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2014\/10\/Imagen-no-disponible-282x300.png","datePublished":"2012-01-17T13:55:24+00:00","dateModified":"2012-02-25T13:59:24+00:00","author":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11"},"breadcrumb":{"@id":"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/#primaryimage","url":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2014\/10\/Imagen-no-disponible-282x300.png","contentUrl":"https:\/\/www.jose-aguilar.com\/blog\/wp-content\/uploads\/2014\/10\/Imagen-no-disponible-282x300.png","width":282,"height":300},{"@type":"BreadcrumbList","@id":"https:\/\/www.jose-aguilar.com\/blog\/diferencias-entre-truncate-table-y-delete-from\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/www.jose-aguilar.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Diferencias entre TRUNCATE TABLE y DELETE FROM"}]},{"@type":"WebSite","@id":"https:\/\/www.jose-aguilar.com\/blog\/#website","url":"https:\/\/www.jose-aguilar.com\/blog\/","name":"Jose Aguilar Blog","description":"Desarrollo Web con PrestaShop, WordPress, PHP, jQuery y Ajax","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.jose-aguilar.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/e6d485db1e1140866e95971d17105d11","name":"Jose Aguilar","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.jose-aguilar.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/abbfef5f1d75260c549d0f2c2842bb697ba1aadff3b2836b39d2590c8a625415?s=96&d=mm&r=g","caption":"Jose Aguilar"},"description":"Director ejecutivo y tecnol\u00f3gico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.","sameAs":["https:\/\/plus.google.com\/114357189801512615537"],"url":"https:\/\/www.jose-aguilar.com\/blog\/author\/josea902\/"}]}},"_links":{"self":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/posts\/1449","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/comments?post=1449"}],"version-history":[{"count":0,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/posts\/1449\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/media\/6469"}],"wp:attachment":[{"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/media?parent=1449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/categories?post=1449"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jose-aguilar.com\/blog\/wp-json\/wp\/v2\/tags?post=1449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}