<?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>Απ: SQL Επερώτηση - Επιλογή όλων των πεδίων ενός πίνακα όπου ένα χαρακτηριστικό είναι μέγιστο</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/15514.aspx</link><pubDate>Sat, 05 Aug 2006 06:48:06 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:15514</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/15514.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=15514</wfw:commentRss><description>Ο Kelman έχει δίκιο. Δεν ανέφερα θεωρητικά ότι και οι δύο λύσεις έχουν την ίδια απόδοση. Τις εφάρμοσα και τις δύο σε ένα πίνακα με primary key το ID και διαπίστωσα με έκπληξη ότι και στις δύο περιπτώσεις ο SQL Server εκτελούσε το ίδιο execution plan: Ένα index scan ακολουθούμενο από ένα TOP. Αυτό συμβαίνει επειδή ο SQL Server ξέρει ότι το primary key έχει index, οπότε το μόνο που χρειάζεται να κάνει είναι να διαβάσει όλες τις τιμές του index με τη σειρά, και να επιλέξει την πρώτη.&lt;br /&gt;
&lt;br /&gt;
Πάντως, το παραπάνω script δεν είναι κατάλληλο για benchmarks επειδή τα δεδομένα του πίνακα έχουν ήδη φορτωθεί στη μνήμη όταν τρέχει το δεύτερο select. &lt;br /&gt;
&lt;br /&gt;
Ο μόνος τρόπος να πάει πιο γρήγορα αυτό το query είναι να υπάρχει άλλο ένα index στο ID, με descending sort order. Και σε αυτή την περίπτωση όμως, τα execution plans είναι τα ίδια. Η λύση αυτή πάντως ακούγεται υπερβολική.</description></item><item><title>Απ: SQL Επερώτηση - Επιλογή όλων των πεδίων ενός πίνακα όπου ένα χαρακτηριστικό είναι μέγιστο</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/15512.aspx</link><pubDate>Sat, 05 Aug 2006 03:41:42 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:15512</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/15512.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=15512</wfw:commentRss><description>&lt;P&gt;Πέρα από αυτό που επεσήμανε η mns σχετικά με το τι ακριβώς θέλουμε να κάνουμε, το performance αλλάζει δραματικά ανάλογα αν υπάρχει index ή όχι. Αν υπάρχει clustered index, τα δεδομένα είναι ήδη ταξινομημένα και γι αυτόν το λόγο τόσο το ORDER BY, όσο και το MAX δημιουργούν τελικά το ίδιο execution plan όπως είπε ο Παναγιώτης και εκτελούνται πρακτικά στον ίδιο χρόνο (με το MAX να είναι 16 ms ταχύτερο). Όταν δεν υπάρχει index, τότε η λύση με το MAX απαιτεί να γίνουν δύο περάσματα (table scans) το πρώτο για να βρεθεί το MAX και το δεύτερο, εκ νέου, για να βρεθούν όλες οι εγγραφές που έχουν τιμή στο πεδίο αναζήτησης, ίδια με το MAX.&lt;/P&gt;
&lt;P&gt;Για να το διαπιστώσεις, δοκίμασε ότνα βρεις ευκαιρία να ξανατρέξεις το script βάζοντας μετά το CREATE TABLE το &lt;BR&gt;&lt;BR&gt;CREATE CLUSTERD INDEX CL_mytest ON mytest(id)&lt;/P&gt;
&lt;P&gt;Τουτέστιν, δεν είναι το MAX χρονοβόρο, είναι η σωστή ή η λανθασμένη υλοποίηση των indexes που κάνει τη διαφορά...&lt;BR&gt;&lt;/P&gt;</description></item><item><title>Απ: SQL Επερώτηση - Επιλογή όλων των πεδίων ενός πίνακα όπου ένα χαρακτηριστικό είναι μέγιστο</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/15510.aspx</link><pubDate>Sat, 05 Aug 2006 03:07:09 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:15510</guid><dc:creator>spaceman</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/15510.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=15510</wfw:commentRss><description>&lt;P&gt;Απο προσωπικη εμπειρια, εχει διαπιστωθει οτι το ΜΑΧ() ειναι ιδιαιτερα χρονοβορο οταν εφαρμοζεται σε πινακα με πολλες εγγραφες.&lt;BR&gt;&lt;BR&gt;Επειδη δεν υπαρχει δυνατοτητα προσβασης σε SQL server, αν υπαρχει διαθεση απο καποιον χρηστη να ασχοληθεί, θα μπορουσε να δημιουργηθει ενας πινακας, (με ή χωρις index), να προστεθουν "αρκετες εγγραφες" και μετα να εκτελεστουν οι δυο διαφορετικες εκδοχες.&lt;BR&gt;&lt;BR&gt;--test table creation&lt;BR&gt;&lt;BR&gt;CREATE TABLE mytest(id INT)&lt;BR&gt;&lt;BR&gt;--create driving records&lt;BR&gt;&lt;BR&gt;DECLARE @i INT&lt;BR&gt;&lt;BR&gt;SET @i = 1&lt;BR&gt;&lt;BR&gt;WHILE @i &amp;lt;= 300000&lt;BR&gt;&lt;BR&gt;BEGIN&lt;BR&gt;&lt;BR&gt;INSERT INTO mytest(id) VALUES(@i)&lt;BR&gt;&lt;BR&gt;--move to next @i&lt;BR&gt;&lt;BR&gt;SET @i = @i+1&lt;BR&gt;&lt;BR&gt;END&lt;BR&gt;&lt;BR&gt;DECLARE @thedate DATETIME&lt;BR&gt;&lt;BR&gt;--plan No:1&lt;BR&gt;&lt;BR&gt;SET @thedate = getdate()&lt;BR&gt;&lt;BR&gt;SELECT * &lt;BR&gt;&lt;BR&gt;FROM mytest&lt;BR&gt;&lt;BR&gt;WHERE id = (SELECT max(id) FROM mytest)&lt;BR&gt;&lt;BR&gt;--show milliseconds of execution&lt;BR&gt;&lt;BR&gt;SELECT DATEDIFF(ms, @thedate, getdate()) AS 1st_plan&lt;BR&gt;&lt;BR&gt;--plan No:2&lt;BR&gt;&lt;BR&gt;SET @thedate = getdate()&lt;BR&gt;&lt;BR&gt;SELECT TOP 1 * &lt;BR&gt;&lt;BR&gt;FROM mytest&lt;BR&gt;&lt;BR&gt;ORDER BY id DESC&lt;BR&gt;&lt;BR&gt;SELECT DATEDIFF(ms, @thedate, getdate()) AS 2nd_plan&lt;BR&gt;&lt;BR&gt;DROP TABLE mytest&lt;BR&gt;&lt;BR&gt;------------------------------------------------------------------------------------------&lt;BR&gt;&lt;BR&gt;Αν μπορεσει καποιος χρηστης, να δημοσιευσει τους δυο χρονους..ή να εκτελεσει τα select queries χωριστα και να παρουσιασει τα αποτελεσματα της εκτελεσης...&lt;/P&gt;</description></item><item><title>Απ: SQL Επερώτηση - Επιλογή όλων των πεδίων ενός πίνακα όπου ένα χαρακτηριστικό είναι μέγιστο</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/15504.aspx</link><pubDate>Fri, 04 Aug 2006 23:00:08 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:15504</guid><dc:creator>Παναγιώτης Καναβός</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/15504.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=15504</wfw:commentRss><description>Μόλις διαπίστωσα και ένα περίεργο: Ο SQL Server θα δημιουργήσει ακριβώς το ίδιο execution plan και στις δύο περιπτώσεις (αν υπάρχει index φυσικά)! Από πλευράς ταχύτητας και οι δύο λύσεις είναι ίδιες!&lt;br /&gt;
&lt;br /&gt;
Από πλευράς ευελιξίας όμως, η πρώτη λύση είναι καλύτερη, καθώς δουλεύει και όταν το πεδίο δεν είναι μοναδικό, καθώς και με διαφορετικές στατιστικές συναρτήσεις.</description></item><item><title>Απ: SQL Επερώτηση - Επιλογή όλων των πεδίων ενός πίνακα όπου ένα χαρακτηριστικό είναι μέγιστο</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/15500.aspx</link><pubDate>Fri, 04 Aug 2006 22:47:46 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:15500</guid><dc:creator>Νατάσα Μανουσοπούλου</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/15500.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=15500</wfw:commentRss><description>&lt;BLOCKQUOTE&gt;&lt;table width="85%"&gt;&lt;tr&gt;&lt;td class="txt4"&gt;&lt;img src="/cs/Themes/mistblue/images/icon-quote.gif"&gt;&amp;nbsp;&lt;strong&gt;spaceman 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;για MS SQL :&lt;br&gt;
&lt;br&gt;
SELECT TOP 1 * &lt;br&gt;
&lt;br&gt;
FROM table&lt;br&gt;
&lt;br&gt;
ORDER BY id DESC&lt;br&gt;
&lt;br&gt;
--HTH--&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/BLOCKQUOTE&gt;&lt;br&gt;
&lt;br&gt;
Αυτό είναι σωστό αν το πεδίο ID είναι μοναδικό (από το όνομά του αυτό
υποθέτουμε). Σε πεδία που δεν είναι μοναδικά, η λύση είναι μόνο αυτή
που
έχει δοθεί σε προηγούμενα posts.&lt;br&gt;</description></item><item><title>Απ: SQL Επερώτηση - Επιλογή όλων των πεδίων ενός πίνακα όπου ένα χαρακτηριστικό είναι μέγιστο</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/15494.aspx</link><pubDate>Fri, 04 Aug 2006 21:45:04 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:15494</guid><dc:creator>spaceman</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/15494.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=15494</wfw:commentRss><description>για MS SQL :&lt;br /&gt;
&lt;br /&gt;
SELECT TOP 1 * &lt;br /&gt;
&lt;br /&gt;
FROM table&lt;br /&gt;
&lt;br /&gt;
ORDER BY id DESC&lt;br /&gt;
&lt;br /&gt;
--HTH--</description></item><item><title>Απ: SQL Επερώτηση - Επιλογή όλων των πεδίων ενός πίνακα όπου ένα χαρακτηριστικό είναι μέγιστο</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/15462.aspx</link><pubDate>Fri, 04 Aug 2006 04:49:31 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:15462</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/15462.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=15462</wfw:commentRss><description>Μην ξεχνάς να ενημερώνεις το status της ερώτησης...</description></item><item><title>Απ: SQL Επερώτηση - Επιλογή όλων των πεδίων ενός πίνακα όπου ένα χαρακτηριστικό είναι μέγιστο</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/15461.aspx</link><pubDate>Fri, 04 Aug 2006 04:46:15 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:15461</guid><dc:creator>Paul</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/15461.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=15461</wfw:commentRss><description>Ευχαριστώ πολύ για την πολύ κατατοπιστική απάντηση!</description></item><item><title>Απ: SQL Επερώτηση - Επιλογή όλων των πεδίων ενός πίνακα όπου ένα χαρακτηριστικό είναι μέγιστο</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/15429.aspx</link><pubDate>Thu, 03 Aug 2006 16:07:08 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:15429</guid><dc:creator>KelMan</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/15429.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=15429</wfw:commentRss><description>&lt;P&gt;Μία λύση είναι να χρησιμοποιήσεις subquery:&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;FROM&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;&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; id = (&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;max&lt;/span&gt;(id) &lt;span style="color: Blue;background-color: Transparent;font-family: Courier New;font-size: 11px;font-weight: normal;"&gt;FROM&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;)&lt;/span&gt;&lt;/P&gt;
&lt;P&gt;Ουσιαστικά, το MAX ως ένα από τα aggregate functions, δεν μπορεί να χρησιμοποιηθεί όπως προσπαθούσες να το χρησιμοποιήσεις γιατί χρειάζεται ένα set από τιμές για να βρει την μέγιστη. Άρα θα πρέπει να βρίσκεται μαζί με ένα SELECT που θα "τραβήξει" τη λίστα με τις τιμές.&lt;/P&gt;</description></item><item><title>SQL Επερώτηση - Επιλογή όλων των πεδίων ενός πίνακα όπου ένα χαρακτηριστικό είναι μέγιστο</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/15427.aspx</link><pubDate>Thu, 03 Aug 2006 12:31:52 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:15427</guid><dc:creator>Paul</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/15427.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=28&amp;PostID=15427</wfw:commentRss><description>&lt;P&gt;Καλημέρα,&lt;/P&gt;
&lt;P&gt;Προσπαθώ να εκτελέσω την εξής επερώτηση:&lt;/P&gt;
&lt;P&gt;select * from table where id = MAX(id) , αλλά εμφανίζεται μήνυμα λάθους. Μπορεί να με βοηθήσει κάποιος; Θέλω να επιλέξω όλα τα στοιχεία της γραμμής του πίνακα, η οποία έχει το μέγιστο id. (το id είναι πεδίο του πίνακα)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Ευχαριστώ πολύ!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description></item></channel></rss>