Оптимизация запросов SQL - PullRequest
0 голосов
/ 16 января 2012

Я создал несколько запросов MSSQL, все они работают хорошо, но я думаю, что это можно сделать быстрее.Можете ли вы помочь мне оптимизировать их?

Это база данных:

Create table Teachers
    (TNO char(3) Primary key,
     TNAME char(20),
     TITLE char(6) check (TITLE in('Prof','PhD','MSc')),
     CITY char(12),
     SUPNO char(3) REFERENCES Teachers);

Create table Students
    (SNO char(3) Primary key,
     SNAME char(20),
     SYEAR int,
     CITY char(20));

Create table Courses
    (CNO char(3) Primary key,
     CNAME char(20),
     STUDYEAR int);

Create table TSC
    (TNO char(3) REFERENCES Teachers,
     SNO char(3) REFERENCES Students,
     CNO char(3) REFERENCES Courses,
     HOURS int,
     GRADE float,
     PRIMARY KEY(TNO,SNO,CNO));

1: В каком учебном году большинство курсов?

Проблема: похоже, чторезультат сортируется, пока мне нужен только элемент max.

select
  top 1 STUDYEAR
from
  Courses
group by
  STUDYEAR
order by COUNT(*) DESC

2: Показать TNO тех учителей, которые НЕ имеют курсов с 1-м учебным годом

Проблема: я используюподзапрос только для отмены запроса на выборку

select
  TNO
from
  Teachers
where
  TNO not in (
    select distinct
      tno
    from
      Courses, TSC
    where tsc.CNO=Courses.CNO and STUDYEAR = 1)

1 Ответ

3 голосов
/ 16 января 2012
  1. Чтобы найти максимальное или минимальное значение, необходимо выполнить некоторое упорядочение;возможно, было бы лучше использовать функции ранжирования вместо группировки по, но я откровенно ожидаю, что анализатор запросов будет достаточно умен, чтобы найти хороший план запроса для этого конкретного запроса.

  2. Подзапрос выполняета также до тех пор, пока он не использует столбцы из внешнего запроса (что может привести к его выполнению для каждой строки во многих случаях).Тем не менее, я бы оставил отчетливое, поскольку это не приносит никакой пользы.Кроме того, я бы всегда использовал явный синтаксис объединения, но это в основном вопрос личных предпочтений (для внутренних объединений - внешние объединения всегда должны выполняться с явным синтаксисом).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...