Игнорирование ПУСТОГО параметра в T-SQL

Spark tries to keep things in memory, whereas MapReduce keeps shuffling things in and out of disk. Среднее промежуточное хранилище в основной памяти, где в качестве промежуточного результата в промежуточной памяти используется промежуточное хранилище. MapReduce вставляет барьеры, и требуется много времени, чтобы написать вещи на диск и прочитать их обратно. Следовательно MapReduce может быть медленным и трудоемким. Устранение этого ограничения ускоряет порядок Spark. Для таких вещей, как SQL-движки, такие как Hive, обычно требуется цепочка операций MapReduce, и для этого требуется много операций ввода-вывода. На диск, с диска на диск, с диска. Когда подобные операции запускаются на Spark, Spark может хранить вещи в памяти без ввода-вывода, поэтому вы можете быстро работать с одними и теми же данными. Это приводит к резкому повышению производительности, и это означает, что Spark определенно перемещает нас по крайней мере в интерактивную категорию. Для записи есть некоторые преимущества, которые MapReduce выполняет всю эту запись на диск - так как запись всего на диск позволяет перезапустить после сбоя. Если вы используете многочасовую работу, вы не хотите начинать с нуля. Для приложений на Spark, которые работают в секундах или минутах, перезапуск, очевидно, не является проблемой.

It’s easier to develop for Spark. Spark является гораздо более мощным и выразительным с точки зрения того, как вы даете ему инструкции по сжатию данных. У Spark есть функция Map и Reduce, такая как MapReduce, но она добавляет другие, такие как Filter, Join и Group-by, поэтому ее легче разрабатывать для Spark.

Spark also adds libraries for doing things like machine learning, streaming, graph programming and SQL
24
задан Damien 10 February 2009 в 15:20
поделиться

8 ответов

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

DECLARE @sql nvarchar(4000)
SET @sql = /* core query */

IF @name IS NOT NULL
    SET @sql = @sql + ' AND foo.Name = @name'

IF @dob IS NOT NULL
    SET @sql = @sql + ' AND foo.DOB = @dob'

// etc

EXEC sp_ExecuteSQL @sql, N'@name varchar(100), @dob datetime',
        @name, @dob

и т.д.

Примечание, что sp_ExecuteSQL планы запросов кэшей, таким образом, любые запросы с тем же args могут потенциально снова использовать план.

оборотная сторона - это, если Вы не подписываете SPROC, полномочия ВЫБОРА потребностей вызывающей стороны на таблице (не только ИСПОЛНИТЕЛЬНЫЕ полномочия на SPROC).

21
ответ дан Marc Gravell 28 November 2019 в 23:28
поделиться

Я обработал бы его этот путь.

WHERE Thing = ISNULL(@Thing, Thing)

, Если Вы просто используете параметр в качестве фильтра на, где пункт, это будет работать очень хорошо. Это проигнорирует параметр, если это будет пустым.

12
ответ дан Brendan Enrick 28 November 2019 в 23:28
поделиться

Я обычно использую

WHERE (id = @id OR @id IS NULL)
AND (num = @num OR @num IS NULL)

и т.д.

7
ответ дан atfergs 28 November 2019 в 23:28
поделиться

Техника I’ve, используемый в прошлом для этого сценария, состоит в том, чтобы использовать ОБЪЕДИНИТЬ функцию как часть моего оператора Where. Книги Онлайн обеспечат больше подробно информацию о функции, но here’s отрывок того, как можно использовать его в сценарии, который Вы описали:

create procedure usp_TEST_COALESCE
(
    @parm1 varchar(32) = null,
    @parm2 varchar(32) = null,
    @parm3 int = null
)
AS

SELECT * 
FROM [TableName]
WHERE Field1 = COALESCE(@parm1, Field1)
AND Field2 = COALESCE(@parm2, Field2)
AND Field3 = COALESCE(@parm3, Field3)

ОБЪЕДИНИТЬ функция возвратит первое ненулевое выражение из своих аргументов. В примере выше, если какой-либо из параметров является пустым, ОБЪЕДИНИТЬ функция будет использовать значение в базовом поле.

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

2
ответ дан Tim Lentine 28 November 2019 в 23:28
поделиться

Я не уверен, является ли это 'оптимальный' путь, но это точно, что я делаю в своих хранимых процедурах в тех же целях. Мое инстинктивное чувство состоит в том, что это быстрее, чем динамично созданный запрос просто с точки зрения плана выполнения. Другая опция состоит в том, чтобы создать запрос для каждой комбинации этих "флагов", в которых Вы являетесь передающими, но это действительно не то, что масштабируемо.

1
ответ дан Sean Bright 28 November 2019 в 23:28
поделиться

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

0
ответ дан Karmic Coder 28 November 2019 в 23:28
поделиться

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

, я обычно просто проверяю его как это

ЕСЛИ поле IS NULL

0
ответ дан Josh Mein 28 November 2019 в 23:28
поделиться

Спасибо, это было полезно. Я решил использовать метод SP_EXECUTECL из-за упомянутых потенциальных преимуществ производительности. У меня немного другой, который вы можете найти полезным.

DECLARE @sql nvarchar(4000) 
DECLARE @where nvarchar(1000) =''

SET @sql = 'SELECT * FROM MyTable'

IF @Param1 IS NOT NULL 
    SET @where = @where + ' AND Field1 = @Param1'

IF @Param2 IS NOT NULL 
    SET @where = @where + ' AND Field2 = @Param2' 

IF @Param3 IS NOT NULL 
    SET @where = @where + ' AND Field3 = @Param3' 

-- Add WHERE if where clause exists, 1=1 is included because @where begins with AND
IF @where <> ''
    SET @sql = @sql + ' WHERE 1=1' + @where

--Note that we could also create order parameters and append here
SET @sql = @sql + ' ORDER BY Field1'
0
ответ дан 28 November 2019 в 23:28
поделиться
Другие вопросы по тегам:

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