Advertisement
Guest User

Untitled

a guest
Apr 3rd, 2017
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
T-SQL 2.98 KB | None | 0 0
  1. --------
  2. -- setup (~2 minutes)
  3. --------
  4.  
  5. DROP VIEW IF EXISTS vw_entity_attribute_values_aggregated;
  6. DROP TABLE IF EXISTS entity_attribute_values;
  7. DROP TABLE IF EXISTS #base;
  8. GO
  9.  
  10. CREATE TABLE entity_attribute_values
  11.     (
  12.      entity_id INT NOT NULL
  13.     ,attribute_id INT NOT NULL
  14.     ,value INT NOT NULL
  15.     );
  16. ALTER TABLE entity_attribute_values ADD CONSTRAINT PK_entity_attribute_values PRIMARY KEY (entity_id, attribute_id) WITH (IGNORE_DUP_KEY = ON);
  17.  
  18.  
  19. -- generate random data, using itzik ben gan's generator
  20. WITH    L0
  21.           AS ( SELECT   1 C
  22.                UNION ALL
  23.                SELECT   1
  24.              ), -- 2 rows
  25.         L1
  26.           AS ( SELECT   1 AS C
  27.                FROM     L0 AS A
  28.                CROSS JOIN L0 AS B
  29.              ), -- 4 rows
  30.         L2
  31.           AS ( SELECT   1 AS C
  32.                FROM     L1 AS A
  33.                CROSS JOIN L1 AS B
  34.              ), -- 16 rows
  35.         L3
  36.           AS ( SELECT   1 AS C
  37.                FROM     L2 AS A
  38.                CROSS JOIN L2 AS B
  39.              ), -- 256 rows
  40.         L4
  41.           AS ( SELECT   1 AS C
  42.                FROM     L3 AS A
  43.                CROSS JOIN L3 AS B
  44.              ), -- 65,536 rows
  45.         L5
  46.           AS ( SELECT   1 AS C
  47.                FROM     L4 AS A
  48.                CROSS JOIN L4 AS B
  49.              ), -- 4,294,967,296 rows
  50.         Nums
  51.           AS ( SELECT   ROW_NUMBER() OVER ( ORDER BY ( SELECT   NULL
  52.                                                      ) ) AS N
  53.                FROM     L5
  54.              )
  55.     INSERT  INTO entity_attribute_values
  56.             SELECT TOP 15000000
  57.                     entity_id = ABS(CHECKSUM(NEWID())) % 3000000
  58.                    ,attribute_id = ABS(CHECKSUM(NEWID())) % 10
  59.                    ,value = ABS(CHECKSUM(NEWID())) % 20
  60.             FROM    Nums;
  61. GO
  62.  
  63. CREATE INDEX ix_entity_attribute_values_attribute_id_value ON dbo.entity_attribute_values (attribute_id, value);
  64. GO
  65.  
  66.  
  67. ---------
  68. -- search
  69. ---------
  70.  
  71.  
  72. -- select one entity to search for
  73. DECLARE @entity_id INT;
  74.  
  75. SELECT TOP 1
  76.         @entity_id = eav.entity_id
  77. FROM    dbo.entity_attribute_values AS eav
  78. GROUP BY eav.entity_id
  79. HAVING  COUNT(*) > 3
  80. ORDER BY NEWID();
  81.  
  82.  
  83.  
  84. SELECT  entity_id_for_search_demo = @entity_id;
  85.  
  86.  
  87. DECLARE @search_entity_id INT
  88.    ,@current_count INT;
  89.  
  90. SET @search_entity_id = @entity_id;
  91.  
  92. -- get data of the searched entity
  93. SELECT  entity_id
  94.        ,attribute_id
  95.        ,value
  96. INTO    #base
  97. FROM    entity_attribute_values
  98. WHERE   entity_id = @search_entity_id;
  99.  
  100. SELECT  @current_count = COUNT(*)
  101. FROM    #base;
  102.  
  103.  
  104. --
  105. -- find full matches - this is the query that needs to be tuned
  106. --
  107.  
  108. SELECT  eav.entity_id
  109.        ,count_match_attributes = COUNT(*)
  110. FROM    entity_attribute_values AS eav
  111. INNER JOIN #base AS b
  112.         ON b.attribute_id = eav.attribute_id
  113.            AND b.value = eav.value
  114. WHERE   eav.entity_id <> @search_entity_id
  115. GROUP BY eav.entity_id
  116. HAVING  COUNT(*) = @current_count
  117. ORDER BY eav.entity_id DESC;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement