Почему SQL Server не торопится при использовании переменных?

Я думаю, вам просто нужны фигурные скобки вокруг ВСЕХ ваших утверждений if. Например,

import javax.swing.JOptionPane;

public class Grades
{
public String scoreToGrade( int score )
{
    String grade = "";
    if( score <= 100 )
    {
        if( score >= 90 ){
            grade = "A";
            return grade;
        }
    }
    else if( score <= 89 )
    {
        if( score >= 80 ) {
            grade = "B";
            return grade;
        }

    }
    else if( score <= 79 )
    {
        if( score >= 70 ) {
            grade = "C";
            return grade;
        }
    }
    else if( score <= 69 )
    {
        if( score >= 60 ) {
            grade = "D";
            return grade;
        }
    }
    else if( score <= 59 )
    {
        if( score >= 50 ) {
            grade = "E";
            return grade;
        }
    }
    else if( score <= 49 )
    {
        if( score >= 0 ) {
            grade = "F";
            return grade;
        }
    }
    else
    {
        grade = "Error: score " + score;
    }
    return grade;
}

public static void main( String[] args )
{
    String input = JOptionPane.showInputDialog( "Score: " );
    int score = Integer.parseInt( input );
    Grades t = new Grades();
    String grade = t.scoreToGrade( score );
    JOptionPane.showMessageDialog( null,
        "For " + score + " points, your grade is:  " + grade );
}
}

Может быть, чего-то не хватает, хотя.

18
задан Victor Rodrigues 24 November 2008 в 11:34
поделиться

7 ответов

Это - потому что, когда значения трудно кодируются, это может искать статистика , это имеет на данных в таблице, и выясните лучший запрос для выполнения. Взгляните на планы выполнения каждого из этих запросов. Это должно сканировать когда Ваши переменные использования.

, если диапазон является всегда маленьким, Вы смогли использовать индексную подсказку для помощи этому.

11
ответ дан 30 November 2019 в 07:00
поделиться

Идентификатор в Индексе (например, Первичный ключ)? В противном случае попытайтесь добавить тот.

Другая вещь могла состоять в том, что в первом (быстром) экземпляре запрос становится выполняемым немного по-другому. Наиболее распространенная вещь, которую я видел, происходит, то, что соединения сделаны в неэффективном порядке. Попытайтесь переупорядочить соединения или преобразовать некоторых в подзапросы. Если Вы отправляете больше своего запроса, мы можем помочь далее.

0
ответ дан 30 November 2019 в 07:00
поделиться

Кажется, что этот запрос касается хранимой процедуры, ее план выполнения доберется в скомпилированный первый раз, когда proc выполняется и затем снова используется для последующего выполнения.

Его возможное, что скомпилированный план действительно плох для ситуаций, где firstid действительно близко к продлившемуся, однако его действительно хорошее, когда значения далеко друг от друга.

Попытка, разрешающая опцию WITH RECOMPILE на Вашем сохраненном proc. Если это решит вопрос, и Вы довольны proc быть перекомпилированным каждый раз ее выполняемый (то Вы поразите производительность), оставляют его там. Если Вы все еще недовольны производительностью, рассматривают перепроектирование proc, таким образом, этому не нужна перекомпиляция.

1
ответ дан 30 November 2019 в 07:00
поделиться

Хорошо,

  1. Вы - Оптимизатор, и План запросов является механизмом.
  2. я дам Вам запрос, и необходимо выбрать механизм.
  3. Все книги в библиотеке имеют порядковый номер

, Моим запросом является Движение к библиотеке, и получите меня все книги между 3, и 5

Вы выбрали бы велосипедное право, быстрое, дешевое, эффективное и достаточно большое, чтобы принести 3 книги.

Новый запрос.

Переходят к библиотеке и получают все книги между @x и @y.

Выбор механизм.

Разрешение.

Это - то, что происходит. Вы выбираете самосвал в случае, если я прошу книги между 1 и Maxvalue? Это - излишество если x=3 и y=5. SQL должен выбрать план, прежде чем он будет видеть числа.

24
ответ дан 30 November 2019 в 07:00
поделиться

Забавный то, что этот код будет быстр также:

DECLARE @sql VARCHAR(8000)

SET @sql = 'SELECT * FROM table_x WHERE id BETWEEN ' + CAST(@firstId AS VARCHAR) + ' AND ' + CAST(@lastId AS VARCHAR)

EXEC (@sql)

(MSSQL 2000)

3
ответ дан 30 November 2019 в 07:00
поделиться

Если те переменные являются входными переменными для сохраненного proc, Вы могли бы сталкиваться с проблемой сниффинга параметра. http://omnibuzz-sql.blogspot.com/2006/11/parameter-sniffing-stored-procedures.html

3
ответ дан 30 November 2019 в 07:00
поделиться

На самом деле, на него очень хорошо ответили, я просто напишу здесь обходной путь, поскольку он сработал для меня:

Создайте хранимую процедуру с помощью SQL

WHERE id BETWEEN @firstId and @lastId

Затем вызовите сохраненную процедуру с помощью параметры @firstId и @lastId, и он ускорится. Я до сих пор не на 100%, почему он работает, но он работает.

0
ответ дан 30 November 2019 в 07:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: