2014-10-16 3 views
0

У меня есть SQL Query (проход доступа через запрос), который при запуске блокирует таблицу, и я ничего не могу с ней поделать. Он заперт в течение часа, потому что таблица огромна (база данных составляет 250 гигабайт). SQL выглядит следующим образом, но я надеюсь, что есть способ сделать запрос выбора без блокировки таблицы. .SQL Выберите таблицу блокировки запроса

INSERT INTO BoydAmazonToday1 
         (LocalSKU, [Price Currency], Quantity) 
SELECT  TOP (3000000) Inventory.LocalSKU, Inventory.Price, InventorySuppliers.BoydQuantityAvailable 
FROM   Inventory INNER JOIN 
         InventorySuppliers ON Inventory.LocalSKU = InventorySuppliers.LocalSKU INNER JOIN 
         Suppliers ON InventorySuppliers.SupplierID = Suppliers.SupplierID 
WHERE  (NOT (Inventory.Price = 0)) AND (NOT (Inventory.Price IS NULL)) AND (InventorySuppliers.BoydQuantityAvailable > 49) AND (Inventory.Category LIKE '%Books%' OR 
         Inventory.Category LIKE '%DVDs%' OR 
         Inventory.Category LIKE '%Music%' OR 
         Inventory.Category LIKE '%VHS%') AND (Inventory.Discontinued = 0) AND (Suppliers.[Boyd-AmazonBackOrder] = 1) AND (InventorySuppliers.PrimarySupplier = 1) AND 
         (NOT (Inventory.LocalSKU = '9780205309023u1')) AND 
         (NOT (Inventory.LocalSKU = '9780205309023')) AND 
         (NOT (Inventory.LocalSKU = '9781400052189')) AND 
         (NOT (Inventory.LocalSKU = '9781400052189U1')) AND 
         (NOT (Inventory.LocalSKU = '9781435732865')) AND 
         (NOT (Inventory.LocalSKU = '9781435732865U1')) 
ORDER BY Inventory.Price ASC 
+0

К какому СУБД вы относитесь к этому запросу? Возможно, SQL Server? –

+0

да, он отправляется на сервер MSSQL 2012 –

+0

Мне любопытно, что «TOP 3000000». Это произвольное число? Можно сделать пакетные обновления (скажем, 10000, а затем совершить). Похоже, вы пытаетесь сделать это здесь? –

ответ

0

Вы пытались установить уровень изоляции в транзакции?

http://msdn.microsoft.com/en-us/library/ms173763(v=sql.110).aspx

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 
+0

Я не пробовал это, позвольте мне прочитать его и вернуться к вам. –

+0

Вы также можете рассмотреть возможность размещения целочисленного поля категории в таблице, чтобы вы не использовали поиск строк ('% DVDs%'), если вы можете избежать этого. Вы могли бы добавить его, когда строка вставлена, а затем использовать таблицу поиска для перевода (1 = DVD, 2 = Музыка и т. Д.) – Vinnie

0

Вы также можете попробовать (NOLOCK).

SELECT ... 
FROM Inventory (nolock) 
    INNER JOIN InventorySuppliers (nolock) ON Inventory.LocalSKU = InventorySuppliers.LocalSKU 
    INNER JOIN Suppliers (nolock) ON InventorySuppliers.SupplierID = Suppliers.SupplierID 
+0

Я пробовал nolock, но у меня его там не было. Я использую nolock в других запросах, которые помогают повысить эффективность. –

+0

Тогда я предложил бы вам прочитать это сообщение. http://stackoverflow.com/questions/686724/sql-server-when-should-you-use-with-nolock –

+0

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

0

Я рекомендую использовать NOLOCK или изменить уровень изоляции на READ UNCOMMITTED, если Вы не можете каким-то иным образом гарантировать, что никакие другие процессы не будут пытаться получить доступ к таблице в то время как вы делаете свою работу. Такие операции допускают грязные чтения, которые могут действительно испортить целостность данных (это причина, по которой таблица заблокирована в первую очередь).

Рассмотрите возможность повышения эффективности и своевременности вашего сценария, а не переопределения поведения блокировки таблиц.

Некоторые соображения:

  • Рассмотрим переписывая где положение, чтобы не включать подстановочные знаки в виде %...%. Это может привести к серьезной неэффективности механизма запросов (для справки, google термин «Sargability»).
  • Рассмотрите возможность использования любых индексов, которые находятся на вашем столе, в частности, убедитесь, что вы присоединяетесь к индексированным полям. Если в каком-либо из объединенных полей отсутствуют индексы, рассмотрите добавление индексов.
+0

Nolock, похоже, помог .. Сегодня я создал кучу chagnes. –

+0

Я знаю, что другие процессы будут доступны из таблицы, но не к тому, который будет добавлен. Для этой проблемы грязные чтения будут приоритетом над блокировками, потому что они будут обновляться снова вскоре после. –

+0

Я уверен, что нолок поможет.Просто имейте в виду, что, когда вы используете его, вы пошагаете механизмы, которые SQL Server имеет на месте для сохранения данных. Обычно я рассматриваю использование nolock (или изменение уровня изоляции) для преодоления проблем с производительностью довольно крупного антипаттера, которого следует избегать (риски, как правило, перевешивают преимущества). – Joe

Смежные вопросы