<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlserver.ro/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>T-SQL</title><link>http://sqlserver.ro/forums/15/ShowForum.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Re: Concatenare randuri pentru o coloana in view - probleme performanta</title><link>http://sqlserver.ro/forums/thread/7341.aspx</link><pubDate>Wed, 24 Jun 2009 06:56:13 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:7341</guid><dc:creator>rremus</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/7341.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=7341</wfw:commentRss><description>Raspunsul depinde de structura tabelelor tale, si de ce indexi exista disponibili la executie. De exemplu am facut acest DDL care sa satisfaca query-ul tau:&lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;create&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;table&lt;/span&gt; AddressType (AddressTypeId &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;identity&lt;/span&gt;(1,1) &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;primary&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;key&lt;/span&gt;,&lt;br&gt;   AddressTypeName &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;varchar&lt;/span&gt;(20));&lt;br&gt;go&lt;br&gt;&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;create&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;table&lt;/span&gt; Client (ClientId &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;identity&lt;/span&gt;(1,1) &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;primary&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;key&lt;/span&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;Name &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;varchar&lt;/span&gt;(100));&lt;br&gt;go&lt;br&gt;&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;create&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;table&lt;/span&gt; [Address] (&lt;br&gt;&amp;nbsp;&amp;nbsp;AddressId &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;identity&lt;/span&gt;(1,1) &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;primary&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;key&lt;/span&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;ClientId &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;constraint&lt;/span&gt; fk_Address_ClientId &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;foreign&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;key&lt;/span&gt; (ClientId) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;references&lt;/span&gt; Client (ClientId));&lt;br&gt;go&lt;br&gt;&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;create&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;table&lt;/span&gt; [AddressXAddressType] (&lt;br&gt;&amp;nbsp;&amp;nbsp;AddressId &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;AddressTypeId &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;int&lt;/span&gt;,&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;constraint&lt;/span&gt; pk_AddressXAddressType &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;primary&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;key&lt;/span&gt; (AddressId, AddressTypeId),&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;constraint&lt;/span&gt; fk_Address_AddressID &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;foreign&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;key&lt;/span&gt; (AddressId) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;references&lt;/span&gt; [Address](AddressId),&lt;br&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;constraint&lt;/span&gt; fk_Address_AddressTypeId &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;foreign&lt;/span&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;key&lt;/span&gt;  (AddressTypeId) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;references&lt;/span&gt; AddressType (AddressTypeId));&lt;br&gt;go&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;Si cu 3 address type, 1500 de clienti si 2500 de AddressXAddressTypes ruleaza in 286 ms:&lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;select&lt;/span&gt; (&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;SELECT&lt;/span&gt;&lt;br&gt;        at.[AddressTypeName] &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;AS&lt;/span&gt; [data()]&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;FROM&lt;/span&gt;&lt;br&gt;        AddressType at&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;WHERE&lt;/span&gt; AddressTypeId &lt;span style="color:Silver;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;in&lt;/span&gt;&lt;br&gt;    (       &lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;select&lt;/span&gt; AddressTypeId&lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;from&lt;/span&gt; [Address] a&lt;br&gt;       &lt;br&gt;        &lt;span style="color:Silver;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;join&lt;/span&gt; AddressXAddressType &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;as&lt;/span&gt; axa &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;on&lt;/span&gt; axa.AddressId = a.AddressId&lt;br&gt;               &lt;br&gt;        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;where&lt;/span&gt; a.ClientId = Client.ClientId&lt;br&gt;    ) &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;FOR&lt;/span&gt; XML PATH (&lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;''&lt;/span&gt;), type)&lt;br&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;from&lt;/span&gt; Client&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;font face="Courier New" size="1"&gt;SQL Server parse and compile time: &lt;br&gt;&amp;nbsp;&amp;nbsp; CPU time = 0 ms, elapsed time = 1 ms.&lt;br&gt;Table 'AddressXAddressType'. Scan count 0, logical reads &lt;b&gt;8994&lt;/b&gt;, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;br&gt;Table 'Worktable'. Scan count 4500, logical reads &lt;b&gt;12031&lt;/b&gt;, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;br&gt;Table 'Address'. Scan count 1, logical reads &lt;b&gt;6&lt;/b&gt;, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;br&gt;Table 'AddressType'. Scan count 1500, logical reads &lt;b&gt;3000&lt;/b&gt;, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;br&gt;Table 'Client'. Scan count 1, logical reads &lt;b&gt;6&lt;/b&gt;, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;br&gt;SQL Server Execution Times:&lt;br&gt;&amp;nbsp;&amp;nbsp; CPU time = 63 ms,&amp;nbsp; elapsed time = 289 ms.&lt;/font&gt;&lt;/pre&gt;&lt;br&gt;Evident, in exemplul meu Address si Client sint foarte ingiste tabelelel, doar cu un Id. Dar ideea e ca problema nu poate fi raspunsa fara sa stim exact structura la toate tabelele, si ce indexi ai. Ce iese in evidenta foarte repede in cazul tau este ca la un scan count de ~1500 ai page reads de ~375k, deci tabela ta este mul mai lata si este in mod sigur accesata pe clustered index. Poate poti crea o cale de access mai ingusta, care sa nu trebuiasca sa citeasca atit de multe pagini, sau poate poti reformula query-ul in termeni care sa elimine nested loop-urile (care dau 1500 scan count). De exemplu elimini IN si-l transformi in JOIN:&lt;br&gt;&lt;br&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;select&lt;/span&gt; (&lt;br&gt;&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;SELECT&lt;/span&gt;&lt;br&gt;        at.[AddressTypeName] &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;AS&lt;/span&gt; [data()]&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;FROM&lt;/span&gt;&lt;br&gt;        AddressType at&lt;br&gt;        &lt;span style="color:Silver;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;join&lt;/span&gt; AddressXAddressType axa &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;on&lt;/span&gt; axa.AddressTypeId = at.AddressTypeId&lt;br&gt;        &lt;span style="color:Silver;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;join&lt;/span&gt; Address a &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;on&lt;/span&gt; axa.AddressId = a.AddressId&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;WHERE&lt;/span&gt; a.ClientId = Client.ClientId&lt;br&gt;    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;FOR&lt;/span&gt; XML PATH (&lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;''&lt;/span&gt;), type)&lt;br&gt; &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;from&lt;/span&gt; Client&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;font face="Courier New" size="1"&gt;SQL Server parse and compile time: &lt;br&gt;&amp;nbsp;&amp;nbsp; CPU time = 16 ms, elapsed time = 17 ms.&lt;br&gt;Table 'AddressType'. Scan count 0, logical reads 5156, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;br&gt;Table 'AddressXAddressType'. Scan count 1499, logical reads 3010, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;br&gt;Table 'Worktable'. Scan count 1500, logical reads 6025, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;br&gt;Table 'Address'. Scan count 1, logical reads 6, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;br&gt;&lt;b&gt;Table 'Client'. Scan count 1,&lt;/b&gt; logical reads 6, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.&lt;br&gt;&lt;br&gt;SQL Server Execution Times:&lt;br&gt;&amp;nbsp;&amp;nbsp; CPU time = 62 ms,&amp;nbsp; elapsed time = 335 ms.&lt;/font&gt;&lt;br&gt;&lt;br&gt;In afara de asta esti sigur ca vrei sa inlocuiesti toate spatiile cu ',' ? Nu o sa ai niciodata un address type cu spatiu in nume?&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item><item><title>Concatenare randuri pentru o coloana in view - probleme performanta</title><link>http://sqlserver.ro/forums/thread/7333.aspx</link><pubDate>Tue, 23 Jun 2009 06:54:16 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:7333</guid><dc:creator>sirrocco</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/7333.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=7333</wfw:commentRss><description>Salutare,&lt;br&gt;&lt;br&gt;Problema mea este urmatoarea :&lt;br&gt;&lt;br&gt;Am un tabel Client, care are mai multe Address si fiecare adresa are unul sau mai multe tipuri AddressType. Acum, se vrea o data afisarea in tabelul de clienti a tuturor AddressType-urilor pe care le are setate pe adresele sale. Iar mai apoi trebuie sa filtrez clienti dupa AddressType.&lt;br&gt;&lt;br&gt;Am facut astfel :&lt;br&gt;&lt;br&gt;AllAddressTypesNames = REPLACE(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; at.[AddressTypeName] AS [data()]&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FROM&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; AddressType at&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; WHERE AddressTypeId in&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; select AddressTypeId &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; from [Address] a&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; join AddressXAddressType as axa on axa.AddressId = a.AddressId&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; where a.ClientId = dbo.Client.ClientId &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ) FOR XML PATH ('') ), ' ', ',')&lt;br&gt;&lt;br&gt;Mai sus e doar o protiune din view , mai sunt vreo cateva coloane care se concateneaza tot in stilul acesta iar tabelul are vreo 1500 inregistrari.&lt;br&gt;Problema este ca dureaza destul de mult. &lt;br&gt;Am pus SET STATISTICS IO ON si ce sare in ochi ar fi : &lt;br&gt;&lt;br&gt;&lt;blockquote&gt;Table 'Worktable'. Scan count 1467, logical reads 326676, &lt;br&gt;Table 'Client'. Scan count 2923, logical reads 374144, &lt;br&gt;&lt;/blockquote&gt;Daca scot concatenarile , pe Worktable cifrele sunt similare, dar pe client scade logical reads la vreo 200 si se misca simtitor mai rapid. Am alta posibilitate sa concatenez acele coloane ? sa mai imbunatatesc performanta un pic ?&lt;br&gt;</description></item></channel></rss>