SQL Server агрегируется для очень больших таблиц

Извинения заранее, но я должен подвергнуть сомнению Вашу цель.

при удалении объекта, никогда не читая его, затем Вы не можете знать, изменил ли другой пользователь объект, промежуточный время, Вы подтвердили, что хотели удалить объект, и фактические удаляют. В "простом SQL", это было бы похоже на выполнение:

DELETE FROM FOO
WHERE ID = 1234

, Конечно, большинство людей на самом деле не делает этого. Вместо этого они делают что-то как:

DELETE FROM FOO
WHERE ID = 1234
  AND NAME = ?ExpectedName AND...

Дело в том, что удаление должно перестать работать (ничего не делают), если другой пользователь изменил запись тем временем.

С этим, лучшим оператором проблемы, существует два возможных решения при использовании Платформы Объекта.

  1. В Вашем Удалять метод, существующий экземпляр, сравнивают математические ожидания свойств и удаляют, если они - то же. В этом случае Платформа Объекта будет заботиться о записи Оператора удаления, который включает значения свойств.

  2. Запись хранимая процедура, которая принимает и IDE и другие значения свойств, и выполняет это.

5
задан C B 17 October 2017 в 17:40
поделиться

4 ответа

I think this is a perfect candidate for an olap cube. I have fact data with 100s of millions of rows. I was doing the kind of queries you described above and queries were coming back in minutes. I moved this into an OLAP cube and queries are now almost instantaneous. There is a bit of a learning curve for olap. I'd strongly suggest you find a tutorial on some simple cube building just to get your head around it. DBA colleagues had been telling me about cubes for years and I never quite got it. Now I don't know why I went so long without it.

In addition to OLAP, you may also want to research indexed views but if you are slicing the data in several ways, that may not be feasible.

4
ответ дан 15 December 2019 в 01:06
поделиться

Without specifics on your table structures and physical environment and (non)clustered indexes etc. the first place I would look for bottlenecks is "Show Execution plan" for the query, also, Database Engine Tuning Advisor and SQL profiler. Hope this helps.

0
ответ дан 15 December 2019 в 01:06
поделиться

Depends on your index and schema

Anyway, your index for this query should be one of

CREATE INDEX IX_foo ON table (shapeID, price, colorID) INCLUDE (brandID, sizeID)
CREATE INDEX IX_foo ON table (shapeID, price, colorID, brandID, sizeID)

However, you added "additional complex where clause here" which mitigates against a good answer

My thinking:

  • The WHERE clause is important because this reduces the row counts
  • The ORDER BY is less important than the aggregate/WHERE
  • Cover the query to remove key lookups

Extra things:

  • The colorID in (1,2,3) is bad because it's an OR
  • Ensure parameter datatypes match column datatypes exactly to avoid implicit conversions
  • You can swap shapeID, Price and colorID around a wee bit to see what's best (or create a few indexes and see which one it uses)
  • DO you have a server bottleneck (eg running on SQL Express etc)?
0
ответ дан 15 December 2019 в 01:06
поделиться

Если вы используете SQL 2008 и используете какую-то конкретную часто используемую фильтрацию, рассмотрите возможность использования отфильтрованных индексов (возможно, в сочетании с индексами INCLUDE, как предлагает gbn).

Допустим, у вас всего пять Значения sizeID. Вы можете разбить ваши текущие индексы на несколько отфильтрованных индексов (например, «WHERE sizeID = 1»).

Использование фильтрации в сочетании с INCLUDE может ускорить возвращение ваших запросов .

Ссылка: Изучение отфильтрованных индексов SQL Server 2008

0
ответ дан 15 December 2019 в 01:06
поделиться