Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dziwaczny problem z wydajnością:typowe wyrażenia tabelowe w wbudowanej funkcji zdefiniowanej przez użytkownika

Haha, spróbuj tego:

IF OBJECT_ID('_HappyFunction' ) IS NOT NULL DROP FUNCTION _HappyFunction
IF OBJECT_ID('_SadFunction'   ) IS NOT NULL DROP FUNCTION _SadFunction
IF TYPE_ID  ('_UniqueIntTable') IS NOT NULL DROP TYPE _UniqueIntTable
GO

CREATE TYPE _UniqueIntTable AS TABLE (Value int NOT NULL PRIMARY KEY)
GO

CREATE FUNCTION _HappyFunction (@IDs _UniqueIntTable READONLY)
RETURNS TABLE AS RETURN
  SELECT Value FROM @IDs
GO

CREATE FUNCTION _SadFunction (@IDs _UniqueIntTable READONLY)
RETURNS TABLE AS RETURN 
  WITH CTE AS (SELECT Value FROM @IDs)
  SELECT Value FROM CTE
GO

-- this will return an empty record set
DECLARE @IDs _UniqueIntTable 
SELECT * FROM _HappyFunction(@IDs)
GO

-- this will hang
DECLARE @IDs _UniqueIntTable 
SELECT * FROM _SadFunction(@IDs)
GO

Kto by się domyślił?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Poznawanie obciążenia SQL Server

  2. SQL Dostosowane wyszukiwanie ze znakami specjalnymi

  3. Serwer sql używa kolumny obliczeniowej

  4. Zapytanie przy użyciu tabeli pochodnej z ISNUMERIC powoduje niepowodzenie konwersji (varchar na int)

  5. Czy kolumna klucza podstawowego Sequential Guid powinna być indeksem klastrowym?