<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/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>SQL Server (και άλλες databases)</title><link>https://www.dotnetzone.gr:443/cs/forums/28/ShowForum.aspx</link><description>Θέματα που αφορούν τον SQL Server (7.0, 2000, 2005) αλλά και Oracle, Access, DB2, MySQL, κλπ.</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: Δημιουργία indexes σε read-only βάση.</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21828.aspx</link><pubDate>Thu, 07 Dec 2006 22:15:31 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21828</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21828.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=21828</wfw:commentRss><description>Ναι, θα παίξει ωστόσο στην συγκεκριμένη περίπτωση δεν είναι απαραίτητο γιατί όπως είπαμε όταν έχεις πολλαπλά arguments που συνδέονται με AND, σου αρκεί έστω και ένα από αυτά να βασίζεται σε κάποιο index. Αν είχες όμως OR, τότε μια τέτοια λύση που περιγράφεις θα ήταν απαραίτητη...</description></item><item><title>Απ: Δημιουργία indexes σε read-only βάση.</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21801.aspx</link><pubDate>Thu, 07 Dec 2006 18:25:20 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21801</guid><dc:creator>dimkasta</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21801.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=21801</wfw:commentRss><description>&lt;P&gt;ΠΩΠΩ πραγματικό σεμινάριο το πόστ σου kelman. THANKS.&lt;/P&gt;
&lt;P&gt;Στο θέμα με τα non-sarg και τα indexed views, έχω sqlexpress και θα ήθελα να παίζει σωστά και σε τέτοια βάση οπότε μιας και μιλάμε για SPs σκέφτηκα το εξής. Το query μας είναι αυτό.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SELECT&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt; * &lt;FONT size=2&gt;&lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;FROM&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbo.myEmails &lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;INNER&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;JOIN&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbo.myUsers &lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ON&lt;/SPAN&gt; dbo.myEmails.UserID = dbo.myUsers.IDs&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;WHERE&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (dbo.myUsers.username = @thisUser) &lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;AND&lt;/SPAN&gt; (&lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;datePart&lt;/SPAN&gt;(&lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;year&lt;/SPAN&gt;,dbo.myEmails.dateReceived) = @thisYear) &lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;AND&lt;/SPAN&gt; (&lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;datePart&lt;/SPAN&gt;(&lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;month&lt;/SPAN&gt;,dbo.myEmails.dateReceived) = @thisMonth)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Το πρόβλημα προφανώς είναι ότι χρησιμοποιείται το function μέσα στο select. Άν πιο πρίν στο SP κάνουμε κάτι τέτοιο?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;declare @y numeric&lt;/P&gt;
&lt;P&gt;declare @m numeric&lt;/P&gt;
&lt;P&gt;declare @d numeric&lt;/P&gt;
&lt;P&gt;declare @startDate DateTime&lt;/P&gt;
&lt;P&gt;declare @endDate DateTime&lt;/P&gt;
&lt;P&gt;set @y = @thisYear&lt;/P&gt;
&lt;P&gt;set @m = 1&lt;/P&gt;
&lt;P&gt;set @d = 1&lt;/P&gt;
&lt;P&gt;set @startDate = select dateadd(mm,(@y-1900)* 12 + @m - 1,0) + (@d-1) &lt;/P&gt;
&lt;P&gt;set @endDate = select dateadd(mm,(@y -1900)* 12 + @m + 1&amp;nbsp;- 1,0) + (@d-1) &lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;και στη συνέχεια στο πρώτο query χρησιμοποιήσω το between? Δηλαδή....&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SELECT&lt;/SPAN&gt;&lt;FONT face="Courier New"&gt; * &lt;FONT size=2&gt;&lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;FROM&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbo.myEmails &lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;INNER&lt;/SPAN&gt; &lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;JOIN&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;FONT face="Courier New"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dbo.myUsers &lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ON&lt;/SPAN&gt; dbo.myEmails.UserID = dbo.myUsers.IDs&lt;BR&gt;&lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;WHERE&lt;/SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (dbo.myUsers.username = @thisUser) &lt;SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;AND&lt;/SPAN&gt; (dbo.myEmails.dateReceived between @startDate and&amp;nbsp;@EndDate)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Λογικά έτσι θα παίξει με το index ε? Δεν ξέρω βέβαια τι overhead θα έχω με τους αρχικούς υπολογισμούς... Aν χρησιμοποιούσα string concatenation και μετά conversion σε datetime προφανώς θα ήτανε χειρότερα ε?&lt;/P&gt;</description></item><item><title>Απ: Δημιουργία indexes σε read-only βάση.</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21784.aspx</link><pubDate>Thu, 07 Dec 2006 09:02:07 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21784</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21784.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=21784</wfw:commentRss><description>&lt;P&gt;Ωραία, έχουμε και λέμε:&lt;/P&gt;
&lt;P&gt;&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/default/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;dimkasta wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" class="txt4"&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&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; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;DISTINCT&lt;/span&gt;  &lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;DATEPART&lt;/span&gt;(&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;year&lt;/span&gt;, dbo.myEmails.dateReceived) &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;AS&lt;/span&gt; years&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;         dbo.myEmails &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;INNER&lt;/span&gt; &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;JOIN&lt;/span&gt;&lt;br /&gt;                      dbo.myUsers &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ON&lt;/span&gt; dbo.myEmails.UserID = dbo.myUsers.IDs&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;     (dbo.myUsers.username = @thisUser)&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ORDER&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;BY&lt;/span&gt; years &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;DESC&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;/P&gt;
&lt;P&gt;Θα ξεκίναγα βάζοντας στα PKs (τα δύο ID columns) από ένα Non-Clustered Unique Index. Αυτό θα βοηθήσει τόσο οποιαδήποτε αναζήτηση γίνει με βάση το PK όσο και το JOIN. Δεν χρειάζεται index στο UserID (FK) του myEmails καθώς το IDs του myUsers έχει υψηλό selectivity (καθότι PK). To dateReceived πεδίο του myEmails είναι ό,τι πρέπει για clustered index καθώς έχεις ταξινόμηση.&lt;/P&gt;
&lt;P&gt;&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/default/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;dimkasta wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" class="txt4"&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&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; &lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;count&lt;/span&gt;(*) &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;from&lt;/span&gt; myemails&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;         dbo.myEmails &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;INNER&lt;/span&gt; &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;JOIN&lt;/span&gt;&lt;br /&gt;                      dbo.myUsers &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ON&lt;/span&gt; dbo.myEmails.UserID = dbo.myUsers.IDs&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;     (dbo.myUsers.username = @thisUser) &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;AND&lt;/span&gt; (&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;datePart&lt;/span&gt;(&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;year&lt;/span&gt;,dbo.myEmails.dateReceived) = @thisYear) &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;AND&lt;/span&gt; (&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;datePart&lt;/span&gt;(&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;month&lt;/span&gt;,dbo.myEmails.dateReceived) = @thisMonth)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;/P&gt;
&lt;P&gt;και&lt;/P&gt;
&lt;P&gt;&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/default/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;dimkasta wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" class="txt4"&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&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; * &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;FROM&lt;/span&gt;         dbo.myEmails &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;INNER&lt;/span&gt; &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;JOIN&lt;/span&gt;&lt;br /&gt;                      dbo.myUsers &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ON&lt;/span&gt; dbo.myEmails.UserID = dbo.myUsers.IDs&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;     (dbo.myUsers.username = @thisUser) &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;AND&lt;/span&gt; (&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;datePart&lt;/span&gt;(&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;year&lt;/span&gt;,dbo.myEmails.dateReceived) = @thisYear) &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;AND&lt;/span&gt; (&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;datePart&lt;/span&gt;(&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;month&lt;/span&gt;,dbo.myEmails.dateReceived) = @thisMonth)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;/P&gt;
&lt;P&gt;Αυτά τα δύο queries έχουν το μειονέκτημα ότι χρησιμοποιούν τα πεδία μέσα σε συναρτήσεις, πράγμα που σημαίνει ότι κατά πάσα πιθανότητα αγνοούνται τα indexes (λέμε δηλαδή ότι το &lt;EM&gt;(datePart(year,dbo.myEmails.dateReceived) = @thisYear)&lt;/EM&gt; είναι non-SARG, όπου SARG=Searchable Argument, δηλαδή argument που χρησιμοποιεί indexes). To καλό είναι ότι το WHERE αποτελείται από τρία arguments που συνδέονται με AND λογικό τελεστή οπότε αρκεί έστω και ένα από αυτά να έχει καλό selectivity, πράγμα που συμβαίνει με το argument του username. Υποθέτω ότι είναι πεδίο με unique τιμές, οπότε ένα non-clustered unique index πάνω του είναι μια χαρά και βολεύει ολόκληρο το WHERE. &lt;/P&gt;
&lt;P&gt;Υπάρχει και άλλη μια λύση. Φτιάχνεις ένα view που κάνει SELECT τα non-SARG πεδία του where και βάζεις πάνω του indexes, φτιάχνεις δηλαδή ένα indexed view. Ο query optimizer είναι αρκετά έξυπνος ώστε να χρησιμοποιήσει αυτά τα indexes σε queries που τα χρειάζονται έστω και αν δεν αναφέρονται στο συγκεκριμένο view! To μόνο κακό είναι ότι για τα indexed views απαιτείται SQL Server Enterprise edition.&lt;/P&gt;
&lt;P&gt;&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/default/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;dimkasta wrote:&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="quoteTable"&gt;&lt;table width="100%"&gt;&lt;tr&gt;&lt;td valign="top" class="txt4"&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&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; * &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;FROM&lt;/span&gt;         dbo.myEmails &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;     IDs = @thisEmail&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;/P&gt;
&lt;P&gt;Αυτό έτσι κι αλλιώς θα εκμεταλλευτεί το unique non-clustered index που έχει ήδη καθοριστεί.&lt;/P&gt;
&lt;P&gt;Όλο αυτό το indexing είναι μια καλή αρχή. Πριν αρχίζεις να παίζεις, χρειάζεται να ορίσεις ένα performance baseline ώστε όταν κάνεις τις δοκιμές σου να έχεις ένα μέτρο σύγκρισης με κάποια προηγούμενη κατάσταση. Κατόπιν, μπορείς να δοκιμάσεις εναλλακτικές λύσεις ή να χρησιμοποιήσεις τον Database Tunning Advisor. &lt;/P&gt;</description></item><item><title>Απ: Δημιουργία indexes σε read-only βάση.</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21775.aspx</link><pubDate>Thu, 07 Dec 2006 05:55:40 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21775</guid><dc:creator>dimkasta</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21775.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=21775</wfw:commentRss><description>&lt;P&gt;OK ανεβάζω ένα παράδειγμα του πως είναι φτιαγμένη η εφαρμογή. Έχουμε χρήστες και έχουμε και emails.&lt;/P&gt;
&lt;P&gt;Tα select είναι αυτής της λογικής&lt;/P&gt;
&lt;P&gt;&lt;span style="color: Black;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt; &lt;br /&gt;&lt;br /&gt;Eπιλογή των ετών και των μηνών που έχει μηνύματα ο χρήστης για να δείξω μόνο αυτά.&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; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;DISTINCT&lt;/span&gt;  &lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;DATEPART&lt;/span&gt;(&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;year&lt;/span&gt;, dbo.myEmails.dateReceived) &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;AS&lt;/span&gt; years&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;         dbo.myEmails &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;INNER&lt;/span&gt; &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;JOIN&lt;/span&gt;&lt;br /&gt;                      dbo.myUsers &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ON&lt;/span&gt; dbo.myEmails.UserID = dbo.myUsers.IDs&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;     (dbo.myUsers.username = @thisUser)&lt;br /&gt;&lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ORDER&lt;/span&gt; &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;BY&lt;/span&gt; years &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;DESC&lt;/span&gt;&lt;br /&gt;&lt;br /&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; &lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;count&lt;/span&gt;(*) &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;from&lt;/span&gt; myemails&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;         dbo.myEmails &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;INNER&lt;/span&gt; &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;JOIN&lt;/span&gt;&lt;br /&gt;                      dbo.myUsers &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ON&lt;/span&gt; dbo.myEmails.UserID = dbo.myUsers.IDs&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;     (dbo.myUsers.username = @thisUser) &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;AND&lt;/span&gt; (&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;datePart&lt;/span&gt;(&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;year&lt;/span&gt;,dbo.myEmails.dateReceived) = @thisYear) &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;AND&lt;/span&gt; (&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;datePart&lt;/span&gt;(&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;month&lt;/span&gt;,dbo.myEmails.dateReceived) = @thisMonth)&lt;br /&gt;&lt;br /&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; * &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;FROM&lt;/span&gt;         dbo.myEmails &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;INNER&lt;/span&gt; &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;JOIN&lt;/span&gt;&lt;br /&gt;                      dbo.myUsers &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;ON&lt;/span&gt; dbo.myEmails.UserID = dbo.myUsers.IDs&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;     (dbo.myUsers.username = @thisUser) &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;AND&lt;/span&gt; (&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;datePart&lt;/span&gt;(&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;year&lt;/span&gt;,dbo.myEmails.dateReceived) = @thisYear) &lt;span style="color: Silver;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;AND&lt;/span&gt; (&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;datePart&lt;/span&gt;(&lt;span style="color: Fuchsia;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;month&lt;/span&gt;,dbo.myEmails.dateReceived) = @thisMonth)&lt;br /&gt;&lt;br /&gt;Και τέλος για να δείξω το επιλεγμένο email,&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; * &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;FROM&lt;/span&gt;         dbo.myEmails &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;     IDs = @thisEmail&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;H λογική είναι αυτή σχεδόν σε όλους τους πίνακες. Περιμένω τα φώτα σας με ανυπομονησία...&lt;/P&gt;</description></item><item><title>Απ: Δημιουργία indexes σε read-only βάση.</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21765.aspx</link><pubDate>Thu, 07 Dec 2006 02:11:42 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21765</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21765.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=21765</wfw:commentRss><description>&lt;P&gt;Για να μπορέσουμε να σου δώσουμε σωστές πληροφορίες σχετικά με το πως να κάνεις optimize τα indexes χρειάζεται να ξέρουμε το schema και τα SELECT statements που χρησιμοποιείς. Διαφορετικά, μόνο γενικά πράγματα μπορούμε να πούμε, ωστόσο ενδέχεται αυτά τα γενικά να μην είναι καθόλου κατάλληλα για την περίπτωσή σου. &lt;/P&gt;
&lt;P&gt;Επιπρόσθετα, ψάξε για συζητήσεις που έχουμε κάνει στο παρελθόν για τα indexes. Προσοχή: Αυτό που παίζει μεγαλύτερο ρόλο ειναι τα SELECT που χρησιμοποιείς. Όσο για το clustered index πάνω στο PK, αυτό συνήθως&amp;nbsp;δεν είναι σωστό. Clustered index βάζουμε σε πεδία βάσει των οποίων επιλέγουμε ranges εγγραφών (πχ στο orderdate&amp;nbsp;αν χρησιμοποιείς&amp;nbsp;"WHERE orderdate BETWEEN @date1 AND @date2") ή σε πεδία που θέλεις να βασίσεις ταξινόμηση (πάνε στο ORDER BY). Υπάρχει μια μεγάλη παρανόηση ότι το PK πάει με το clustered index και αυτό οφείλεται στο γεγονός ότι είναι το default πράγμα που συμβαίνει κατά το CREATE TABLE αν δεν ορίσεις explicitly κάτι διαδορετικό καθώς και στο ότι οι βάσεις-παραδείγματα (pubs, Northwind) ακολουθούν αυτό&amp;nbsp;το pattern (υποθέτω γιατί δεν υπάρχουν τυποποιημένα queries για να γίνουν optimized).&lt;/P&gt;</description></item><item><title>Απ: Δημιουργία indexes σε read-only βάση.</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21764.aspx</link><pubDate>Thu, 07 Dec 2006 02:01:15 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21764</guid><dc:creator>Dimitris Papadimitriou</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21764.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=21764</wfw:commentRss><description>Καταρχήν διάβασε αυτό: http://www.dotnetzone.gr/cs/forums/21537/ShowPost.aspx&lt;br /&gt;
&lt;br /&gt;
Είναι συζήτηση που έγινε πριν μερικές μέρες και είναι ακόμα ζεστή!&lt;br /&gt;
&lt;br /&gt;
Κατά τα άλλα περιμένω τις απαντήσεις των υπολοίπων με ενδιαφέρον!</description></item><item><title>Δημιουργία indexes σε read-only βάση.</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/21761.aspx</link><pubDate>Thu, 07 Dec 2006 01:29:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:21761</guid><dc:creator>dimkasta</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/21761.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=21761</wfw:commentRss><description>&lt;P&gt;Έχω μια βάση η οποία κρατάει read-only πληροφορία από συγχρονισμό με άλλα συστήματα. Η βάση περιέχει μόνο δεδομένα και καθόλου metadata, πχ ΡΚ, FK, indexes κλπ. Τα υπόλοιπα συστήματα κανονίζουνε μόνα τους το integrity των δεδομένων, και εγώ απλά βεβαιώνομαι με transactions κατά το synchronisation ότι όλα τα δεδομένα έχουνε αντιγραφεί σωστά. Θέλω το σχόλιό σας πάνω σε αυτό. Στη βάση γίνονται ΜΟΝΟ select.&lt;/P&gt;
&lt;P&gt;Από κει και πέρα, επειδή μιλάμε για αρκετές γραμμές, η δημιουργία indexes είναι μάλλον απαραίτητη. Ο προβληματισμός μου είναι ο εξής. Έχω 2 ειδών πίνακες χοντρικά.&lt;/P&gt;
&lt;P&gt;Έναν κεντρικό, ο οποίος έχει τα στοιχεία του προσώπου, στον οποίο η αναζήτηση γίνεται σύμφωνα με το username, ενώ το PK είναι FK στους υπόλοιπους πίνακες. Πού θα βάζατε το clustered index? στο ΡΚ προφανώς ε? και το username ένα unclustered?&lt;/P&gt;
&lt;P&gt;Mερικούς πίνακες που περιέχουνε πληροφία όπως μηνύματα κλπ. Εδώ το&amp;nbsp;select γίνεται με&amp;nbsp;join &amp;nbsp;στο FK επιστρέφοντας μόνο του χρήστη, και με where στην κολώνα με την ημερομηνία, μέσα σε datepart(year,x)&amp;nbsp; και datepart(month,χ), ώστε να γίνεται drill-down σύμφωνα με έτος και μήνα. Πού θα βάζατε το clustered? Στο FK ή στο date? Το ΡΚ αυτών των πινάκων δεν χρησιμοποιείται, παρά μόνο για reference άν θέλω το τελικό drill-down detailed view.&lt;/P&gt;
&lt;P&gt;Eπαναλαμβάνω δεν γίνεται insert/update στους πίνακες και τα indexes θα γίνονται drop πρίν και create ξανά μετά το συγχρονισμό.&lt;/P&gt;
&lt;P&gt;Καμιά συμβουλή?&lt;/P&gt;</description></item></channel></rss>