Добрый день. Допустим есть такой запрос PHP: SELECT TOP (1000) * FROM [table] WHERE [Reader] = '0B70CB43-9EEF-49BB-A567-F0446BF5E793' ORDER BY [Date] DESC Время выполнения этого запроса: PHP: (затронуто строк: 1000) Время работы SQL Server: Время ЦП = 46 мс, затраченное время = 50 мс. Берем тот же запрос, но выберем теперь дону строку: PHP: SELECT TOP (1) * FROM [table] WHERE [Reader] = '0B70CB43-9EEF-49BB-A567-F0446BF5E793' ORDER BY [Date] DESC Время выполнения запроса: PHP: (затронута одна строка) Время работы SQL Server: Время ЦП = 5094 мс, затраченное время = 5110 мс. Почему так? Мне выгодно запросить 1000 строк, и из них выбрать одну в PHP
@ADSoft да MSSQL. Я первую сейчас строку в php забираю, просто было интересно почему он так отрабатывает. А так два рабочих варианта. Или такой sql запрос: PHP: SELECT TOP (1) * FROM( SELECT TOP (1000) * FROM [table] WHERE [Reader] = '0B70CB43-9EEF-49BB-A567-F0446BF5E793' ORDER BY [Date] DESC ) AS tb1 Или в php забрать первую строку, что я сейчас и делаю: PHP: $result = Yii::$app->db->createCommand($sql)->queryOne();
непосредственно в MS SQL сделайте запрос и посмотрите как там.... ну и про explain не забываем .... надеюсь на Reader индекс есть в таблице?
@ADSoft да я там и смотрю. Кста слух, ты же из Татарстана. У вас в городе больные есть? Я сейчас в офисе сижу, у нас один сотрудник контактировал с короновирусным, дома сидит. А официально в городе заболевших нет =) я из НК если что) --- Добавлено --- Вот дамп создания таблицы: PHP: USE [database] GO /****** Object: Table [dbo].[table] Script Date: 06.04.2020 10:40:00 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[table]( [Oid] [uniqueidentifier] ROWGUIDCOL NOT NULL, [Reader] [uniqueidentifier] NULL, [Label] [uniqueidentifier] NULL, [Date] [datetime] NULL, [Status] [int] NULL, [Duration] [int] NULL, [OptimisticLockField] [int] NULL, [GCRecord] [int] NULL, CONSTRAINT [PK_RFIDData] PRIMARY KEY CLUSTERED ( [Oid] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO Вроде все по правилам, в общем ладно. Просто спросил.
индексация спасет мир. в общем мне просто стало интересно, поковырявшись очень частая проблема оказывается. ms как то интересно работает, он начинает шерстить всю базу в поисках, сортировать ее, поиск оптимального пути и после выдачу результата. В общем очень умная вешчь, которая если ей не тыкнуть носом будет умничать. Спасает индекс по нужному полю. цитата с гугла собственно поэтому для него взять ВСЕ быстрее чем отсортировать это ВСЕ и выдать ОДЫН. Простая человеческая логика, человеки же писали ее)))